freemarker04
需积分: 0 47 浏览量
更新于2013-04-07
收藏 22.22MB ZIP 举报
Freemarker是一个强大的Java模板引擎,常用于动态生成HTML、XML等Web页面。在实际开发中,我们常常会遇到数据模型中的字段可能为空的情况。"freemarker04_空值的处理"这个主题,正是关注如何在Freemarker模板中优雅地处理这些空值,避免因空值导致的异常或不期望的输出。
1. **空值检查**
在Freemarker模板中,可以使用`?has_content`指令来判断变量是否为空。如果变量存在且非空,`?has_content`将返回`true`,否则返回`false`。例如:
```freemarker
<#if user.name?has_content>
Name: ${user.name}
</#if>
```
这段代码只会显示用户名如果它不为空。
2. **默认值**
如果你想为可能为空的变量提供一个默认值,可以使用`?default`操作符。例如:
```freemarker
${user.email?default('noemail@example.com')}
```
如果`user.email`为空,那么将输出`noemail@example.com`。
3. **空字符串与`null`**
Freemarker区分`null`和空字符串("")。`null`表示变量不存在,而空字符串则表示该变量存在但其值是空字符串。因此,对于空字符串,可以使用`?length`来检查长度,如`${variable?length}`。
4. **链式操作**
可以在一个表达式中连续使用多个`?`操作符,例如`user.address.street?default('N/A')?html`,这首先检查`street`是否存在,如果不存在则使用默认值`'N/A'`,然后对结果进行HTML转义,防止XSS攻击。
5. **自定义空值处理**
除了内置的空值处理方式,你还可以自定义`null`的显示。通过创建一个`freemarker.template.Configuration`实例,并设置`nullValue`属性,可以指定当变量为`null`时显示的字符串。
6. **条件语句**
使用`<#if>`、`<#else>`和`<#elseif>`可以构建复杂的条件逻辑,处理各种可能的空值情况。例如:
```freemarker
<#if user??>
<#if user.name??>
Name: ${user.name}
<#else>
No name provided
</#if>
<#else>
User not found
</#if>
```
这个例子首先检查`user`是否存在,然后检查`user.name`是否存在。
7. **列表和集合的空值处理**
对于列表或集合,可以使用`?size`检查其长度。如果列表为空,`?size`将返回0。例如:
```freemarker
<#if user.friends?size > 0>
Friends:
<#list user.friends as friend>
${friend.name}
</#list>
<#else>
No friends
</#if>
```
8. **安全导航运算符(?.)**
自Freemarker 2.3.30起,引入了安全导航运算符,如`user?.address?.city`。如果`user`或`address`为`null`,后面的`city`就不会被尝试访问,从而避免了`NullPointerException`。
9. **空值合并运算符(??)**
自Freemarker 2.3.32起,可以使用`??`运算符,它类似于JavaScript的`||`,但不考虑`false`和`0`为假的情况。例如:
```freemarker
${user.active?string('Yes', 'No')?default('Not provided')?html}
```
这将根据`user.active`的值输出`'Yes'`、`'No'`或`'Not provided'`,并确保结果被HTML转义。
通过以上这些方法,你可以有效地在Freemarker模板中处理空值,保证程序的稳定性和用户体验。理解并熟练运用这些技巧,将使你的Freemarker模板代码更加健壮和易维护。