Freemarker模板引擎技術

Freemarker模板引擎

1:技術概述

1.1模板引擎技術

Freemarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫,具有以下特點:

1Freemarker 適合被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程序。

2)雖然Freemarker 具有一些編程的能力,但通常由Java程序準備要顯示的數據,由Freemarker 生成頁面,通過模板顯示準備的數據 。

3Freemarker 不是一個Web應用框架,而適合作爲Web應用框架一個組件。

4Freemarker 與容器無關,因爲它並不知道HTTPServlet

5Freemarker 更適合作爲Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標記庫。

6Freemarker 是免費的 。

下載地址:

https://sourceforge.net/projects/freemarker-ide/files/freemarker-ide/

 下載freemarker-ide-0.9.14.zip (909.6 kB)

 

2:爲什麼要使用freemarker

在互聯網軟件內容網站中 一般首頁的訪問量大,爲了提供首頁的訪問效率,一般 首頁的內容以及其中的新聞等信息都可以實現html靜態化 瀏覽器訪問時 設置瀏覽器的緩存策略和生成靜態頁面的週期一致 可以使訪問效率大大提升 同時配合cdn處理圖片 js css等資源 可以在首頁訪問時 理論完全脫離數據庫  降低應用壓力

2Freemarker安裝

freemarkerjar加入項目,下載freemarker的插件,找到它的plugins目錄,將該目錄下的文件拷貝到eclipseplugins目錄下,重啓eclipse,新建個ftl文件,該文件中的內容顯示爲不同的顏色,可以視爲插件安裝成功。

例:

 

 

3:基本語法

1FreeMarker標記

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語法解析,默認是truefalse就是以文本方式引入.注意在ftl文件里布爾值都是直接賦值的如parse=true,而不是parse=true

需要注意的是,沒有結束標籤。

5) Importinclude

如果在兩個模板中都分別存在變量名相同的變量,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>

7) macro, nested, return

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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章