在struts2中通过GET或POST控制操作方法

时间:2011-09-07 18:32:58

标签: java jsp struts2

我是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请求?

2 个答案:

答案 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方法的简单方法。

这是不是一个好主意......不同的问题。