フォーム送信を同期的に処理する際のブラウザのリロード・バック操作対策として定番である、Post-Redirect-GetパターンをSpring MVCで実装する方法を調査した。
まとめ
- Controllerメソッドでリダイレクトするには
redirect:{View}
を返却する。(参考) - Postメソッドを受けるControllerメソッドから、リダイレクト後のGetメソッドを受けるControllerメソッドにデータを渡すには、Flash Attributeを利用する。
- バリデーション結果の引継ぎはTymeleafテンプレートで参照できるように以下のキー名でFlash Attributeに格納する。
org.springframework.validation.BindingResult.{クラス名 (camel case)}
- リダイレクト後に、初回のフォーム表示をしたControllerメソッドに戻る場合は、以下のいずれかの実装とする必要がある。
- Controllerメソッドの引数のフォーム用モデルとする場合は、Flash Attributeのバリデーション結果をモデルにコピーする。
- バリデーション結果を保管するBindingResultモデルが空のインスタンスで設定され、Tymeleafテンプレートでバリデーション結果を表示できなくなるため。
- Controllerメソッドの引数をフォーム用モデルでなくModelインターフェースにする。
- この場合は初回フォーム表示時のNullPointerException発生を避けるために自分でフォーム用モデルの初期化をする必要がある。
- Controllerメソッドの引数のフォーム用モデルとする場合は、Flash Attributeのバリデーション結果をモデルにコピーする。
実装例
- コントローラ:ToDoController
- モデル:ToDoForm
- ビュー(テンプレート):form.html