Java Struts2.5-相同形式的多个动作

Java Struts2.5-相同形式的多个动作,java,forms,jsp,struts2,action,Java,Forms,Jsp,Struts2,Action,我想以相同的形式调用不同的操作。在我以前开发的一个应用程序中,它工作得很好(见下面的代码),但现在我已经将Struts的版本从2.1.6切换到了2.5.8,它不工作了 在对的回答中,不鼓励以相同的形式使用不同的操作。相反,作者建议在同一个动作中调用不同的方法。这很好,但在我的应用程序中,我需要从多个位置调用这些操作/方法,而不仅仅是这个表单,因此我更愿意在struts.xml文件中分离这些操作调用 注意:我从struts.xml的角度调用“action”。每个操作都从同一个类*action.ja

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

在对的回答中,不鼓励以相同的形式使用不同的操作。相反,作者建议在同一个动作中调用不同的方法。这很好,但在我的应用程序中,我需要从多个位置调用这些操作/方法,而不仅仅是这个表单,因此我更愿意在struts.xml文件中分离这些操作调用

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

list.jsp中的表单:

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;
    }
    ...
}

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

struts.xml


错误
错误登录
列表对象
列表
列表对象
肖莫尔
编辑
列表
.
.
.
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;
    }
    ...
}
公共类ObjectAction扩展BaseActionCRUD实现模型驱动{
...
公共字符串showMore(){
...
回归成功;
}
公共字符串编辑(){
...
回归成功;
}
公共字符串删除(){
...
回归成功;
}
公共字符串列表(){
...
回归成功;
}
...
}
那么,如何在Struts 2.5.8中实现同样的功能呢

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

谢谢

  • 极其重要:迁移到
    2.5.10.1
    ,而不是2.5.8
    2.5.10.1
    之前的任何2.5版本(以及
    2.3.32
    之前的任何最新2.3版本)都容易受到严重安全问题的攻击

  • 由于
    2.3.15.3
    ,您需要在struts.xml中显式启用
    操作:
    前缀(由
    标记中的
    操作=”
    属性生成),并使用:

    
    
  • method=”“
    前缀,称为DMI(动态方法调用),在您链接的2011年的答案中建议使用,现在已被弃用,完全不鼓励使用


  • 另外,
    操作:
    前缀方法不鼓励使用更健壮的解决方案(例如,根据按下的
    按钮,使用Javascript更改
    目标),但是,如果需要,您仍然可以启用并使用它,这没有什么大问题。

    +1并同意@Andrea Ligios的观点。即便如此,仅仅因为Struts允许您将多个操作映射到同一个类,并不意味着您应该这样做。相反,考虑重构你的行为,这样每个人都有一个责任。这将减少耦合,提高动作类的内聚性,简化配置和单元测试,并减少缺陷。我已经考虑过Javascript解决方案,但我不想让事情复杂化。不过,我会考虑的。谢谢你的版本警告。你是我的英雄!不客气,马多:)@MichaelPeacock相关:(和)