我对一些与 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"/>
首先,您使用
<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"/>
首先,您所说的不能在 OGNL 中嵌套表达式的求值并不完全正确。如果您查看 OGNL Language Gude 的ExpressionEvaluation,您会发现,如果您使用括号表达式,括号前面没有点,则该表达式的计算结果将用作要计算的表达式。请参阅示例此处。
其次,我不明白您获取迭代器索引以外的索引的原因。
第三,
set
标签将变量放置到可通过#
表示法访问的值堆栈上下文中。请参阅示例此处。
第四,回答你的直接问题:
因为第四行有错字。将行替换为
<s:set var="grpName" value="model[%{#grpIndex}].groupName"/>
会做预期的事情。你可以看到表达上的差异。
最后一个只是向您展示应该在哪里使用
%{}
来强制计算表达式的参考,因为 Struts 正在解析 OGNL 标签属性中的所有内容(默认情况下)。
在 OGNL 中使用,强制将括号中的内容计算为 OGNL 表达式。