freemaker中的“!”和“??”的区别
第一种情况:属性不存在
!--freemaker
<label class="lab-item">测试一下!和??:
</label>${noExit!'bucunzai'}
效果:
noExit 是在Java服务端不存在的属性。
!判断了在不存在的时候使用默认值。
??--freemaker
<label >??测试不存在的属性:</label>
<#if noExit ?? >
<label class="lab-item">测试一下!和??:
</label>${noExit!'bucunzai'}
</#if>
效果:
结论:属性不存在,??直接判断为false。!也是判断为false,所以采用了默认值。
第二种情况:属性存在,但是不赋值
Java中的数据:
dataMap.put("noExit",null);
!--freemaker
<label class="lab-item">测试一下!和??:
</label>${nullexit!'bucunzai'}
效果:
??--freemaker
<p class="p12 p-item">
<label class="lab-item" >??测试不存在属性:</label> ----
</p>
<#if nullexit ?? >
<label class="lab-item">测试一下!和??:
</label>${nullexit!'bucunzai'}
</#if>
效果:
结论:属性值为null,??和!是一样的判断为不存在。
第三种:属性的是为空
Java:
dataMap.put("blankExit","");
!--??--freemaker
<#if blankExit ?? >
<label class="lab-item">测试一下!和??:
</label>${blankExit!'bucunzai'}
</#if>
效果:
结论:属性值为空(不占用空格),??和!是当做正常值来进行判断的。
总结论:
??和!判断属性或者属性的值是否存在是一样的用途。不同之处在于“!”可以给出默认值。
freemaker在线手册中明确之处了:
这部分对程序员而言: 一个不存在的变量和一个是 null
值的变量, 对于FreeMarker来说是一样的,所以这里所指的"丢失"包含这两种情况。
来自 <http://freemarker.foofun.cn/dgui_quickstart_template.html>
对于为空的情况,我采用这种方式来进行判断:
<#if (headuser.photo)??>
<#if (headuser.photo)!="">
</#if>
</#if>
在补充一点:
${noExit!}和${noExit!‘’}作用是一样的,如果不存在都给一个默认为空的值。