我使用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页面进行了测试,其中一个实际上在tile中放置了一个值,而另一个则没有。总共有44个逻辑测试:
仅情况3是正确的。所有其他情况都给出了错误的结果。例如,在情境1中,如果我测试#var == null
我会得到错误,但如果我测试var == null
(没有主题标签)i
则为true。所以我需要清理两件事:
供参考,以下是所有测试:
<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>
答案 0 :(得分:4)
如果您未在tile定义中定义其值,则<tiles:getAsString>
标记将返回空字符串。所以你的代码
<s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set>
与空<s:set>
标记相同。
<s:set var="sidePanelName"></s:set>
一个空的<s:set>
标记w / o value
属性会将top
分配给变量(在大多数情况下,它将是当前的操作实例)。
尝试使用<s:property value="#sidePanelName"/>
打印其值。您可能会看到类似your_package.YourClass@hash
的内容。
答案 1 :(得分:1)
您无法在null
对象上调用方法...
然后
isEmpty()
和length()
不可调用,因为在对象本身上调用,而equals()
和equalsIgnoreCase()
进行比较时,如果在已知对象上调用它们,则可以调用它们而不生成NPE,如"".equalsIgnoreCase(#sidePanelName)
。 BTW,如果对象为null,那么"".equalsIgnoreCase(#sidePanelName)
也会给出false,因为它不等于空String,它只是null ...
P.S:注意你的描述,这是误导性的:
我有一个tile属性不是类型字符串
[...]
只要字符串不为空/填写/至少有一个字符,结果就是正确的