日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

freemarker模板引擎 常用标签

發布時間:2024/1/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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")}正常 ?反之一樣

?

?

?

?

?

轉載于:https://www.cnblogs.com/joycelishanhe/p/3731688.html

總結

以上是生活随笔為你收集整理的freemarker模板引擎 常用标签的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。