Freemarker第一次實際專案使用遇到的一些問題
阿新 • • 發佈:2018-12-24
在最近專案中第一次使用Freemarker生成JSP網頁,用此文章記錄下Freemarker的一些常用方法。
轉義符
轉義符是我使用Freemarker遇到的第一個坑,由於不熟悉Freemarker對自身特殊關鍵字的處理,導致無法正常生成jsp網頁。
在jsp中,我們經常在頭部用java定義一些變數,然後在jsp頁面中直接使用,如下所示,這樣可以動態獲取網站的css樣式。
<%String ctx = request.getContextPath();
request.setAttribute("ctx",ctx);
%>
<link href="${ctx}/base/css/common.css" rel="stylesheet" type="text/css">
但如果把上面的程式碼直接拷貝到freemarker的ftl模板中,會報錯。因為
如果希望正確生成上面的jsp程式碼,可以在模板檔案中用以下寫法。
<link href="${r'${ctx}'}/base/css/common.css" rel="stylesheet" type="text/css" />
在前臺判斷後臺List物件是否空
Freemarker如果後臺定義的物件為空,也會導致報錯無法生成模板。這時需要使用以下語法。
<#if 物件名??>
</#if>
具體案例程式碼如下:
<#if emergencyNavLevel??>
<#list emergencyNavLevel as emergency>
<a href="javascript:void(0)" onclick="tabSearch('EMERGENCY','${emergency}');">${emergency} </a>
</#list>
</#if>
還有以下情況,物件user,name為user的屬性的情況,user,name都有可能為空,那麼可以寫成${(user.name)!”},表示user或者name為null,都顯示為空。判斷為空。程式碼如下:
<#if (user.name)??>
……
</#if>
前臺迴圈輸出後臺List物件
無論structs的標籤還是jstl的標籤,前臺經常需要把後臺的List物件迴圈輸出,Freemarker也提供了自己的標籤在前臺迴圈輸出後臺的定義的List物件。
例如:在後臺定義了
private List<SysBusiListField> queryList;
public List<SysBusiListField> getQueryList() {
return queryList;
}
public void setQueryList(List<SysBusiListField> queryList) {
this.queryList = queryList;
}
Freemarker在ftl模板中輸出語法為
<#list queryList as query>
</#list>
if else語法如下所示
<#if>
<#if>
<#elseif>
<#elseif>
<#else>
</#if>
if else也可以用於多層巢狀,具體案例中程式碼如下
<#list queryList as query>
<#if query.tdAlign==0>
<h:column <#if query.tdWidth == 0><#else>width="${query.tdWidth}"</#if> align="left" <#if query.tdValue="checkbox">headerTitle="<input type='checkbox' name='slectAll' value='checkbox' onclick='selectAll(this.checked);'>"<#else>headerTitle="${query.thCaption}"</#if> >
</#if>
<#if query.tdAlign==1>
<h:column <#if query.tdWidth == 0><#else>width="${query.tdWidth}"</#if> align="center" <#if query.tdValue="checkbox">headerTitle="<input type='checkbox' name='slectAll' value='checkbox' onclick='selectAll(this.checked);'>"<#else>headerTitle="${query.thCaption}"</#if>>
</#if>
<#if query.tdAlign==2>
<h:column <#if query.tdWidth == 0><#else>width="${query.tdWidth}"</#if> align="right" <#if query.tdValue="checkbox">headerTitle="<input type='checkbox' name='slectAll' value='checkbox' onclick='selectAll(this.checked);'>"<#else>headerTitle="${query.thCaption}"</#if>>
</#if>
<#if query.tdValue=='checkbox'><!-- selectbox -->
<input type="checkbox" name="selectedRow" value="<s:property value="id"/>" />
</#if>
<#if query.tdValue=='sequence'><!-- selectbox -->
<%=(currentPageNo-1)*pageSize+count-1%>
</#if>
<#if query.tdValue != 'status'>
<#if query.tdValue == 'createTime'>
<a target="blank" href="<s:property value="itemUrl" />" >
<s:date name="createTime" format="yyyy-MM-dd HH:mm:ss"/>
</a>
<#elseif query.tdValue == 'flContent'>
<s:if test='flContent == "1"'>
待聯合審批
</s:if>
<s:elseif test='flContent == "2"'>
待聯合蓋章
</s:elseif>
<s:elseif test='flContent == "3"'>
待分發
</s:elseif>
<s:elseif test='flContent == "4"'>
已分發
</s:elseif>
<#elseif query.tdValue == 'status'>
<a target="blank" href="<s:property value="itemUrl" />" >
<s:if test="${query.tdValue}==1">
在辦
</s:if>
<s:if test="${query.tdValue}==2">
已辦
</s:if>
<s:if test="${query.tdValue}==3">
已登出
</s:if>
<s:if test="${query.tdValue}==4">
將登出
</s:if>
<s:if test="${query.tdValue}==5">
已歸檔
</s:if>
<s:if test="${query.tdValue}==17">
草稿
</s:if>
</a>
<#else>
<a target="blank" href="<s:property value="itemUrl" />" >
<s:property value="${query.tdValue}" />
</a>
</#if>
</#if>
</h:column>
</#list>
另外一些常用語法
item_index:當前變數的索引值
item_has_next:是否存在下一個物件 其中item名稱為as後的變數名
具體案例程式碼如下:
<#list conditionList as conditon>
<#if conditon.srhInputType!=3><td class="td_search_title">${conditon.thCaption}:</td></#if>
<td class="td_search_box">
<#if conditon.srhInputType==0><!-- textbox -->
<input name="searchValue['${conditon.tdValue }']">
</#if>
<#if conditon.srhInputType==1><!-- datebox -->
<input readonly="" style="width: 80px" name="searchValue['${conditon.tdValue}_start']" inputtype="text">
<script type="text/javascript">
Calendar.setup( {
inputField : "searchValue['${conditon.tdValue }_start']",
ifFormat : "%Y-%m-%d"
});
</script>
至<input readonly="" style="width: 80px" name="searchValue['${conditon.tdValue}_end']" inputtype="text">
<script type="text/javascript">
Calendar.setup( {
inputField : "searchValue['${conditon.tdValue}_end']",
ifFormat : "%Y-%m-%d"
});
</script>
</#if>
<#if conditon.srhInputType==2><!-- selectbox -->
<select size="1" style="width:80px" name="searchValue['${r'${conditon.tdValue}'}']" inputtype="select"></select>
</#if>
<#if !conditon_has_next && conditon_index%3 == 1><td></td><td><input type="button" value="搜尋" class="btnSo ml5" onclick="conditionSearch()"> <input name="" type="button" onclick="document.forms[0].reset();defaultEvent('search')" ;="" value="重置" class="btn2"></td></#if>
<#if !conditon_has_next && conditon_index%3 == 0><td></td><td></td><td></td><td><input type="button" value="搜尋" class="btnSo ml5" onclick="defaultEvent('search')"> <input name="" type="button" onclick="document.forms[0].reset();defaultEvent('search')" ;="" value="重置" class="btn2"></td></#if>
<#if !conditon_has_next && conditon_index%3 == 2></tr><tr><td colspan="2"></td><td></td><td></td><td></td><td><input type="button" value="搜尋" class="btnSo ml5" onclick="defaultEvent('search')"> <input name="" type="button" onclick="document.forms[0].reset();defaultEvent('search')" ;="" value="重置" class="btn2"></td></#if>
<#if conditon_has_next && conditon_index%3 == 2></tr><tr></#if>
</td>
</#list>