Struts2 Tiles将var设置为tiles属性为字符串

时间:2014-08-28 14:34:32

标签: jsp struts2 tiles2

我使用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个逻辑测试:

  1. 在tiles属性为空的页面上使用#进行11次测试
  2. 11在tiles属性为空的页面上不使用#
  3. 在使用值
  4. 填充tiles属性的页面上使用#进行11次测试
  5. 11个测试未在使用值
  6. 填充tiles属性的页面上使用#

    仅情况3是正确的。所有其他情况都给出了错误的结果。例如,在情境1中,如果我测试#var == null我会得到错误,但如果我测试var == null(没有主题标签)i则为true。所以我需要清理两件事:

    1. 使用#的效果是什么?
    2. 具有值的tiles属性的效果是什么,struts var是将其视为null还是空字符串,还是取决于我是否使用#?
    3. 供参考,以下是所有测试:

      <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>
      

2 个答案:

答案 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属性不是类型字符串

     

[...]

     

只要字符串不为空/填写/至少有一个字符,结果就是正确的