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> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

結果:

這里寫圖片描述

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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.控制語句

<#if condition> ... <#elseif condition2> ... <#elseif condition3> ... <#else> <#switch value> <#case refValue1> ... <#break> <#case refValue2> ... <#break> <#case refValueN> ... <#break> <#default> ... </#switch>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3判斷變量是否存在

<#if readonly??></#if>
  • 1

4.防止空指針報錯

變量名后用 ! 加默認值:${foo!”Default”},如果 foo 為 null 則輸出 Default

5.普通的變量

這是最簡單的情況,直接變量名稱,如{name}

需要注意的是有的變量是需要轉義的如雙引號

6..遍歷List集合

<#list ["克里斯埃文斯", "斯嘉麗約翰遜", "小羅伯特唐尼"] as x> ${x} </#list> 
  • 1
  • 2
  • 3
  • 4

此外,迭代集合對象時,還包含兩個特殊的循環變量: 
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);

為了訪問數據模型中名為struts2的書的作者的名字,可以使用如下語法: 
book.author.name //全部使用點語法 
book[“author”].name 
book.author[“name”] //混合使用點語法和方括號語法 
book[“author”][“name”] //全部使用方括號語法

參考: 
http://blog.csdn.net/walkcode/article/details/26393211 
http://blog.csdn.net/win_man/article/details/51317957 
http://rongjih.blog.163.com/blog/static/3357446120127632757911/ 
http://qtdebug.com/spring-web/11.%20Freemarker%20%E8%AF%AD%E6%B3%95%E7%AE%80%E4%BB%8B.html 
http://blog.csdn.net/walkcode/article/details/26393211 
http://blog.csdn.net/shimiso/article/details/8778793


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM