我遇到了一些与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"/>
答案 0 :(得分:0)
首先,你不能完全正确地说你不能在OGNL 中嵌套表达式的评估。如果你看一下OGNL Language Gude的Expression Evaluation,你会发现如果在括号前面使用带括号的括号表达式,那么评估该表达式的结果将被用作要计算的表达式。请参阅示例here。
其次,我没有看到你获得除迭代器索引之外的索引的原因。
第三,set
标记将变量放置到可通过#
表示法访问的值堆栈上下文。请参阅示例here。
第四,回答你的直接问题:
因为第四行有拼写错误。用
替换该行<s:set var="grpName" value="model[%{#grpIndex}].groupName"/>
会做出预期的事情。你可以看到表达式的差异。
最后一个只是引用,告诉你应该使用%{}
来强制评估表达式,因为Struts正在解析OGNL的标记属性中的所有内容(默认情况下)。
在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"/>