.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 用於將字串中的<、>、&和“替換為對應得<>":&
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 用於將字串中的<、>、&和“替換為對應得<>":&
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>