Spring mvc整合freemarker詳解
1.什麼是FreeMarker
FreeMarker是一個模板引擎,一個基於模板生成文字輸出的通用工具,使用純Java編寫 FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程式 雖然FreeMarker具有一些程式設計的能力,但通常由Java程式準備要顯示的資料,由FreeMarker生成頁面,通過模板顯示準備的資料(如下圖)
2.FreeMarker特性
能夠生成各種文字:HTML、XML、RTF、Java原始碼等等 易於嵌入到你的產品中:輕量級;不需要Servlet環境 外掛式模板載入器:可以從任何源載入模板,如本地檔案、資料庫等等 你可以按你所需生成文字:儲存到本地檔案;作為Email傳送;從Web應用程式傳送它返回給Web瀏覽器
3. springMVC整合Freemarker
1.新增jar包 新增freemarker的jar,還需要額外新增spring-content-support的jar包,不然會報錯。
2.然後再Spring的配置檔案中新增對freemarker的配置
<!-- 配置freeMarker的模板路徑 --> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="WEB-INF/ftl/" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <!-- freemarker檢視解析器 --> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="suffix" value=".html" /> <property name="contentType" value="text/html;charset=UTF-8" /> <!-- 此變數值為pageContext.request, 頁面使用方法:rc.contextPath --> <property name="requestContextAttribute" value="rc" /> </bean>
3.寫一個User類:
package com.my.springmvc.bean; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
4.一個FreeMarkerController類:
@Controller
@RequestMapping("/home")
public class FreeMarkerController {
@RequestMapping("/index")
public ModelAndView Add(HttpServletRequest request,HttpServletResponse response){
User user = new User();
user.setUsername("sg");
user.setPassword("1234");
List<User> users = new ArrayList<User>();
users.add(user);
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
mv.addObject("users",users);
return mv;
}
}
5.然後再WEB-INF/ftl目錄下建立一個index.html檔案:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>another</title>
</head>
<body>
<#list users as user>
username : ${user.username}<br/>
password : ${user.password}
</#list>
</body>
</html>
結果:
4.freemarker語法介紹:
1. FreeMarker模板檔案主要由如下4個部分組成 文字:直接輸出的部分 註釋:<#– … –> 格式部分,不會輸出 插值:即 ${…} 或 #{…} 格式的部分,將使用資料模型中的部分替代輸出 指令:FreeMarker 指定,和 HTML 標記類似,名字前加 # 予以區分,不會輸出
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<#-- 註釋部分 -->
<#-- 下面使用插值 -->
<h1>Welcome ${username} !</h1>
<p>We have these animals:</p>
<u1>
<!-- 使用FTL指令 -->
<#list animals as animal>
<li>${animal.name} for ${animal.price} Euros</li>
</#list>
</u1>
</body>
</html>
2.控制語句
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
3判斷變數是否存在
<#if readonly??></#if>
4.防止空指標報錯 變數名後用 ! 加預設值:${foo!”Default”},如果 foo 為 null 則輸出 Default 5.普通的變數 這是最簡單的情況,直接變數名稱,如{name}
需要注意的是有的變數是需要轉義的如雙引號 6…遍歷List集合
<#list ["克里斯埃文斯", "斯嘉麗約翰遜", "小羅伯特唐尼"] as x>
${x}
</#list>
此外,迭代集合物件時,還包含兩個特殊的迴圈變數: item_index:當前變數的索引值 item_has_next:是否存在下一個物件 也可以使用<#break>指令跳出迭代 7.運算子 FreeMarker表示式中完全支援算術運算,FreeMarker支援的算術運算子包括:+, - , * , / , % 比較運算子
表示式中支援的比較運算子有如下幾個: 1,=或者==:判斷兩個值是否相等. 2,!=:判斷兩個值是否不等. 3,>或者gt:判斷左邊值是否大於右邊值 4,>=或者gte:判斷左邊值是否大於等於右邊值 5,<或者lt:判斷左邊值是否小於右邊值 6,<=或者lte:判斷左邊值是否小於等於右邊值
注意:=和!=可以用於字串,數值和日期來比較是否相等,但=和!=兩邊必須是相同型別的值,否則會產生錯誤,而且FreeMarker是精確比較,”x”,”x “,”X”是不等的.其它的執行符可以作用於數字和日期,但不能作用於字串,大部分的時候,使用gt等字母運算子代替>會有更好的效果,因為FreeMarker會把>解釋成FTL標籤的結束字元,當然,也可以使用括號來避免這種情況,如:<#if (x>y)>
邏輯運算子
和普通程式一樣,freemarker也有&&,|| ,!三種 8.變數的宣告
<#assign num=0/>
9.include指令 include指令的作用類似於JSP的包含指令,用於包含指定頁.include指令的語法格式如下: <#include filename [options]> 在上面的語法格式中,兩個引數的解釋如下: filename:該引數指定被包含的模板檔案 options:該引數可以省略,指定包含時的選項,包含encoding和parse兩個選項,其中encoding指定包含頁面時所用的解碼集,而parse指定被包含檔案是否作為FTL檔案來解析,如果省略了parse選項值,則該選項預設是true. 10.import指令 該指令用於匯入FreeMarker模板中的所有變數,並將該變數放置在指定的Map物件中,import指令的語法格式如下: <#import “/lib/common.ftl” as com> 上面的程式碼將匯入/lib/common.ftl模板檔案中的所有變數,交將這些變數放置在一個名為com的Map物件中. 11 macro的使用 這個可以用來實現自定義指令,一般用來做公共元件,例如分頁條 最後說下list中含有map的遍歷,這種情況可以使用點語法或方括號語法.假如有下面的資料模型: Map root = new HashMap(); Book book = new Book(); Author author = new Author(); author.setName(“annlee”); author.setAddress(“gz”); book.setName(“struts2”); book.setAuthor(author); root.put(“info”,”struts”); root.put(“book”, book);