Struts 2 标签的评估似乎不一致

问题描述 投票:0回答:2

我对一些与 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"/>
jsp struts2 tags ognl
2个回答
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"/>

0
投票

首先,您所说的不能在 OGNL 中嵌套表达式的求值并不完全正确。如果您查看 OGNL Language Gude 的ExpressionEvaluation,您会发现,如果您使用括号表达式,括号前面没有点,则该表达式的计算结果将用作要计算的表达式。请参阅示例此处

其次,我不明白您获取迭代器索引以外的索引的原因。

第三,

set
标签将变量放置到可通过#表示法访问的
值堆栈上下文
中。请参阅示例此处

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

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

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

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

最后一个只是向您展示应该在哪里使用

%{}
来强制计算表达式的参考,因为 Struts 正在解析 OGNL 标签属性中的所有内容(默认情况下)。

%{} 表示法的用法:

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

© www.soinside.com 2019 - 2024. All rights reserved.