我想以相同的形式呼叫不同的动作。在之前的应用程序中,我开发它很好用,(见下面的代码),但现在我已经将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。
谢谢!
答案 0 :(得分:1)
非常重要:迁移到 2.5.10.1
,而不是2.5.8。
2.5.10.1
之前的任何2.5版本(以及2.3.32
之前的任何最近的2.3版本)都容易受到严重安全问题的影响S2-045。
从2.3.15.3
开始,您需要在struts.xml中显式启用action:
前缀(由action=""
标记中的<s:submit>
属性生成)用:
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
名为DMI(动态方法调用)的method=""
前缀,在2011年您已经链接的答案中建议使用它,现在已弃用,完全不鼓励使用。
同样不建议使用action:
前缀方法来应对更强大的解决方案(例如根据已按下target
按钮的哪个按钮更改<form>
的{{1}} )但是,如果你愿意,你仍然可以启用和使用它,它没有大问题。