2017-05-09 40 views
1

我想以相同的形式调用不同的动作。在我开发的以前的应用程序中,它工作的很好,(请参阅下面的代码),但现在我已经将Struts 2.1.6的版本切换到2.5.8,并且它不工作。Struts2 2.5 - 多个相同形式的动作

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的操作是列表。

谢谢!

回答

1
  1. 极其重要:迁移到2.5.10.1,而不是2.5.8。
    2.5.10.1之前的任何2.5版本(以及任何最近的2.3版本,在2.3.32之前)都容易出现严重安全问题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:前缀的方法是不鼓励对更强大的解决方案(如使用JavaScript根据该<submit>按钮被按下改变<form>target),但是,如果你愿意,你还可以启用和使用它,没有什么大问题。

+0

+1并同意@Andrea Ligios。即使如此,仅仅因为Struts允许你将多个动作映射到同一个类,这并不意味着你应该这样做。相反,考虑重构你的行为,这样每个人都有一个责任。这将减少耦合,改善动作类的凝聚力,简化配置和单元测试,并减少缺陷。 –

+0

我在struts.xml中添加了常量,并且工作正常。我已经想过Javascript解决方案,但我不想让事情复杂化。但是,我会考虑它。 感谢版本警告。你是我的英雄! – mardo

+0

不客气mardo :) @MichaelPeacock相关:http://stackoverflow.com/a/35689796/1654265(和http://stackoverflow.com/a/13530194/1654265) –