我是Struts2的新手,来自PHP背景,我经常有相同的文件处理GET和POST请求,如果请求是POST请求,则处理表单。
我目前在struts.xml中有以下内容:
<action name="ProcessData" class="ProcessDataAction">
<result name="*">processdata.jsp</result>
</action>
<action name="ProcessDataUpload" class="ProcessDataAction" method="upload">
<result name="*">processsdata.jsp</result>
</action>
哪种方法可以正常工作,但是处理POST的URL不同让我感到困扰,因为现在如果用户重新加载页面,他们会收到错误而不是简单地看到GET页面的内容。
所以我的问题是,有没有办法让struts2调用一个方法,如果它是一个GET请求,另一个方法,如果它是一个POST请求?
答案 0 :(得分:5)
Struts2不提供开箱即用的功能。如果您想强制某个特定的操作方法只能通过某些HTTP方法调用,那么您需要创建一个自定义拦截器,可能还需要一些自定义注释。
如果您只是想要同一个操作来处理显示表单并进行处理,那么您可以执行以下操作:
public class MyAction {
public String execute() {
return INPUT;
}
public void validate() {
// perform any form validation needed
}
public String submit() {
// process the form and then redirect
}
}
在您的表单中,您将提交给ProcessData!submit。的!将操作与操作方法名称分开。它提供了您已经拥有的内容,但您不需要在struts.xml中显式映射每个方法。
但令我困扰的是,处理POST的URL是不同的,因为现在如果用户重新加载页面,他们会收到错误而不是简单地看到GET页面的内容。
在成功发布后重定向用户会使此点无效。查看“Post Post After Post”或“Post / Redirect / Get”模式。)
答案 1 :(得分:1)
不是默认情况下,不是。 IMO最干净的解决方案是通过查看请求类型的拦截器来调整方法名称。例如,我有一个查找executeGet和executePost方法的简单方法。
这是不是一个好主意......不同的问题。