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

标签 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. 极其重要:迁移到 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: struts.xml 中的前缀(由 action="" 标记中的 <s:submit> 属性生成):

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

还有action:不建议使用前缀方法来使用更强大的解决方案(例如根据已按下的 target 按钮,使用 Javascript 更改 <form><submit>),但是,如果您愿意,您仍然可以启用和使用它,那里没有什么大问题。

关于java - Struts2 2.5 - 同一表单中的多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43870835/

相关文章:

java - 如何更改 JavaFX 8 警报对话框中是/否按钮的文本

java - Android进度条填充

java - 在数组列表中存储值并打印它

javascript - 从 javascript 调用时,jnlp 文件中的 URL 编码不正确

java - 为第二个身份验证因素创建过滤器

java - 在 Gae 上创建一个大的 Zip 文件(在 blobstore 中)

Java正则表达式-用前导特殊字符分割字符串

forms - HTML5 是否需要表单的 action 属性?

javascript - HTML 多页表单显示隐藏部分保留表单数据

c# - 确保文本框的第一个和最后一个字符是数字c#