【发布时间】:2014-08-28 14:34:31
【问题描述】:
我使用 struts 2.3.16 和 tile 2.0.6。
具有空属性的图块定义(以及其他):
<put-attribute name="pageSidePanel" value="" />
其他一些定义对其进行了扩展,他们可以选择填入值:
<put-attribute name="pageSidePanel" value="/panels/greenPanel.jsp" />
或者也留空。
我尝试通过使用struts“set”标签和一些基本的if/else逻辑来测试这个属性是否为空。例如:
<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set>
<s:if test='%{#sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else>
结果出乎我的意料。我进行了 11 次逻辑测试,有两种变体:11 次测试使用主题标签,另外 11 次没有:
#sidePanelName vs sidePanelName
我用 2 个不同的 JSP 页面进行了测试,一个实际上在图块中输入了值,另一个没有。所以总共有 44 个逻辑测试:
- 在tiles属性为空的页面上使用#进行11次测试
- 在tiles属性为空的页面上不使用#的11个测试
- 11 次使用# 测试在tiles 属性填入值的页面上
- 11 测试不使用 # 在其中以值填充了 tiles 属性的页面上
只有情况 3 是正确的。所有其他情况都给出了错误的结果。例如,在情况 1 中,如果我测试 #var == null 我得到错误,但如果我测试 var == null(没有主题标签)i 得到正确。所以我需要澄清两件事:
- 使用#或者不使用有什么影响?
- tiles属性有没有值有什么影响,struts var是把它当作null还是空字符串,还是取决于我是否使用了#?
作为参考,这里是所有测试:
<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set>
<s:if test='#sidePanelName != ""'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="#sidePanelName != ''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test='#sidePanelName == ""'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="#sidePanelName == ''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{!#sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{#sidePanelName.length() > 0}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{#sidePanelName.length() == 0}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{#sidePanelName.equals("")}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{#sidePanelName.equalsIgnoreCase("")}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='#sidePanelName == null'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='#sidePanelName != null'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='sidePanelName != ""'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="sidePanelName != ''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test='sidePanelName == ""'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="sidePanelName == ''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{!sidePanelName.isEmpty()}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{sidePanelName.length() > 0}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{sidePanelName.length() == 0}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{sidePanelName.equals("")}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='%{sidePanelName.equalsIgnoreCase("")}'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='sidePanelName == null'>TRUE</s:if><s:else>FALSE</s:else>
<s:if test='sidePanelName != null'>TRUE</s:if><s:else>FALSE</s:else>
【问题讨论】:
-
你应该使用
s:property标签来输出tiles:getAsString的值。