1. 程式人生 > >.ftl檔案簡介及語法

.ftl檔案簡介及語法

1、Freemarker模板的檔案字尾名
2、Freemarker其實是一種比較簡單的網頁展示技術,說白了就是網頁模板和資料模型的結合體。這種結合模式的好處就是,分離了網頁介面設計人員和程式設計人員的工作,讓他們各司其職。
據個人理解,Freemarker大致的工作方式是,網頁模板裡面嵌入了資料模型中的資料、Freemarker自定義流程控制語言、Freemarker自定義的操作函式等等,在裝載網頁的時候,Freemarker模板自動從資料模型中提取資料,並解釋整個網頁為我們熟知的HTML頁面。
在B/S程式設計中,常常有美工和程式設計師二個角色,他們具有不同專業技能:美工專注於表現——建立頁面、風格、佈局、效果等等可視元素;而程式設計師則忙於建立程式的商業流程,生成設計頁面要顯示的資料等等。
很多時候,要顯示的資料在設計的時候並不存在,它們一般是在執行時由程式產生的,比如執行“價格不高於800NT的USB Disk”查詢的返回結果。這種技術需求產生了JSP等Scriptlet,JSP十分強大,但是也常常被濫用,並導致一些不良的後果,將邏輯和表現混合在一起。,破壞了美工和程式設計師職責的正常分解使JSP頁面難以閱讀和維護。
模板引擎就是為了解決上面的問題而產生的。在設計HTML的時候,我們加入一些特定指令來指定要插入哪些資料,這些加了特殊指令的HTML或者其他文字,我們稱為模板(Template)。而模板引擎會在輸出頁面時,用適當的資料替代這些程式碼
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的程式設計能力,可以避免混入商業邏輯。
總結
簡單的說,FreeMarker就是一種用Java編寫的模板引擎,它根據模板輸出多種規格的文字。特別指出的是,FreeMarker與Web應用框架無關,它同樣可以應用在非Web應用程式環境中,而且,FreeMarker並不是只能生成HTML頁面,它也可以生成各種文字,如XML/RTF/Java原始碼等。
Freemarker是一個非常優秀的模版引擎,這個模版引擎可用於任何場景,FreeMarker負責將資料模型中的資料合併到模版中,從而生成標準輸出。
FreeMarker特別適應與MVC模式的Web應用,通常有Java程式準備要顯示的資料,由FreeMarker模版引擎來生成頁面,而FreeMarker模版則提供頁面佈局支援,從而能更好地規範MVC架構,保證檢視邏輯和業務邏輯分離。
語法:

直接呼叫後臺方法程式碼
<PRE class=ftl name="code">預設兩種用法   
${!("")}   
${default("")}</PRE>   
<@s.property value="%{getPieceByType(type)}"/>   
getPieceByType為方法名,type為值  

Ftl程式碼預設兩種用法   ${!("")}   ${default("")}  預設兩種用法 
${!("")} 
${default("")} 
<@s.property value="%{getPieceByType(type)}"
/> getPieceByType為方法名,type為值 時間格式化的方法程式碼 最好加上 判斷下c時候存在 <#if c??> ${c.addtime?string("yyyy-MM-dd HH:mm:ss") </#if> 最好加上判斷下c時候存在 <#if c??> ${c.addtime?string("yyyy-MM-dd HH:mm:ss") </#if> 判斷長度並擷取程式碼 <#if c.titleH1??> <#if c.titleH1?length lt 33>
${c.titleH1} action 中 配置 private String inputPath; private HttpServletResponse servletResponse; public void setServletResponse(HttpServletResponse arg0) { this.servletResponse = arg0; } public HttpServletResponse getServletResponse() { return servletResponse; } public String formguideDownloads() throws Exception { formguide.setTemplateId(formguide.getTemplateId()+".jsp"); return SUCCESS; } xml中配置 <action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads"> <result name="success" type="stream"> <param name="contentType">text/plain;charset=utf-8</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${formguide.templateId}"</param> <param name="bufferSize">4096</param> </result> </action> 頁面上 formguide/formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}&inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp" <#else> ${c.titleH1[0..32]}... </#if> </#if> 注意length是從0開始算所以如果想擷取33位就使用0..32就可以了 <#if c.titleH1??> <#if c.titleH1?length lt 33> ${c.titleH1} action 中 配置 private String inputPath; private HttpServletResponse servletResponse; public void setServletResponse(HttpServletResponse arg0) { this.servletResponse = arg0; } public HttpServletResponse getServletResponse() { return servletResponse; } public String formguideDownloads() throws Exception { formguide.setTemplateId(formguide.getTemplateId()+".jsp"); return SUCCESS; } xml中配置 <action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads"> <result name="success" type="stream"> <param name="contentType">text/plain;charset=utf-8</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${formguide.templateId}"</param> <param name="bufferSize">4096</param> </result> </action> 頁面上 formguide/formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}&inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp" <#else> ${c.titleH1[0..32]}... </#if> </#if> 注意length是從0開始算所以如果想擷取33位就使用0..32就可以了 List-map使用程式碼 ftl.list <#list List as list> ${list} </#list> list_index取出行號索引從0開始 formguideList?size 可以判斷list大小 這裡多說一句有很多list中屬性的用法不一一列舉,大家可以查下ftl API ftl.map <#list Map?keys as s> ${Map[s]} </#list> s.list <@s.iterater value="List" var=list> </@s.iterater> s.if <@s.if> </@> <@s.else> </@> ftl.if <#if> <#else> </#if> ftl.list <#list List as list> ${list} </#list> list_index取出行號索引從0開始 formguideList?size 可以判斷list大小 這裡多說一句有很多list中屬性的用法不一一列舉,大家可以查下ftl API ftl.map <#list Map?keys as s> ${Map[s]} </#list> s.list <@s.iterater value="List" var=list> </@s.iterater> s.if <@s.if> </@> <@s.else> </@> ftl.if <#if> <#else> </#if> 上傳程式碼 <form actoin="${path}/piece/findPiece.action" name="form1" method="Post" enctype="multipart/form-data"> <s:file name="sfile"/> </form> 後臺action中配置 File sfile; String sfileName; String sfileType; <form actoin="${path}/piece/findPiece.action" name="form1" method="Post" enctype="multipart/form-data"> <s:file name="sfile"/> </form> 後臺action中配置 File sfile; String sfileName; String sfileType; 下載程式碼 前臺 <a href="${path}/formguide /formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}& amp;inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp"& gt;下載</a> | 後臺 private HttpServletResponse servletResponse; private String inputPath; public void setServletResponse(HttpServletResponse arg0) { this.servletResponse = arg0; } public HttpServletResponse getServletResponse() { return servletResponse; } public String formguideDownloads() throws Exception { formguide.setTemplateId(formguide.getTemplateId()+".jsp"); return SUCCESS; } public InputStream getInputStream() throws Exception { return ServletActionContext.getServletContext().getResourceAsStream( inputPath); } xml <action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads"> <result name="success" type="stream"> <param name="contentType">text/plain;charset=utf-8</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${formguide.templateId}"</param> <param name="bufferSize">4096</param> </result> </action> 前臺 <a href="${path}/formguide /formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}& amp;inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp"& gt;下載</a> | 後臺 private HttpServletResponse servletResponse; private String inputPath; public void setServletResponse(HttpServletResponse arg0) { this.servletResponse = arg0; } public HttpServletResponse getServletResponse() { return servletResponse; } public String formguideDownloads() throws Exception { formguide.setTemplateId(formguide.getTemplateId()+".jsp"); return SUCCESS; } public InputStream getInputStream() throws Exception { return ServletActionContext.getServletContext().getResourceAsStream( inputPath); } xml <action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads"> <result name="success" type="stream"> <param name="contentType">text/plain;charset=utf-8</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${formguide.templateId}"</param> <param name="bufferSize">4096</param> </result> </action> Ftl中的迴圈程式碼 使用巨集標籤來迴圈生成固定的值 其中local中來定義值 repeat用來生成 <#macro repeat count> <#local y = "<img src='http://www.jcauto.com.cn/ProConsole/images/star0506.gif' border='0' alt='' width='11' height='11'/>"> <#list 1..count as x> ${y} ${count}/${x}: <#nested> </#list> </#macro> <@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> 使用巨集標籤來迴圈生成固定的值 其中local中來定義值 repeat用來生成 <#macro repeat count> <#local y = "<img src='http://www.jcauto.com.cn/ProConsole/images/star0506.gif' border='0' alt='' width='11' height='11'/>"> <#list 1..count as x> ${y} ${count}/${x}: <#nested> </#list> </#macro> <@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> Ftl變數轉換程式碼 ?number轉為數字 ?c轉為字串 ?string轉為字串 ?currency(貨幣) ?percent(百分比) trim 刪除字串首尾空格 ${“ String ”?trim} 結果為String split使用指定的分隔符將一個字串拆分為一組字串 <#list “This|is|split”?split(“|”) as s> ${s} </#list> ${“strabg”?replace(“ab”,”in”)} 結果為string ${“string”?contains(“ing”)?string} 結果為true 注意:布林值必須轉換為字串才能輸出 ${“string”?index_of(“in”) 結果為3 ${“string”?index_of(“ab”) 結果為-1 length返回字串的長度 ${“string”?length}結果為6 lower_case將字串轉為小寫 ${“STRING”?lower_case}à結果為string upper_case將字串轉為大寫 ${“string”?upper_case}à結果為STRING ends_with 判斷某個字串是否由某個子串結尾,返回布林值。 ${“string”?ends_with(“ing”)?string} 返回結果為true 注意:布林值必須轉換為字串才能輸出 html 用於將字串中的<、>、&和“替換為對應得&lt;&gt;&quot:&amp index_of(substring,start)在字串中查詢某個子串,返回找到子串的第一個字元的索引,如果沒有找到子串,則返回-1。 Start引數用於指定從字串的那個索引處開始搜尋,start為數字值。 如果start大於字串長度,則start取值等於字串長度,如果start小於0, 則start取值為 ${‘str’?substring(0)}à結果為str ${‘str’?substring(0,1)}à結果為s 2.cap_first 將字串中的第一個單詞的首字母變為大寫。 ${‘str’?cap_first}à結果為Str 3.uncap_first將字串中的第一個單詞的首字母變為小寫。 ${‘Str’?cap_first}à結果為str 4.capitalize將字串中的所有單詞的首字母變為大寫 ${‘str’? capitalize}à結果為STR date,time,datetime將字串轉換為日期 例如: <#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)> <#assign date2=”9:28:20”?time(“HH:mm:ss”)> <#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)> ${date1}à結果為2009-10-12 ${date2}à結果為9:28:20 ${date3}à結果為2009-10-12 9:28:20 ?number轉為數字 ?c轉為字串 ?string轉為字串 ?currency(貨幣) ?percent(百分比) trim 刪除字串首尾空格 ${“ String ”?trim} 結果為String split使用指定的分隔符將一個字串拆分為一組字串 <#list “This|is|split”?split(“|”) as s> ${s} </#list> ${“strabg”?replace(“ab”,”in”)} 結果為string ${“string”?contains(“ing”)?string} 結果為true 注意:布林值必須轉換為字串才能輸出 ${“string”?index_of(“in”) 結果為3 ${“string”?index_of(“ab”) 結果為-1 length返回字串的長度 ${“string”?length}結果為6 lower_case將字串轉為小寫 ${“STRING”?lower_case}à結果為string upper_case將字串轉為大寫 ${“string”?upper_case}à結果為STRING ends_with 判斷某個字串是否由某個子串結尾,返回布林值。 ${“string”?ends_with(“ing”)?string} 返回結果為true 注意:布林值必須轉換為字串才能輸出 html 用於將字串中的<、>、&和“替換為對應得&lt;&gt;&quot:&amp index_of(substring,start)在字串中查詢某個子串,返回找到子串的第一個字元的索引,如果沒有找到子串,則返回-1。 Start引數用於指定從字串的那個索引處開始搜尋,start為數字值。 如果start大於字串長度,則start取值等於字串長度,如果start小於0, 則start取值為 ${‘str’?substring(0)}à結果為str ${‘str’?substring(0,1)}à結果為s 2.cap_first 將字串中的第一個單詞的首字母變為大寫。 ${‘str’?cap_first}à結果為Str 3.uncap_first將字串中的第一個單詞的首字母變為小寫。 ${‘Str’?cap_first}à結果為str 4.capitalize將字串中的所有單詞的首字母變為大寫 ${‘str’? capitalize}à結果為STR date,time,datetime將字串轉換為日期 例如: <#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)> <#assign date2=”9:28:20”?time(“HH:mm:ss”)> <#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)> ${date1}à結果為2009-10-12 ${date2}à結果為9:28:20 ${date3}à結果為2009-10-12 9:28:20 巨集定義hash內建函式程式碼 Hash的內建函式 1.hash?keys 返回hash裡的所有key,返回結果為sequence 2.hash?values 返回hash裡的所有value,返回結果為sequence 例如: <#assign user={“name”:“hailang”, “sex”:“man”}> <#assign keys=user?keys> <#list keys as key> ${key}=${user[key]} </#list> Hash的內建函式 1. hash?keys 返回hash裡的所有key,返回結果為sequence 2.hash?values 返回hash裡的所有value,返回結果為sequence 例如: <#assign user={“name”:“hailang”, “sex”:“man”}> <#assign keys=user?keys> <#list keys as key> ${key}=${user[key]} </#list>