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("&","&")/>
${title}的值為111<111>111&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")}正常 反之一樣