JSP Struts2标记的评估似乎不一致

hi3rlvi2  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(76)

我有一个与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"/>

字符串

osh3o9ms

osh3o9ms1#

首先,你使用的是<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"/>

字符串

pgky5nke

pgky5nke2#

首先,你说 * 你不能在OGNL中嵌套表达式的求值 * 是不完全正确的。如果你看一下OGNL语言指南的表达式求值,你会发现如果你使用带括号的表达式,而括号前没有一个点,那么这个表达式的求值结果将被用作要求值的表达式。参见示例here
第二,我不明白为什么你得到的索引不是迭代器索引。
第三,set标记将变量放置到 value stack context 中,该上下文可以通过#表示法访问。参见示例here
第四,回答你的直接问题:
因为第四行有一个错字。将该行替换为

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

字符串
会做预期的事情。你可以看到表达的差异。
最后一个只是一个参考,它向您展示了应该在哪里使用%{}来强制表达式求值,因为Struts会解析OGNL标记属性中的所有内容(默认情况下)。
The usage of %{} notation
在OGNL中用于强制将括号中的内容作为OGNL表达式进行计算。

相关问题