概要
Spring MVCにて@SessionAttributesを使用して、HTTPセッションを利用する方法についてまとめた。
@SessionAttributesは、1つのコントローラー内にて複数のリクエスト間で共有するオブジェクトを、HTTPセッションで管理するために使用する。
この記事では、@SessionAttributesのtypes属性を用いたHTTPセッションの基本的な使い方について紹介する。
前提
Spring MVCの基本的なGETとPOST方法については以下を参照。
概要 Spring MVCにてクライアント側からGETまたはPOSTリクエストを行ってパラメータを取得する方法についてまとめた。 前提 Mavenプロジェクトの作成方法と基本的な画面疎通については以下を参照。 […]
基本的な使い方
@SessionAttributesは、SpringMVCにおいてHTTPセッションを「コントローラー単位」で安全に管理するための仕組みとなる。
このアノテーションは、javax.servlet.http.HttpSessionを直接操作する代わりに、
Modelに追加されたオブジェクトを自動でセッションに同期保存できるようにラップしたものになる。
基本的には以下の流れで使用する。
② 対象オブジェクトのModel操作でセッションに同期
③ セッション操作が完了したら削除
セッション管理オブジェクトの指定
コントローラーに@SessionAttributesを付与し、types属性にHTTPセッションで管理させたいオブジェクトの型を指定する。
HogeController.java
@Controller
@RequestMapping(value = "hoge")
@SessionAttributes(types = { HogeForm.class })
public class HogeController {
アノテーションのtypes属性にHogeForm型を指定することで、
Modelに追加されるHogeForm型オブジェクトは自動でセッションに保存されることになる。
※複数管理したいオブジェクトが存在する場合、カンマ区切りで指定する
セッション管理オブジェクトの格納
セッションで管理するオブジェクトを、Modelに追加して初期化する。
HogeController.java
@ModelAttribute
public HogeForm setUpForm() {
return new HogeForm();
}
public HogeForm setUpForm() {
@ModelAttributeを付けたメソッドが実行されると、その戻り値(ここではHogeFormのインスタンス)がModelに格納される。
さらに、HogeFormは@SessionAttributesにて指定されているため、Modelに追加されたこのオブジェクトは型一致によって、自動的にセッションにも保存される。
セッション管理オブジェクトの利用
セッション内のオブジェクトを利用する場合、Model内の対象オブジェクトを操作する。
HogeController.java
@PostMapping(value = "/foo")
public String foo(HogeForm form) {
form.setInput01("書き換え");
return "redirect:/hoge/foo";
}
public String foo(HogeForm form) {
ハンドラメソッドの引数にHogeForm型を指定することで、Model内にある同型のオブジェクトを取得できる。
また、@SessionAttributesで型を指定しているため、型一致によりオブジェクトが取得されることから、@ModelAttributeの明示は不要となる。
さらに、POSTリクエストハンドラの引数にHogeFormを指定しておくことで、リクエスト内容がバインドされた際に、セッション内のHogeFormにも自動的に更新内容が反映される。
Modelから取得したHogeFormの値を書き換えても、セッション内のHogeFormに自動で更新内容が反映される。
セッション管理オブジェクトの削除
セッションに保存したオブジェクトを削除する場合、SessionStatusを使用する。
HogeController.java
@GetMapping(value = "/complete")
public String complete(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "hoge/complete";
}
public String complete(SessionStatus sessionStatus) {
SessionStatusはハンドラメソッドの引数にて取得できる。
@SessionAttributesにて指定した管理対象オブジェクトはすべて削除される。
Viewからのアクセス
セッションに保存したオブジェクトにアクセスする。
hoge.jsp
<tr>
<th>入力1: </th>
<td>${hogeForm.input01}</td>
</tr>
EL式を利用して${Modelで管理しているセッションオブジェクト.属性名}を指定することでアクセスできる。
まとめ
☑ @SessionAttributesのtypes属性に型を指定して、セッションに保存する対象を決める
☑ Modelを通じてセッション内のオブジェクトを更新する
☑ 処理の完了時にSessionStatus#setComplete()を呼び出して、セッションから削除する