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.
谢谢!
极其重要:迁移到 2.5.10.1
,而不是 2.5.8。
2.5.10.1
之前的任何 2.5 版本(以及 2.3.32
之前的任何最新 2.3 版本)都容易受到严重安全问题的影响,S2-045。
由于2.3.15.3
,您需要显式启用action:
前缀(由<s:submit>
标签中的action=""
属性生成)在 struts.xml 中:
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
method=""
前缀,称为 DMI(动态方法调用),在您链接的 2011 年答案中建议使用,现在已弃用并完全不鼓励使用。
此外,不鼓励使用 action:
前缀方法来对抗更稳健的解决方案(例如根据 <submit>
按钮已被按下)但是,如果你愿意,你仍然可以启用和使用它,没有什么大问题。
我想在同一个表单中调用不同的操作。在我开发的以前的应用程序中,它运行良好,(见下面的代码),但现在我已经将版本从 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.
谢谢!
极其重要:迁移到
2.5.10.1
,而不是 2.5.8。2.5.10.1
之前的任何 2.5 版本(以及2.3.32
之前的任何最新 2.3 版本)都容易受到严重安全问题的影响,S2-045。由于
2.3.15.3
,您需要显式启用action:
前缀(由<s:submit>
标签中的action=""
属性生成)在 struts.xml 中:<constant name="struts.mapper.action.prefix.enabled" value="true"/>
method=""
前缀,称为 DMI(动态方法调用),在您链接的 2011 年答案中建议使用,现在已弃用并完全不鼓励使用。
此外,不鼓励使用 action:
前缀方法来对抗更稳健的解决方案(例如根据 <submit>
按钮已被按下)但是,如果你愿意,你仍然可以启用和使用它,没有什么大问题。