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!''} 作用是一样的,如果不存在都给一个默认为空的值。
参考资料: