freemarker模板引擎 常用標簽


 freemarker資料!

        http://freemarker.org/index.html

  freemarker正常生成HTML的模板引擎,公司需求將書籍來源的數據發放到不同的渠道,每個渠道生成特定的模板,這樣數據自動生成相應的格式,主要是生成xml格式,所以根據網上的Demo改成了對應項目測試的Demo.--------------------此為背景。

正常的模板文件.flt的,但是發現改成.xml格式的也完全沒有問題,我表示非常高興,哇卡卡卡~

網上有很多標簽大全,我就撿我用過的標簽寫:(不斷的補充ing。。。)

 1.<#if></#if>

   <#elseif> 跟java的if else一個意思,后面加表達式, if 和elseif 最后公用一個</#if>結束標簽。

    freemarker對於null值要求非常嚴格,會報錯,所以所有值必須加判斷是否存在<#if (metadata.EISBN)!""> 我是這么用的,還有別的方法  回頭把標簽大全粘過來~~~

 2.<#list></#list>

    循環這個標簽非常好用,<#list Onix as metadata> 

    item_index:當前變量的索引值 
    item_has_next:是否存在下一個對象 其中item名稱為as后的變量名,如stu 

 3.<#assign/>

    <#assign s="sss"/>這是正常聲明一個字符串

    <#assign l=0..100/>這是聲明一個int區間的集合

  <#assign s=audience.audienceValue/>這是取root里面的值

 4.${exp}插值,里面直接放表達式

     ${.now?string("yyyyMMdd")} 這是新加的標簽,表示當前時間,后面可以生成不同格式的。

 5.字符串處理(跟java的都一樣)

    ?split("-")根據"-"將字符串分成list

    ?index_of("-")判斷是否存在字符串"-",存在返回下表,不存在返回-1

 6.<#--> </#-->注釋標簽

目前就用了這么多標簽就搞定了

 

 

如果要輸出一個集合,那么就必須先了解freemarker中的循環、判斷等流程語法

if判斷流程語法

基本語法

<#if boolean></#if>

或者<#if boolean><#else></#if>

或者<#if boolean>

<#if boolean></#if>

</#if>

或者<#if boolean><#elseif boolean></#if>

其中第三種你應該這么理解,先去除最后的</#if>那只看前面的,就是這個邏輯,如果怎么樣,否則如果怎么樣,最后的</#if>你可以理解成僅僅是一個結束的標志,沒有任何邏輯含義。

比如

<#if product.id<10>-------------如果id小於10

該產品ID<10

<#elseif product.id==12>--------否則如果id等於12

該產品ID==12

</#if>----------------------------結束標志

Eg:將上面的例子修改下

<#if product.id<10>-------------如果id小於10

該產品ID<10

<#elseif product.id==1>--------否則如果id等於1

該產品ID==12

</#if>----------------------------結束標志

大家覺得邏輯對嗎?如果id小於10,否則id等於1,邏輯不對。

那我想實現判斷的嵌套呢?也很簡單,如下

<#if product.id<10>

該產品ID<10

<#if product.id==1>

該產品ID==1

</#if>

</#if>

那么支持boolean的比較運算符有哪些呢?

比較預算符有

a、=(或者==):判斷兩個值是否相等.
b、!=:判斷兩個值是否不相等
c、 >(或者gt):判斷坐標值是否大於右邊值
d、 >=(或者gte):判斷坐標值是否大於等於右邊值
e、 <(或者lt):判斷左邊值是否小於右邊值
f、 <=(或者lte):判斷左邊值是否小於等於右邊值        

剛才我們說的if else邏輯的布爾值都是比較預算符結果,還有多個條件的邏輯預算符呢?先來看看邏輯預算符有哪些吧。邏輯預算符有&&(與)、||(或)、!(非)

通過一個例子來看看

<#if product.id<10&& !product.name ??>

該產品ID<10,且產品名(${product.name})為空

</#if>

第一點,我們需要看的是&&,沒有難度吧,就是兩個條件均為true才執行

第二點,需要說明的是??,這里就牽扯掉有一個特殊的問題,就是在freemarker中,如何判斷一個字符串為空呢?方法就是用??(?if_exists,?exists) 如果不為空返回true,否則返回false 

第三點,需要看的是!,這點也沒有疑問吧,取反,邏輯預算符

邏輯運算符有三個,我們演示了兩個了,剩下一個或也很簡單。


xml文檔轉義字符

<#assign title="111<111>111&1111"?xhtml?replace("&","&amp;")/>

${title}的值為111&lt;111&gt;111&amp;1111   

OK~


 

在內部,模板中可用的變量都是實現了freemarker.template.TemplateModel接口的Java對象。但在你自己的數據模型中,可以使用基本的Java集合類作為變量,因為這些變量會在內部被替換為適當的TemplateModel類型。這種功能特性被稱作是object wrapping對象包裝。對象包裝功能可以透明地把任何類型的對象轉換為實現了TemplateModel接口類型的實例。這就使得下面的轉換成為可能,如在模板中把java.sql.ResultSet轉換為序列變量,把javax.servlet.ServletRequest對象轉換成包含請求屬性的哈希表變量,甚至可以遍歷XML文檔作為FTL變量。

 模板實現時會將非TemplateModel對象替換為TemplateModel對象。通過ObjectWrapper實現類的 的   TemplateModeal wrap(java.lang.Object)方法實現。

 ObjectWrapper.DEFAULT_WRAPPER:它使用SimpleScalar來替換String,SimpleNumber來替換Number,SimpleSequence來替換List和數組,SimpleHash來替換Map,TemplateBooleanModel.TRUE或TemplateBooleanModel.FALSE來替換Boolean,freemarker.ext.dom.NodeModel來替換W3C組織定義的DOM模型節點類型。對於Jython類型的對象,包裝器會調用freemarker.ext.jython.JythonWrapper。而對於其他對象,則會調用BEAN_WRAPPER。

 ObjectWrapper.BEANS_WRAPPER:它可以通過Java 的反射機制來獲取到Java Bean的屬性和其他任意對象類型的成員變量。

 

 

freemarker.template.TemplateException: Expected hash. mainKey evaluated instead to freemarker.template.SimpleScalar on line 32, column 19 in evertrip/diyquote/test.ftl.
報這個錯 說明數據轉換有問題 不能轉換成freemarker認可的格式

model.addAttribute("endtime", time);time為Date類型 flt中 ${begintime?string("yyyy-MM-dd")}就會報錯  ${begintime?date("yyyy-MM-dd")}正常  反之一樣

 

 

 

 

 


免責聲明!

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



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