【问题标题】:Struts 2 tags seem to evaluate inconsistentlyStruts 2 标签的评估似乎不一致
【发布时间】:2014-05-23 02:18:09
【问题描述】:

我遇到了一些 Struts2 标签与 OGNL 混合的问题。为了克服不能在 OGNL 中嵌套表达式求值的事实,例如 %{foo[%{bar}]},我使用连续赋值变量来获得我需要的结果。

在下面的代码中,var grpIndex 计算正确,例如,'6''7' 在我的例子中,并在下一行正确打印出来。以下语句(第 3 行)的计算结果也正确,例如 'stage''prod' 在我的例子中。

但是,在第四行中,我尝试使用与上一行相同的语法将相同的表达式设置为变量,以便可以在标题中使用它。为了测试这个作业,我尝试在下一行打印出 var。我希望最后一行打印与第三行相同的值。然而,这个表达式什么也没打印出来。这是为什么呢?

<s:set var="grpIndex" value="%{options[#optstatus.index]}"/>
grpIndex = <s:property value="#grpIndex"/><br/>
grpName = <s:text name="model[%{grpIndex}].groupName"/><br/>
<s:set var="grpName" value="model[%{grpIndex}]).groupName"/>
groupName = <s:property value="#grpName"/>

【问题讨论】:

    标签: jsp struts2 tags ognl


    【解决方案1】:

    首先,你说你不能在OGNL中嵌套表达式的求值是不完全正确的。如果您查看 OGNL 语言指南的Expression Evaluation,您会发现,如果您使用括号括起来的表达式,而括号前没有点,则评估该表达式的结果将用作要评估的表达式。请参阅示例here

    其次,我看不出您获得迭代器索引以外的索引的原因。

    第三,set 标记将变量放置到可通过# 表示法访问的值堆栈上下文。请参阅示例here

    第四,回答你的直接问题:

    因为第四行有错别字。将行替换为

    <s:set var="grpName" value="model[%{#grpIndex}].groupName"/>
    

    会做预期的事情。可以看出表情的不同。

    最后只是参考,向您展示应该在哪里使用%{} 来强制评估表达式,因为 Struts 正在解析 OGNL 标记属性中的所有内容(默认情况下)。

    The usage of %{} notation:

    在 OGNL 中用于强制将括号中的内容计算为 OGNL 表达式。

    【讨论】:

      【解决方案2】:

      首先,您使用&lt;s:text&gt;(第3 行)而不是&lt;s:property&gt;,这会产生错误的测试结果。其次,第 4 行有一个错字(未打开的括号)。最重要的是不要在 [] 中使用 %{} &lt;s:property&gt;&lt;s:set&gt; 标签。

      <s:set var="grpIndex" value="options[#optstatus.index]"/>
      grpIndex = <s:property value="#grpIndex"/><br/>
      grpName = <s:property value="model[#grpIndex].groupName"/><br/>
      <s:set var="grpName" value="model[#grpIndex].groupName"/>
      groupName = <s:property value="#grpName"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        相关资源
        最近更新 更多