Spring MVC 3 REST PUT和POST用于更新和保存

时间:2013-01-01 13:42:18

标签: java rest spring-mvc

我的AccountController中有一个方法,如

 @RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT })
    public String update(@ModelAttribute Account account) {
this.getAccountDao().save(account);
return "redirect:/users/account/";
}

我正在使用org.springframework.web.filter.HiddenHttpMethodFilter,所以我的视图有一个隐藏的表单字段为 -

<form:form method="POST" modelAttribute="account">
      <input type="hidden" name="_method" value="PUT" />
....

现在我的问题是控制器如何知道何时创建新帐户或更新它或如何知道请求是POST还是PUT?对我而言,它总是看起来像是PUT。

我只是不喜欢使用除GET和POST之外的任何东西。控制器无需关心是否需要创建新的或更新它。如果表单具有隐藏的帐户ID字段,则服务可以确定要调用的DAO方法。

修改 如果这只是一个PUT请求,那么我需要为POST创建一个新的jsp。不幸的是,两个请求非常相似,因为它们需要提交几乎完全准确的数据,除了帐户ID。我希望能够从控制器使用相同的方法,并为POST和PUT使用相同的jsp,并且取决于模型 - 保存或更新帐户。

1 个答案:

答案 0 :(得分:3)

控制器不知道您是创建还是更新实体,它只知道方法作出反应的RequestMethod

您指定的隐藏字段和您正在使用的HiddenHttpMethodFilter导致PUT成为HTTP方法,对您的控制器可见,因为过滤器会更改请求中的方法。 (根据javadocs)。

结果,浏览器使用POST将其数据传输到服务器,然后Filter运行并将请求中的方法更改为PUT,因此对于后面的应用程序Filter看起来请求已与PUT一起发送。

我没有看到代码非常相似的问题,只是将类似的行为归结为另一种方法..例如:

@RequestMapping(method = { RequestMethod.POST})
public String update(@ModelAttribute Account account) {
     // do POST specific things..

      // and common operations
      commonOperation();
}

@RequestMapping(method = { RequestMethod.PUT })
public String updateWithPut(@ModelAttribute Account account) {
      // do PUT specific things...

      // and common operations
      commonOperation();
}

// code that put and post methods have in common
private void commonOperation() {
 // a lot of common code
 // that needs to be done
}