我得到了使用Struts2框架的JSP页面的以下代码
<s:form id="crud" action="crudmerge" namespace="templates">
<s:hidden name="crudMode" />
<s:hidden name="item.id" />
...
<s:if test="crudMode == 1">
...
</s:if>
<s:else>
<s:if test="%{version != null}">
...
</s:if>
<s:else>
...
</s:else>
</s:else>
</s:form>
在导致此JSP页面的操作类中,有以下方法(以及其他方法):getCrudMode()
、getItem()
和item有一个名为getId()
的方法。
我理解struts2将如何使用这些方法来填充<s:hidden>
标记。然而,我在以下线路上遇到了问题:
<s:if test="%{version != null}">
首先,我认为这与其他两个方法相同,并且Struts2将运行操作类的getVersion()
方法。但是,没有称为version
的字段,也没有方法getVersion()
。JSP中也没有<s:set name="version">
变量标记。这个代码可能有什么意义?%{}
真的有必要吗?
这可能是需要删除的遗留代码,但我不确定前两个crudmode
和item.id
与后一个%{version}
之间有什么区别。
在s:if
标记的test
属性中,不需要放置%{}
。此缩写用于标记OGNL表达式的范围,并在评估前删除。在评估时,它在valueStack
中搜索变量version
。动作对象位于valueStack
的top
上,因此如果它找到名称为version
的属性,它将执行getVersion()
以返回结果。如果它在操作中没有找到version
,它将继续搜索整个valueStack
,直到找到名称为version
的属性。文档中描述了更多或类似的内容。
XWork有一个特殊的OGNL PropertyAccessor,它将自动看起来在堆栈中的所有条目(从上到下),直到它找到具有您要查找的属性的对象。