Struts2 2.5 - 同一表单中的多个操作

Struts2 2.5 - Multiple actions in same form

我想在同一个表单中调用不同的操作。在我开发的以前的应用程序中,它运行良好,(见下面的代码),但现在我已经将版本从 Struts 2.1.6 切换到 2.5.8,但它不工作。

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

注:我是从struts.xml的角度来调用"action"的。每个操作从相同的 class *Action.java 调用不同的方法。此 .java class 的所有操作都分组在 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. 极其重要:迁移到 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,您需要显式启用action:前缀(由<s:submit>标签中的action=""属性生成)在 struts.xml 中:

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

此外,不鼓励使用 action: 前缀方法来对抗更稳健的解决方案(例如根据 <submit> 按钮已被按下)但是,如果你愿意,你仍然可以启用和使用它,没有什么大问题。