Struts2 2.5 - 同一形式的多个动作

时间:2017-05-09 13:12:14

标签: java forms jsp struts2 action

我想以相同的形式呼叫不同的动作。在之前的应用程序中,我开发它很好用,(见下面的代码),但现在我已经将Struts 2.1.6的版本切换到2.5.8并且它无法正常工作。

this question的答案中,不鼓励使用相同形式的不同动作。相反,作者建议在同一个动作中调用不同的方法。这很好,但在我的应用程序中,我需要从几个地方调用这些操作/方法,而不仅仅是这种形式,所以我更愿意在struts.xml文件中分离动作调用。

注意:我从struts.xml的角度调用“action”。每个操作都调用与同一个类* Action.java不同的方法。此.java类的所有操作都分组在struts.xml的相同包中

list.jsp中的表单:

<s:form name="changeStatusForm" theme="simple" id="formList">
    <s:hidden id="idSelectedRow" name="idSelectedRow"/>
    <s:submit key="global.showMore" action="showMore" />
    <s:submit key="global.edit" action="edit"/>
    <s:submit key="global.delete" action="delete"/>
</s:form>

jsp是一个对象列表。当我单击一行时,会出现一个包含多个选项的菜单(表单中的那些选项)。所需对象的id收集在变量idSelectedRow中。

struts.xml中

<package name="object" namespace="/object" extends="authenticate-default">
    <result-types>
        <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
    </result-types>
    <global-results>
        <result name="error" type="tiles">error</result>
        <result name="errorLogin" type="tiles">errorLogin</result>
    </global-results>

    <action name="list" method="list" class="actions.ObjectAction"> 
        <result name="success" type="tiles">listObject</result>
        <result name="input" type="redirect">list</result>
        <result name="error" type="tiles">listObject</result>
    </action>
    <action name="showMore" method="showMore" class="actions.ObjectAction">
        <result name="success" type="tiles">showMore</result>
    </action>
    <action name="edit" method="edit" class="actions.ObjectAction">
        <result name="success" type="tiles">edit</result>
    </action>
    <action name="delete" method="delete" class="actions.ObjectAction">
        <result name="success" type="tiles">list</result>
    </action>

    .
    .
    .

</package>

Object.java:

public class ObjectAction extends BaseActionCRUD implements ModelDriven<ObjectDTO> {
    ...
    public String showMore() {
        ...
        return SUCCESS;
    }
    public String edit() {
        ...
        return SUCCESS;
    }
    public String delete() {
        ...
        return SUCCESS;
    }
    public String list() {
        ...
        return SUCCESS;
    }
    ...
}

那么,我怎样才能在 Struts 2.5.8 中做同样的事情?

现在,ObjectAction.java中执行的方法始终是list()而不是选定的方法。那是因为重定向到list.jsp的动作是list。

谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 非常重要:迁移到 2.5.10.1 ,而不是2.5.8。
    2.5.10.1之前的任何2.5版本(以及2.3.32之前的任何最近的2.3版本)都容易受到严重安全问题的影响S2-045

  2. 2.3.15.3开始,您需要在struts.xml中显式启用action:前缀(由action=""标记中的<s:submit>属性生成)用:

    <constant name="struts.mapper.action.prefix.enabled" value="true"/>
    
  3. 名为DMI(动态方法调用)的method=""前缀,在2011年您已经链接的答案中建议使用它,现在已弃用,完全不鼓励使用。

  4. 同样不建议使用action:前缀方法来应对更强大的解决方案(例如根据已按下target按钮的哪个按钮更改<form>的{​​{1}} )但是,如果你愿意,你仍然可以启用和使用它,它没有大问题。