Struts2以不同的方式传递数据



我得到了使用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">变量标记。这个代码可能有什么意义?%{}真的有必要吗?

这可能是需要删除的遗留代码,但我不确定前两个crudmodeitem.id与后一个%{version}之间有什么区别。

s:if标记的test属性中,不需要放置%{}。此缩写用于标记OGNL表达式的范围,并在评估前删除。在评估时,它在valueStack中搜索变量version。动作对象位于valueStacktop上,因此如果它找到名称为version的属性,它将执行getVersion()以返回结果。如果它在操作中没有找到version,它将继续搜索整个valueStack,直到找到名称为version的属性。文档中描述了更多或类似的内容。

XWork有一个特殊的OGNL PropertyAccessor,它将自动看起来在堆栈中的所有条目(从上到下),直到它找到具有您要查找的属性的对象。

最新更新