Freemaker处理空值,null值,不存在的属性

本文将介绍怎样在Freemarker中处理空值、null值和不存在的属性,不存在的属性去使用会导致模板解析出错。

Freemaker模板在解析时,如果属性不存在,将抛出如下错误信息:

FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> test [in template "index.ftl" at line 203, column 3] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${test} [in template "index.ftl" at line 203, column 1] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at

这是因为 ${test} 中的 test 变量我们没有定义。下面将了解怎样去处理这种情况!

属性不存在

就如上面的实例一样,如果Freemarker中使用了一个不存在的属性,我们想让模板解析不出错,怎么办呢?

实例1:

<label class="lab-item">
    测试一下!和??:
</label>
${noExit!'bucunzai'}

效果:

测试一下!和??: bucunzai

noExit 是在Java服务端不存在的属性。但是,我们使用!判断了在不存在的时候使用默认值。默认值为“bucunzai”

实例2:

<label>??测试不存在的属性:</label>
<#if noExit ?? >
    <label class="lab-item">测试一下!和??:</label>${noExit!'bucunzai'}
</#if>

效果:

??测试不存在的属性:

结论:

  • ?? 用来判断属性是否存在。如果存在,返回true;如果不存在,返回false。

  • ! 也是用来设置默认值。如果属性不存在,则设置为后面紧跟的默认值。

属性存在,但是不赋值

Java中的数据:

Map<String,Object> dataMap = new HashMap<String,Object>();
dataMap.put("noExit", null);

实例1:

<label class="lab-item">
    测试一下!和??:
</label>
${nullexit!'bucunzai'}

效果:

测试一下!和??: bucunzai

实例2:

<p class="p12 p-item">
    <label  class="lab-item" >??测试不存在属性:</label> ----  
</p>  
<#if nullexit ?? >
    <label class="lab-item">
        测试一下!和??:
    </label>
    ${nullexit!'bucunzai'}
</#if>

效果:

??测试不存在属性:</label> ----

结论: 属性值为null,?? 和 ! 是一样的判断为不存在。

属性的是为空

Java:

Map<String,Object> dataMap = new HashMap<String,Object>();
dataMap.put("blankExit", "");

实例1:

<#if blankExit ?? >
    <label class="lab-item">
        测试一下!和??:
    </label>
    ${blankExit!'bucunzai'}
</#if>

效果:

测试一下!和??:

结论: 属性值为空(不占用空格),??和!是当做正常值来进行判断的。

总结论:

?? 和 ! 判断属性或者属性的值是否存在是一样的用途。不同之处在于“!”可以给出默认值。

对于为空的情况,我采用这种方式来进行判断:

<#if (headuser.photo)??>
    <#if (headuser.photo)!=""> 
        ...
    </#if>
</#if>

在补充一点:

${noExit!} 和 ${noExit!''} 作用是一样的,如果不存在都给一个默认为空的值。

参考资料:

https://blog.csdn.net/u010924878/article/details/77884488 

点击查看更多 Freemarker 知识……

天下之事常成于困约,而败于奢靡。——陆游
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号