Freemarker模板引擎
1:技術概述
1.1模板引擎技術
Freemarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫,具有以下特點:
(1)Freemarker 適合被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程序。
(2)雖然Freemarker 具有一些編程的能力,但通常由Java程序準備要顯示的數據,由Freemarker 生成頁面,通過模板顯示準備的數據 。
(3)Freemarker 不是一個Web應用框架,而適合作爲Web應用框架一個組件。
(4)Freemarker 與容器無關,因爲它並不知道HTTP或Servlet。
(5)Freemarker 更適合作爲Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標記庫。
(6)Freemarker 是免費的 。
下載地址:
https://sourceforge.net/projects/freemarker-ide/files/freemarker-ide/
下載freemarker-ide-0.9.14.zip (909.6 kB)
2:爲什麼要使用freemarker
在互聯網軟件內容網站中 一般首頁的訪問量大,爲了提供首頁的訪問效率,一般 首頁的內容以及其中的新聞等信息都可以實現html靜態化 瀏覽器訪問時 設置瀏覽器的緩存策略和生成靜態頁面的週期一致 可以使訪問效率大大提升 同時配合cdn處理圖片 js css等資源 可以在首頁訪問時 理論完全脫離數據庫 降低應用壓力
2:Freemarker安裝
將freemarker的jar加入項目,下載freemarker的插件,找到它的plugins目錄,將該目錄下的文件拷貝到eclipse的plugins目錄下,重啓eclipse,新建個ftl文件,該文件中的內容顯示爲不同的顏色,可以視爲插件安裝成功。
例:
3:基本語法
1:FreeMarker標記
FreeMarker標記的設計非常精煉,只有三種:
1) $ : ${expression} FreeMarker會在輸出時用實際值進行替代
例如:${stockNum?default(‘’)}
2) # :標準的FTL標記。大部分FreeMarker指令都以#開始,可以明顯地與html標記區分,
<#if user = "BigJoe">our beloved leader</#if>。
同時,FTL文件的註釋包含在<#--和-->(而不是<!--和-->)之間
3) @作爲用戶定義指令使用宏變量時,使用@替代FTL標記中的#。後面將詳細介紹宏
2:標準的FTL標記指令
1) if, else, elseif語法
<#if 條件1>內容或邏輯
<#elseif 條件2>內容或邏輯
<#elseif 條件3>內容或邏輯
<#else>內容或邏輯
</#if>
2) switch, case, default, break
3) list, break語法(循環)
<#list 集合或數組 as 臨時變量>
<#if item="spring"><#break></#if>...
</#list>
關鍵字:臨時變量_index:是list當前值的下標
臨時變量_has_next:判斷list是否還有值
4) include語法(包含)
<#include “filename”>
or<#include “filename” options>
options包含兩個屬性encoding=”GBK” 編碼格式parse=true 是否作爲ftl語法解析,默認是true,false就是以文本方式引入.注意在ftl文件里布爾值都是直接賦值的如parse=true,而不是parse=”true”
需要注意的是,沒有結束標籤。
5) Import與include
如果在兩個模板中都分別存在變量名相同的變量,include會包含進來,當同時使用這兩個變量時,後一個變量會覆蓋前一個變量的值,爲了防止,可以使用import進行導入,
Import的使用方式:
<#import “模板路徑” as 別名>
通過別名可以獲取模板中的變量值,可以防止變量覆蓋
6) assign生成變量,並且給變量賦值
常見的語法形式:
<#assign name=value>
Or
<#assign name1=value1 name2=value2 ...nameN=valueN>
Or
<#assign name> capture this</#assign>
Or
<#assign name in namespacehash>
capture this
</#assign>
需要注意的是,如果<#assign></#assign>之間沒有內容,則jvm會報錯,所以,當它們之間沒有內容時,去掉</#assign>
macro,宏指令(特有的),可以理解爲java中的方法
定義如下:mymacro是宏的別名,p1 p2是參數,中間是邏輯
調用<@宏名 參數1 參數2>
例:
<#macro mymacro p1 p2>
輸出的結果是 :${p1+p2}
</#macro>
<@mymacro p1=10 p2=200/>
Nested:代替調用宏指令時標籤對之間包裹的內容,使用如下
4:在javase中的使用:
例:
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration();
//配置ftl查找目錄
cfg.setDirectoryForTemplateLoading(
new File("template"));
//設置數據的抓取模式
cfg.setObjectWrapper(new DefaultObjectWrapper());
//構建數據
Map root = new HashMap();
root.put("user", "Big Joe");
Map latest = new HashMap();
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
root.put("latestProduct", latest);
root.put("sex", "1");
//添加個數組
String[] str=new String[]{"1","2","3","4"};
root.put("array", str);
//添加個對象
List list=new ArrayList<>();
User user=new User();
user.setId("1");
user.setName("zs");
list.add(user);
User user1=new User();
user1.setId("1");
user1.setName("zs");
list.add(user1);
root.put("list", list);
//實例化模板對象
Template temp = cfg.getTemplate("helloFreeMark.ftl");
//生成html,輸出到目標
FileOutputStream fos=new FileOutputStream("E:\\框架\\freemarker框架\\html\\freemark.html");
Writer out = new OutputStreamWriter(fos);
//Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
}
在ftl文件中的應用,例:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
<#--FTL中的if else指令的用法 -->
性別爲
<#if sex="1">男
<#else>女
</#if>
<#--FTL中的循環 -->
用戶信息爲
<#list list as tem>
${tem.id}-----${tem.name}
</#list>
<#list array as arrTmp>
<#if arrTmp_index%2==0>
<font color=green>${arrTmp}__${arrTmp_index}</font>
<#else>
<font color=red>${arrTmp}__${arrTmp_index}</font>
</#if>
</#list>
</body>
</html>
5:在javaee中的舉例:
和javase差不多,只是需要在web.xml中配置一些格式:
例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>freemarker_web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!-- 模板的查找路徑 -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<!--是否需要緩存-->
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<!--最終顯示是html格式-->
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
<!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
</init-param>
<!--編碼格式-->
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--數字格式-->
<init-param>
<param-name>number_format</param-name>
<param-value>0.##</param-value>
</init-param>
<!--SERVLET 容器啓動時實例化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>