FreeMarker 对null值的处理

本文介绍了FreeMarker模板语言中如何处理Java中的null值。由于FreeMarker不直接识别null,因此文章详细解释了如何使用exists关键字及??运算符来判断变量是否存在,并展示了如何通过!和?default等操作符来避免null值引发的问题。
以下引用官方描述:

The FreeMarker template language doesn't know the Java language null at all. It doesn't have null keyword, and it can't test if something is null or not.


1.判断是否存在,通过exists关键字或者"??"运算符。都将返回一个布尔值
user.name?exists 
user.name??
Html代码 收藏代码
<#if user.name?exists>
//TO DO
</#if>

<#if user.age??>
//TO DO
</#if>



2.忽略null值
假设前提:user.name为null 
${user.name},异常
${user.name!},显示空白
${user.name!'vakin'},若user.name不为空则显示本身的值,否则显示vakin
${user.name?default('vakin')},同上
${user.name???string(user.name,'vakin')},同上



eg:当outCar.startNumberKm为空时则取startNumberKmByLast作用域中的值
<div class="grid_5 lable-right">
<label class="form-lbl">起始公里数(km):</label>
</div>
<div class="grid_6">
<input type="text" name="startNumberKm" id="startNumberKm" maxlength="10"
value="${outCar.startNumberKm!'${startNumberKmByLast}'}" class="form-txt" />
</div>
<div class="grid_1"><em class="form-req">*</em></div>
<think>嗯,用户问的是FreeMarker中如何进行空安全处理的方法或语法。我需要根据提供的引用资料来回答这个问题。首先,我得回忆一下FreeMarker的基本语法,尤其是处理的部分。 根据引用[1],提到使用${empty!"EmptyValue of fbysss"}这种格式,这里用到了!操作符来提供默认。当变量为空时,显示后面的替代。这应该是一个常用的方法,可以防止变量为空导致的错误。 然后引用[2]中提到了使用??来判断变量是否存在。比如<#if photoList??>...</#if>,这样可以先检查变量是否存在,再执行相关操作。另外,还指出在if条件中不能直接使用${},应该直接用变量名,比如<#if isBig>而不是${isBig}。 接下来,我需要把这些信息整理成步骤。首先,可能分为两种主要方法:默认操作符和条件判断。默认操作符用!,而条件判断用??。另外,可能还要提到避免在条件中使用${}的错误做法。 还要注意用户可能需要具体的例子,所以在回答中应该包含代码示例,比如如何用!来设置默认,如何用??进行判断。此外,可能还需要提到如何处理对象属性的空,比如user.name!或者(user.name)!,括号的区别在哪里。 另外,用户可能想知道为什么有时候需要加括号,比如当整个表达式可能为空时,用括号包裹起来,这样!才会应用到整个表达式的结果上,而不是单个变量。例如,(user.name)!和user.name!的区别。 可能还需要提到Freemarker的配置设置,比如设置classic_compatible为true,但这可能会导致其他问题,所以通常建议显式处理而不是依赖全局配置。 用户的问题可能涉及到模板中的变量是否存在或者为null,所以需要分情况讨论。比如变量是否存在(是否在数据模型中),以及变量的是否为null。使用??可以同时检查这两种情况,但需要明确说明。 最后,生成相关的问题,比如如何避免空指针异常,Freemarker中如何判断变量是否存在,以及默认设置的高级用法。这些问题可以帮助用户进一步了解空处理的不同方面。</think>### FreeMarker安全处理方法及语法 在FreeMarker处理时,需通过**显式判断**或**默认语法**来避免模板渲染错误。以下是具体方法: --- #### 一、默认操作符 `!` 使用`!`操作符为变量设置默认,当变量为`null`或不存在时自动替换: ```freemarker <!-- 基础用法 --> ${user.name!"匿名用户"} <!-- 嵌套属性安全处理 --> ${(user.profile.address.street)!} <!-- 若任意中间属性为null,整个表达式返回空 --> ${(user.profile.address.street)!"地址未填写"} <!-- 组合使用 --> ``` **技术细节**: - 括号`( )`确保`!`作用于整个表达式结果,而非单个属性 - 未加括号时,如`user.name!`仅处理`user.name`的null,不处理`user`本身的null --- #### 二、空判断符 `??` 通过逻辑判断先验证变量是否存在或非空: ```freemarker <#if product??> 商品名称:${product.name} <#else> 商品信息不存在 </#if> <!-- 多级属性判断 --> <#if (user.profile.address)??> 地址:${user.profile.address.street} </#if> ``` **注意事项**: - 禁止在`<#if>`中直接使用`${}`,应直接写变量名 **错误示例**:`<#if ${isVIP}>` **正确示例**:`<#if isVIP>` --- #### 三、配置级空处理 通过`classic_compatible`配置自动抑制空错误(**慎用**): ```properties # 在freemarker.properties中设置 classic_compatible=true ``` **副作用**:此配置会改变其他语法行为(如布尔比较),建议优先使用显式处理[^1][^2]。 --- ### 最佳实践建议 1. **优先组合语法**:对多级属性使用`(obj.field1.field2)!`格式 2. **明确业务逻辑**:关键数据采用`<#if var??>`显式判断 3. **避免全局配置**:防止因`classic_compatible`引发意外行为 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值