1. 程式人生 > >Freemarker第一次實際專案使用遇到的一些問題

Freemarker第一次實際專案使用遇到的一些問題

在最近專案中第一次使用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模板中,會報錯。因為Freemarkerget,set{ctx}找不到後臺定義的ctx的get,set屬性就會報空指標錯誤。對於這種情況,Freemarker提供了自己的轉移標籤。{r'{}}。
如果希望正確生成上面的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()">&nbsp;<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')">&nbsp;<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')">&nbsp;<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>