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かをどのように知るかです。私には、それは常に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 に答える