1. 程式人生 > 其它 >Freemarker模板---引擎學習

Freemarker模板---引擎學習

技術標籤:表示式引擎Freemarker

一、簡要概述

  1. Freemarker是一款模板引擎,是一種基於模版生成靜態檔案的通用工具,它是使用純java編寫的,一般用來生成HTML頁面。
  2. 這段時間學習的主要是巢狀freemarker中的取值表示式及標籤這塊。

二、Freemarker模板檔案
3. 主要有4個部分組成:

內容描述
文字直接輸出的部分
註釋即<#–…-->格式不會輸出
插值(Interpolation)即${…}或者#{…}格式的部分,將使用資料模型中的部分替代輸出
FTL指令FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出。
<html>
<body> <#-- 註釋部分 --> <br> <#-- 下面使用插值 --> <h1>${val}</h1> <p>Hello everyone: <u1> <#-- 使用FTL指令 --> <#list users as user>   <li>${user.username} </li> <#list> <u1> </body> </html>

三、指令

  1. assign
    · 概要
    · 描述

概要

<#assign name1=value1 name2=value2 ... nameN=valueN><#assign same as above... in namespacehash><#assign name>
  capture this
</#assign><#assign name in namespacehash>
  capture this
</#assign>

描述
比如:變數 seq 儲存一個變數/序列:

<#assign svcNums1 = ""/>
<#assign svcNums = []/>
  1. if/elseif/else
    · 概要
    · 描述

概要

<#if condition>
  ...
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>

描述
你可以使用if,elseif 狀語從句:else指令來條件判斷是否越過模板的一個部分。 condition必須計算成布林值,否則錯誤將會中止模板處理。elseif狀語從句: else必須出現在if內部(也就是,在if的開始標籤狀語從句:結束標籤之間)。 if中可以包含任意數量的 elseif(包括0個)而且結束時 else是任選的。例如:

只有if沒有elseif和 else:
<#if x == 1>
  x是1
</#if>
只有if沒有elseif但是有 else:

<#if x == 1>
  x是1
<#else>
  x不是1
</#if>
有if和兩個elseif但是沒有 else:

<#if x == 1>
  x是1
<#elseif x == 2>
  x是2
<#elseif x == 3>
  x是3
</#if>
有if和三個elseif還有 else:

<#if x == 1>
  x是1
<#elseif x == 2>
  x是2
<#elseif x == 3>
  x是3
<#elseif x == 4>
  x是4
<#else>
  x既不是1也不是2也不是3也不是4
</#if>
要了解更多布林表示式,可以參考:模板開發指南/模板/表示式。

你(當然)也可以巢狀if指令:

<#if x == 1>
  x是1
  <#if y == 1>
    y也是1
  <#else>
    但是y不是
  </#if>
<#else>
  x不是1
  <#if y <0>
    且y小於0
  </#if>
</#if>
  1. list/break
    · 概要
    · 描述

概要

list 指令執行在 list 開始標籤和 list 結束標籤 ( list 中間的部分) 之間的程式碼, 對於在序列(或集合)中每個值指定為它的第一個引數。 對於每次迭代,迴圈變數(本例中的 user)將會儲存當前項的值。

迴圈變數(user) 僅僅存在於 list 標籤體內。 而且從迴圈中呼叫的巨集/函式不會看到它(就像它只是區域性變數一樣)。

描述
最簡形式

<#list users as user>
  <p>${user}
</#list>

開發中用到的巢狀形式

<#if svcNums?size gt 0 && prodOrderItems??>
    <#list prodOrderItems as prodOrderItem>
        <#if prodOrderItem.serviceOfferId == '4010100000'>
            <#if prodOrderItem.ordProdInstAccNums??>
                <#assign prodInstId = prodOrderItem.ordProdInstAccNums[0].prodInstId/>
                <#if prodInstId?? && svcNums?seq_contains(prodInstId)>
                    <#assign svcNums1 = prodInstId?c>
                    <#break>
                </#if>
            </#if>
        </#if>
    </#list>
</#if>

4. seq_contains
辨別序列中是否包含指定值。它包含一個引數,就是來查詢的值。比如:

<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
"yellow": ${x?seq_contains("yellow")?string("yes", "no")}
16: ${x?seq_contains(16)?string("yes", "no")}
"16": ${x?seq_contains("16")?string("yes", "no")}

將會輸出:

"blue": yes
"yellow": no
16: yes
"16": no

開發中用到的形式如下:

<#assign flag = true/>
<#assign _uplink_code = ["DATA","XDATA","ROAM","XROAM","HKD","MB","EROAM"]>
<#if (ContractRoot.SvcCont.BusiMsg.customerOrders[0].orderAttrs)??>
    <#list ContractRoot.SvcCont.BusiMsg.customerOrders[0].orderAttrs as custAttr>
        <#assign uc = (custAttr.attrValue)?upper_case>
        <#if custAttr.attrId == '91000130'>
            <#if (_uplink_code)?seq_contains(uc)>
                <#assign flag = false/>
                <#break>
            </#if>
        </#if>
    </#list>
</#if>
<#if !flag>false<#else>true</#if>
<#assign _flag_zh=false/>
<#assign _flag_en=false/>
<#list ContractRoot.SvcCont.BusiMsg.customerDetails.customerDetail.custAttrs as custAttrs>
<#--判斷列表中屬性值是否有中文或者列表中屬性值既無中文也無英文,都返回true -->
    <#if (custAttrs.attrValue == 'ZH')>
        <#assign _flag_zh=true/>
        <#break>
    <#elseif custAttrs.attrValue == 'EN'>
        <#assign _flag_en=true/>
        <#break>
    </#if>
</#list>
<#if _flag_zh || (!_flag_zh && !_flag_en)>true<#else>false</#if>

<#if custAttrs.attrValue != 'ZH'>
    <#if custAttrs.attrValue != 'EN'>
        <#assign _flag=true/>
    </#if>
</#if>
<#assign i = 0/>
<#if ContractRoot.SvcCont.BusiMsg.customerOrders[0].offerOrderItems??>
[<#list ContractRoot.SvcCont.BusiMsg.customerOrders[0].offerOrderItems as offerOrderItems>
<#if offerOrderItems.serviceOfferId == '3010100000'>
<#if offerOrderItems.ordOfferInsts[0].offerType == '13' && offerOrderItems.ordOfferInsts[0].operType == '1000'>
<#assign accNum = offerOrderItems.ordOfferProdInstRels[0].accNum/>
<#assign i = i + 1/>
<#if i == 1>
${accNum}
<#else>
,${accNum}
</#if>
</#if>
</#if>
</#list>]
</#if>