Jsp Struts2标签的计算结果似乎不一致

Jsp Struts2标签的计算结果似乎不一致,jsp,struts2,tags,ognl,Jsp,Struts2,Tags,Ognl,我对一些Struts2标记与OGNL混合存在问题。为了克服无法在OGNL中嵌套表达式求值的事实,例如,%{foo[%{bar}]},我使用对变量的连续赋值来获得所需的结果 在下面的代码中,vargrpIndex的计算结果正确,例如在我的例子中是'6'或'7',并在下一行正确打印出来。以下语句(第3行)的计算结果也正确,例如,在我的例子中,'stage'或'prod' 但是,在第四行中,我尝试将相同的表达式设置为变量,使用与前一行相同的语法,以便在标题中使用它。为了测试这个赋值,我尝试在下一行打印

我对一些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"/>

grpIndex=
grpName=
组名=
首先,您说不能在OGNL中嵌套表达式的求值,这是不完全正确的。如果您查看OGNL语言Gude的最新版本,您会发现,如果您使用括号中的表达式,而括号前面没有点,则该表达式的求值结果将用作要求值的表达式。参见示例

其次,除了迭代器索引之外,我看不出获取其他索引的原因

第三,
set
标记将变量放置到可通过
符号访问的值堆栈上下文中。参见示例

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

因为第四行有个打字错误。将线路更换为

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

我会做你想做的事。你可以看到表达上的差异

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

:

在OGNL中用于强制将括号中的内容作为OGNL表达式求值


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

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

grpIndex=
grpName=
组名=