FreeMarker入門

什麼是 FreeMarker?

FreeMarker 是一款模板引擎:即基於模板和數據源生成輸出文本(html網頁,配置文件,電子郵件,源代碼)的通用工具。它是一個 java 類庫,最初被設計用來在MVC模式的Web開發框架中生成HTML頁面,它沒有被綁定到Servlet或HTML或任意Web相關的東西上。也能夠用於非Web應用環境中。html

模板編寫使用FreeMarker Template Language(FTL)。使用方式相似JSP的EL表達式。模板中專一於如何展現數據,模板以外能夠專一於要展現什麼數據。java

 

 

爲何用 FreeMarker?

  1. FreeMarker 基於數據模型和模板來渲染,將業務邏輯和表現層分離。 JSP開發中,頁面會有大量業務邏輯,不利於維護和閱讀,使用FreeMarker能夠避免這一問題。nginx

  2. **有利於分工合做。**HTML設計師能夠關注頁面的設計無需面對頁面的業務邏輯,同時修改頁面代碼也不須要程序員編從新譯代碼。程序員

  3. **提升開發效率。**相對於JSP,FreeMarker不須要每次修改後從新編譯,所以在開發調試中能夠有效節省時間。web

  4. **有利於提升訪問速度。**對於不會頻繁發生變化的頁面,建議使用FreeMarker生成的靜態頁面。而不是每次都要動態生成的JSP頁面。spring

  5. **能夠提升併發量。**例如單臺tomcat容器只支持幾百併發,若是將靜態頁面放到性能更好的nginx服務器上,能夠支持幾萬的併發。數據庫

  6. 靜態頁面對SEO更友好。json

  7. **不佔用JVM的PermGen space。**由於不會被編譯成類,因此不會佔用web服務器永生代的空間,避免OutOfMemoryError:PermGen space的問題。數組

怎麼用 FreeMarker?

在java中使用

@Test public void testFreeMarker() throws Exception { // 把freemarker的jar包添加到工程中 //建立一個Configuration對象 Configuration configuration = new Configuration(Configuration.getVersion()); // 告訴config對象模板文件存放的路徑。 configuration.setDirectoryForTemplateLoading(new File("ftl directory absolute path")); // 設置config的默認字符集。通常是utf-8 configuration.setDefaultEncoding("utf-8"); //從config對象中得到模板對象。須要制定一個模板文件的名字。 Template template = configuration.getTemplate("test.ftl"); //建立模板須要的數據集。能夠是一個map對象也能夠是一個pojo,把模板須要的數據都放入數據集。 Map root = new HashMap<>(); root.put("hello", "hello freemarker"); //建立一個Writer對象,指定生成的文件保存的路徑及文件名。 Writer out = new FileWriter(new File("out html file absolute path")); //調用模板對象的process方法生成靜態文件。須要兩個參數數據集和writer對象。 template.process(root, out); //關閉writer對象。 out.flush(); out.close(); } 複製代碼

模板加載器

固然也能夠不指定絕對路徑,使用模板加載器,FreeMarker提供了模板加載器能夠直接從數據源加載模板。tomcat

  • ClassTemplateLoader:從classpath中加載模板。

  • FileTemplateLoader:在文件系統中從指定文件夾加載模板。

  • StringTemplateLoader:從一個字符串 Map 中加載模板。

  • URLTemplateLoader:從 URL 中加載模板。 你必需要實現 getURL 方法。

  • WebappTemplateLoader:從 servlet 上下文中加載模板。

使用方式:

Configuration configuration = new Configuration(); configuration.setTemplateLoader( new WebappTemplateLoader(servletContext, "WEB-INF/content")); 複製代碼

在項目中使用

在項目中使用的話,能夠直接託管給框架便可。

添加依賴

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.23</version>
</dependency>
複製代碼

配置spring

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="defaultEncoding" value="UTF-8" /> </bean> 複製代碼

而後使用時從FreeMarkerConfigurer拿到Configuration對象:

Configuration configuration = freeMarkerConfigurer.getConfiguration();
複製代碼

FreeMarker 基本語法

簡單類型

使用相似EL表達式。

${hello} 複製代碼

包裝類型

<html>
<head>
	<title>${title}</title> </head> <body> <label>學號:</label>${student.id}<br> <label>姓名:</label>${student.name}<br> </body> </html> 複製代碼

遍歷集合/數組

<#list people as p> ${p.id}/${p.name} </#list> 複製代碼

獲取當前迭代索引

<#list people as p ${p_index} </#list> 複製代碼

添加判斷條件

<#if 條件> <#else> </#if> 複製代碼

日期類型

#默認格式 1:date ${cur_time?date} 2:datetime ${cur_time?datetime} 3:time ${cur_time?time} #自定義格式 ${cur_time?string("yyyy-MM-dd HH:mm:ss")} 複製代碼

處理 null 值

map.put("val",null)

val值爲:${val!} 複製代碼

當val爲空時,顯示爲空字符串,即

val值爲:
複製代碼

也能夠指定值爲空時的默認值。

${val!"默認值"} 複製代碼

也可使用條件語句作非空判斷。

<#if curdate ??> 當前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")} <#else> curdate屬性爲null </#if> 複製代碼

include

能夠引入其餘模板片斷。

<#include "/include/head.ftl"> 複製代碼

json 支持

?eval能夠將字符串轉爲json對象,而後在模板中當包裝類型使用。

<#assign user = userString?eval> User:${user.name} 複製代碼

共享變量

能夠設置自動添加到全部模板的數據,這樣就能夠在全部模板中使用。

configuration.setSharedVariable("share_value_key", "share_value"); 複製代碼

補充

  • 須要使用FreeMarker的頁面在數據庫更新時要及時更新,不然用戶訪問到的會是過時的頁面。

  • FreeMarker數據模型的map的key只能夠是String類型。

相關文章
相關標籤/搜索