2

我的 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?对我来说,它看起来总是会被放置。

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

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

4

1 回答 1

3

控制器不知道您是否创建或更新实体,它只知道RequestMethod方法响应的 s。

您指定的隐藏字段和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
}
于 2013-01-01T13:54:16.683 回答