Struts2以不同的方式传递数据

时间:2013-11-28 09:37:39

标签: java jsp struts2 ognl valuestack

我获得了以下使用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页面的action类中,有以下方法(以及其他方法):getCrudMode()getItem(),item有一个名为getId()的方法。

我理解struts2将如何使用这些方法填充<s:hidden>标记。我遇到了以下问题:

 <s:if test="%{version != null}">

首先,我认为这与其他两个相同,Struts2将运行action类的getVersion()方法。但是,没有名为version的字段,也没有方法getVersion()。 JSP中也没有<s:set name="version">变量标记。这段代码可能是什么意思? %{}真的有必要吗?

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

1 个答案:

答案 0 :(得分:1)

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

  

XWork有一个特殊的OGNL PropertyAccessor会自动显示   在堆栈中的所有条目(从上到下)直到找到   具有您正在寻找的属性的对象。