freemarker 學習一

來源:互聯網
上載者:User

詳細學習了一下freemarker,發現功能確實挺強大的,做個筆記……

FreeMarker是一個模板引擎,一個基於模板產生文本輸出的通用工具,使用純Java編寫,被設計用來產生HTML Web頁面,特別是基於MVC模式的應用程式,通常由Java程式準備要顯示的資料,由FreeMarker產生頁面,通過模板顯示準備的資料,使用時需要freemarker.jar

一個簡單的樣本:
建立一個普通的java項目,引入freemarker.jar包,在項目目錄下建立模板目錄:templates在templates目錄下,建立1.ftl模板檔案,內容如下:hello,${username}!


public class FreemarkerUtil {public Template getTemplate(String name) {try {// 通過Freemaker的Configuration讀取相應的ftlConfiguration cfg = new Configuration();// 設定去哪裡讀取相應的ftl模板檔案cfg.setDirectoryForTemplateLoading(new File("templates"));// 在模板檔案目錄中找到名稱為name的檔案Template temp = cfg.getTemplate(name);return temp;} catch (IOException e) {e.printStackTrace();}return null;}public void print(String name, Map<String, Object> root) {try {// 通過Template可以將模板檔案輸出到相應的流Template temp = this.getTemplate(name);temp.process(root, new PrintWriter(System.out)); // 輸出到控制台} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void fprint(String name, Map<String, Object> root, String outFile) {Writer out=null;try {// 通過一個檔案輸出資料流,就可以寫到相應的檔案中out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("E:\\eclipse\\freemarker\\WebContent\\" + outFile)),"UTF-8"));// 輸出到檔案中,比如html中Template temp = this.getTemplate(name);temp.setEncoding("utf-8");temp.process(root, out);out.flush();} catch (IOException e) {e.printStackTrace();} catch (TemplateException e) {e.printStackTrace();} finally {try {if (out != null)out.close();} catch (IOException e) {e.printStackTrace();}}}}

調用:

@Testpublic void test01() {//1、建立資料模型  資料模型是雜湊表 Map<String,Object> root = new HashMap<String,Object>();//2、為資料模型添加值root.put("username", "張三");//3、將資料模型和模板組合的資料輸出到控制台fu.print("01.ftl", root);fu.fprint("01.ftl", root, "01.html");}

這樣將產生01.html且有01.ftl的內容hello,張三!  上面看出取值方式和el相似,通過反射擷取bean的值,可以用 “.”,也可以用”[]”

現有一個User類:id,name,age,user為其一對象
1 常用指令:if—else--,  
 <#if user.age lt 12>
${user.name}還是一個小孩
<#elseif user.age lt 18>
${user.name}快成年
<#else>
${user.name}已經成年
</#if>
list遍曆集合
<#list users as user>
${user.id}----${user.name}--${user.age}<br/>
</#list>
include指令
<#include "/inc/top.ftl"/> 直接產生在同一個檔案流中
2  空值處理
${user.id}-------${user.name}------${user.group!}------------
${user.group.name!} <#-- 這種方式加! freemarker僅僅只會判斷group.name是不是空值 -->最好用${(user.group.name)!}
<#-- ${sss} 沒有定義這個變數,會報異常! -->
${sss!} <#--沒有定義這個變數,預設值是Null 字元串! -->
${sss!"abc"} <#--沒有定義這個變數,預設值是字串abc! -->

??運算子返回布爾值,如:variable??,如果變數存在,返回true,否則返回false。
 
3  資料輸出
:
<#assign username="那兒"/> <#--定義變數${username}-->
<#assign num=10> <#--定義一個數字${num+11} -->
<#assign str="10"/>  ${str+11}
<#assign b=true/> 
<#--${b}-->    <#--不能直接輸出數字或字串以外的類型,使用xxx?string可以完成字串轉換,才能輸出 -->
${b?string} <#-- ${b?string}("1","0") -->
${(a.d)???string} <#--??運算子返回布爾值   輸出false-->
${now?string("yyyy-MM-dd HH:mm:ss")}  <#--now 儲存的是Date對象-->
${"hello"+username}<#--${"hello${username}"} 等價-->
<#--string 轉換為data、datatime、time-->
<#assign bir="1979-12-02 12:22:33"?date("yyyy-MM-dd")>
<#assign bir="1979-12-02 12:22:33"?datetime("yyyy-MM-dd HH:mm:ss")>  ${bir}

${"<br/>"?html}
[${"abcde"?left_pad(10,"--")}]
${1.8?int}  freemarker 好多內建函數,可以滿足各種輸出,字串處理等
4 序列和雜湊表
<#assign nums=[1,3,4,56,33,43]/>
${nums?first}
<#assign nums=12..200/><#--定義了一個連續的序列12到199-->

<#--把上面的序列拆分-->
<#assign nums1=nums[1..10]>
<#list nums1 as num>
${num}
</#list>

${"你好,你還在等她嗎,不要這樣了"[0..8]}...<#--可以完成好多css完成的功能-->

<#assign maps={"1":"張三","2":"李四"}>
${maps["1"]}
<#--以下的代碼可以將map的key轉換為相應的序列-->
<#assign keys=maps?keys>
<#list keys as key>
${key}---${maps[key]}

<#assign users={"username":"張三","password":"123"}>
${users.username}---${users["password"]}
5 自訂指令
<#--hello自訂指令,hello後的都是參數(num,ok)-->
<#macro hello num ok>
<#list 1..num as n>
<h1>Hello${ok}${n}</h1>
</#list>
</#macro>

<#--使用指令時參數名不能省略-->
<@hello num=3 ok="World"/>

<#--參數指定初始值,指定初始值的參數要放在未被指定的後面,如省略則使用預設值-->
<#macro repeat num=10 ok="World">
<#list 1..num as n>
<h1>Hello${ok}${n}</h1>
</#list>
</#macro>
<@repeat/> <#--調用-->
<#macro test>
<#--nested會輸出指令中的內容-->
<#nested 12 33/>
<#nested 11 22/>
<#nested 22 33/>
</#macro>

<@test;x,y>
<h1>你好-${x}--${y}</h1>  <#--輸出三次,參數不同<h1>你好-11--22</h1>-->
</@test>
6 變數
資料模型中的變數、模板中的變數、局部變數、迴圈變數
<#assign username="張三"> <#--模板中的變數名稱和模型中的變數名稱一致不是覆蓋,而是隱藏-->
<#--使用.globals可以訪問模型中的變數 ${.globals.username}-->

<#macro test>
<#--調用該指令後,會覆蓋模板中的變數username,所以這種方式存在風險-->
<#--<#assign username="五一"/>-->
<#--使用local可以聲明局部變數,所以在marco中一般用局部變數-->
<#local username="五一"/>
${username}
</#macro>
<@test/>
7 命名空間
<#--
使用include可能會出現覆蓋,可以使用import來完成匯入,並且加入名稱空間
<#include "/inc/inc1.ftl"/>
<#include "/inc/inc2.ftl"/>     -->
<#import "/inc/inc2.ftl" as inc2/>
<#import "/inc/inc1.ftl" as inc1/>
${inc2.username}
${inc1.username}
<#--將一個變數定義到名稱空間中-->
<#assign age=12 in inc2/>
${inc2.age}
<#--訪問名稱空間中的自訂指令-->
<@inc1.test/>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.