Jsp Struts2 Tiles将变量设置为Tiles属性的字符串

Jsp Struts2 Tiles将变量设置为Tiles属性的字符串,jsp,struts2,tiles2,Jsp,Struts2,Tiles2,我使用struts 2.3.16和tiles 2.0.6 具有空属性的平铺定义(除其他外): 我使用两个不同的JSP页面进行了测试,一个页面实际在tiles中输入了值,另一个页面没有。因此,总共有44个逻辑测试: 11在tiles属性为空的页面上使用#进行测试 11在tiles属性为空的页面上不使用#的测试 11在tiles属性填充值的页面上使用#进行测试 11在tiles属性填充值的页面上不使用#的测试 只有情况3是正确的。所有其他情况都给出了错误的结果。例如,在情况1中,如果我测试#var=

我使用struts 2.3.16和tiles 2.0.6

具有空属性的平铺定义(除其他外):

我使用两个不同的JSP页面进行了测试,一个页面实际在tiles中输入了值,另一个页面没有。因此,总共有44个逻辑测试:

  • 11在tiles属性为空的页面上使用#进行测试
  • 11在tiles属性为空的页面上不使用#的测试
  • 11在tiles属性填充值的页面上使用#进行测试
  • 11在tiles属性填充值的页面上不使用#的测试
  • 只有情况3是正确的。所有其他情况都给出了错误的结果。例如,在情况1中,如果我测试
    #var==null
    我得到false,但是如果我测试
    var==null
    (不带hashtag)
    I
    得到true。所以有两件事我需要澄清:

  • 使用或不使用#的效果如何
  • tiles属性是否有值会产生什么影响,struts变量是否将其视为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>
    
    
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    真假
    
    您不能在
    null
    对象上调用方法

    然后

    • isEmpty()
      length()
      是不可调用的,因为调用对象本身时
    • 对于与
      equals()
      equalsIgnoreCase()
      的比较,如果在已知对象上调用,则可以调用它们而不生成NPE,如
      “”。equalsIgnoreCase(#sidePanelName)
    顺便说一句,如果对象为null,也将
    “”。equalsIgnoreCase(#sidePanelName)
    将给出false,因为它不等于空字符串,它只是null


    注意你的描述,这是误导性的:

    我有一个不是string类型的tiles属性

    [……]

    只要字符串不为空/已填充/至少有一个字符-

    如果尚未在平铺定义中定义其值,
    标记将返回空字符串。所以你的代码

    <s:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set>
    
    
    
    将与空的
    标记相同

    <s:set var="sidePanelName"></s:set>
    
    
    
    一个空的
    标记w/o
    value
    属性将
    top
    分配给一个变量(在大多数情况下,它将是当前操作实例)


    尝试使用
    打印其值。您可能会看到类似于
    your\u包的内容。YourClass@hash

    我澄清了问题并添加了更多细节/结果。你能用这些新信息澄清你的答案吗?特别是一个问题:如果tiles属性为空,struts变量是否为null?请阅读,尤其是其中链接的答案,以避免22次测试:)谢谢,这对我来说是必要的文献
    如果找不到命名值,则抛出一个
    JSPException
    。我的意思是在这种情况下它不会返回空字符串。@RomanC:是的,如果根本没有定义。但是OP说有定义但值为空。@RomanC:有
    ignore
    属性可以用来忽略异常。没错,
    set
    标记被计算为
    top
    。但就我而言,这不是一种行动。好的,+1表示回答很好。您应该使用
    s:property
    标记来输出
    tiles:getAsString
    的值。
    #sidePanelName vs sidePanelName
    
    <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:set var="sidePanelName"><tiles:getAsString name='pageSidePanel'/></s:set>
    
    <s:set var="sidePanelName"></s:set>