ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Freemarker模板---引擎学习

2020-12-27 14:02:09  阅读:244  来源: 互联网

标签:seq Freemarker list else --- elseif yes 模板


一、简要概述

  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>

标签:seq,Freemarker,list,else,---,elseif,yes,模板
来源: https://blog.csdn.net/xiaoleilei666/article/details/111788169

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有