Freemarker 的常见控制结构写法(ZT)

本文详细介绍了Freemarker模板引擎中的if...else...控制结构的使用方法,包括简单的if条件判断、带有elseif的复杂条件判断及包含else的用法,并展示了switch...case...default...结构和循环迭代结构的实现方式。
Freemarker是很好用的模板引擎。今天被一个小小的if...else...控制结构的写法困扰了很久,原来在freemaker里这个控制结构和JSTL还不一样,不了解的话还真是个问题。虽然freemarker的tag用的也是类似xml的尖括号,但是它并不遵守每个标签都要封口的规则。

选择结构
if...else...

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

只有一个if的情况:

<#if x = 1>
  x is 1
</#if> 

包含elseif的情况:

<#if x = 1>
  x is 1
<#elseif x = 2>
  x is 2
<#elseif x = 3>
  x is 3
</#if>  

包含else的用法:

<#if x = 1>
  x is 1
<#elseif x = 2>
  x is 2
<#elseif x = 3>
  x is 3
<#elseif x = 4>
  x is 4
<#else>
  x is not 1 nor 2 nor 3 nor 4
</#if> 


switch...case...default...

<#switch value>
  <#case refValue1>
    ...
    <#break>
  <#case refValue2>
    ...
    <#break>
  <#case refValueN>
    ...
    <#break>
  <#default>
    ...
</#switch>

类似Java的普通用法:

<#switch being.size>
  <#case "small">
     This will be processed if it is small
     <#break>
  <#case "medium">
     This will be processed if it is medium
     <#break>
  <#case "large">
     This will be processed if it is large
     <#break>
  <#default>
     This will be processed if it is neither
</#switch>  

不使用break的方法,即在case中进行判断:

<#switch x>
  <#case x = 1>
    1
  <#case x = 2>
    2
  <#default>
    d
</#switch>  


循环迭代结构

<#list sequence as item>
    ...
</#list>

迭代的同时会生成两个变量:item_index,item_has_next,意如其名:

<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
  ${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>  

也可以用break跳出循环,用法和switch语句中的方法类似。
### Freemarker 中处理空值的方法和技巧 在模板引擎 FreeMarker 中,为了避免变量为空而导致渲染错误或不期望的结果,提供了多种方式来安全地处理可能为空的变量。 #### 使用默认值操作符 `!` FreeMarker 提供了一个简单而强大的机制——默认值操作符`!`,用于当左侧表达式的求值结果为未定义时返回右侧指定的默认值[^3]。例如: ```html ${user.name!"Guest"} ``` 如果 `user.name` 是 null 或者不存在,则会显示 "Guest" 字样。 #### 利用内置函数判断并转换数据类型 对于特定的数据类型如日期格式或布尔型,在将其作为字符串输出之前可以先做相应的检查与转化。比如要确保时间戳总是按照固定的格式展示,即使原始字段可能是null也可以通过如下语句实现[^2]: ```html ${lastUpdate?string("yyyy-MM-dd HH:mm:ss","未知")} ``` 这里不仅指定了日期格式化模式,还设定了一个备用文本以防万一遇到无法解析的情况。 #### 条件逻辑控制 除了上述两种较为直接的方式外,还可以借助条件指令 `<#if>` 结合 `??` 运算符来进行更复杂的业务场景下的空值检测: ```html <#if user.address?? && !user.address??> 地址已设置但为空白. <#elseif user.address??> 用户地址: ${user.address} <#else> 尚未提供具体住址信息. </#if> ``` 这段代码片段展示了如何区分不同类型的缺失情况(完全不存在 vs 存在但是空白),从而给出更为精准的信息提示。 综上所述,利用好这些特性能够有效提升模板的安全性和灵活性,使得最终生成的内容既美观又可靠[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值