Struts2标签似乎评估不一致

时间:2014-04-09 17:39:03

标签: jsp struts2 tags ognl

我遇到了一些与OGNL混合使用的Struts2标签的问题。为了克服你无法在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"/>

2 个答案:

答案 0 :(得分:0)

首先,你不能完全正确地说你不能在OGNL 中嵌套表达式的评估。如果你看一下OGNL Language Gude的Expression Evaluation,你会发现如果在括号前面使用带括号的括号表达式,那么评估该表达式的结果将被用作要计算的表达式。请参阅示例here

其次,我没有看到你获得除迭代器索引之外的索引的原因。

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

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

因为第四行有拼写错误。用

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

会做出预期的事情。你可以看到表达式的差异。

最后一个只是引用,告诉你应该使用%{}来强制评估表达式,因为Struts正在解析OGNL的标记属性中的所有内容(默认情况下)。

  

The usage of %{} notation

     

在OGNL中用于强制评估括号中的内容为OGNL表达式。

答案 1 :(得分:0)

首先,您使用<s:text>(第3行)代替<s:property>,这将产生错误的测试结果。第二,第4行有一个拼写错误(未打开的括号)。最重要的是不要在%{}[]标记内的<s:property>内使用<s:set>

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