FreeMarker对null值的处理

!对输出的空值做处理,只输出无返回值

输出name的值:${name}。如果name为null,就会报错。

输出name的值:${name!}。如果name为null,就不会报错,什么也没输出。(重点)

输出name的值:${name!"默认值"}。如果name为null,就输出”默认值”字符串。(重点)

输出name的值:${name!100}。如果name为null,就输出100。

输出user.name的值:${(user.name)!"默认值”},如果user或name为null,就输出默认值。(重点)

输出user.name的值:${user.name!"默认值”},如果user为null会报错,如果name为null,就输出默认值。

使用default内建函数来处理:${user.name?default('vakin')}  (较繁琐)

 


??测试是否为null,返回boolean值 


product.color??将只测试color是否为null


(product.color)??将测试product和color是否存在null 


 

freemarker中??和?的区别

??是判断对象是否为空,例如:<#if object??>object对象不为空(即object存在)</#if>

?后面要加内建函数名,例如:<#if object?exists>object对象不为空(即object存在)</#if>

<#if str??>${str?string}</#if><#--将str以字符串形式显示-->

 

freemarker的内建函数

${nowDate?time}<#--将现有时间以时间的格式显示,显示结果如:15:13:05-->

${nowDate?date}<#--以日期格式显示,如:2011-4-28-->(date的格式可以在freemarker.properties文件中配置)

日期格式化 ${time?string("yyyy-MM-dd")}

截取字符串 ${str?substring(0,2)}

indexof的使用 ${str?last_index_of(",")}

split的使用

<#list "12,13,14,15"?split(",") as item>

${item}

</#list>

 

${s?if_exists}

${item_index?if_exists+1}

${user.name?default('vakin')},同上 

 

freemarker运算符

<#if score gte 60>

 及格

<#elseif score gte 80 && score lte 90>

良好

<#else>

高材生

</#if>

<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`引发意外行为 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值