我有一个与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条答案
按热度按时间osh3o9ms1#
首先,你使用的是
<s:text>
(第3行)而不是<s:property>
,这将产生错误的测试结果。其次,第4行(未打开的括号)中有一个错字。最重要的是,不要在<s:property>
或<s:set>
标签中的[]
内使用%{}
。字符串
pgky5nke2#
首先,你说 * 你不能在OGNL中嵌套表达式的求值 * 是不完全正确的。如果你看一下OGNL语言指南的表达式求值,你会发现如果你使用带括号的表达式,而括号前没有一个点,那么这个表达式的求值结果将被用作要求值的表达式。参见示例here。
第二,我不明白为什么你得到的索引不是迭代器索引。
第三,
set
标记将变量放置到 value stack context 中,该上下文可以通过#
表示法访问。参见示例here。第四,回答你的直接问题:
因为第四行有一个错字。将该行替换为
字符串
会做预期的事情。你可以看到表达的差异。
最后一个只是一个参考,它向您展示了应该在哪里使用
%{}
来强制表达式求值,因为Struts会解析OGNL标记属性中的所有内容(默认情况下)。The usage of %{} notation:
在OGNL中用于强制将括号中的内容作为OGNL表达式进行计算。