SpringBoot @SessionScopeでセッションを使用

Spring Bootの@SessionScopeでセッションを使用するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11,thymeleaf3)

目次

サンプル @SessionScopeでセッションを使用する
  エンティティのクラス(Syain.java)
  コントローラのクラス(MainController.java)
  値を送信する側のファイル(index.html)
  コントローラのクラス(SubController.java)
  値を受け取る側のファイル(testform.html)
  実行して確認する

@SessionScopeでセッションを使用する

画面表示時にMainControllerクラスにアクセスし
オブジェクトを生成してセッションに保持します。
ボタン押下でSubControllerクラスにアクセスし
画面遷移しセッションに保持したオブジェクトの値を画面に表示します。

@SessionScopeの有効範囲は、複数のControllerをまたげます。

以下のURLで確認します。
http://localhost:8765/test1/

@SessionScope は、@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)と同じです。

以下は、アノテーション型 SessionScopeのリンクです。
https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/annotation/SessionScope.html

githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-session-scope

 

エンティティのクラス(Syain.java)

package com.example.demo;

import java.io.Serializable;

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;
//import org.springframework.context.annotation.Scope;
//import org.springframework.context.annotation.ScopedProxyMode;

@Component
@SessionScope
//@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Syain implements Serializable {
	private static final long serialVersionUID = 1L;
	private String name;

	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

11行目はSessionScopeアノテーションです。
10行目に@ComponentがあるのでDI対象です。
@SessionScopeをコメントにし、7,8,12行目の@Scope関連の行のコメントを外しても同じ結果になります。

 

コントローラのクラス(MainController.java)

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
	@Autowired Syain syain;

	@GetMapping("/test1")
	public String input1(Model model) {
		
		syain.setName("suzuki");
		model.addAttribute(syain);
		return "test1/index";
	}
}

10行目は、@AutowiredがありSyainクラスのインスタンスがセットされます。
15行目は、セッションにあるオブジェクトに値をセットしています。

 

値を送信する側のファイル(index.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>submit</title>
  </head>
  <body>
    <form method="post" th:action="@{/testform}">
      <p th:text="${syain.name}"></p>
      <p>メモ:<input type="text" name="textMemo" /></p>
      <input type="submit" value="送信ボタン" />
    </form>
  </body>
</html>

9行目は、オブジェクトの値を表示します。
8行目のth:actionの宛先は、SubControllerクラスを指しています。

 

コントローラのクラス(SubController.java)

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class SubController {
	@Autowired Syain syain;
	
	@PostMapping("/testform")
	public String output1(@RequestParam String textMemo, Model model 
			) {
		model.addAttribute("memo", textMemo);
		model.addAttribute(syain);
		return "test1/testform";
	}
}

17行目は、セッションのオブジェクトをセットしています。

 

値を受け取る側のファイル(testform.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>submit</title>
  </head>
  <body>
    <p th:text="${syain.name}"></p>
    <p th:text="${memo}"></p>
  </body>
</html>

8行目は、オブジェクトの値を表示します。

 

実行して確認する

springbootアプリケーションを起動してブラウザに以下のURLを入力するとindex.htmlが画面に表示されます。
※プロジェクトを右クリックしてSpring Bootアプリケーションをクリック。

http://localhost:8765/test1/

画面表示時にセッションのオブジェクトの値を表示します。
値を入力してボタンを押すと別の画面に移動し、セッションに保持したオブジェクトの値を表示します。

関連の記事

SpringBoot フォームで入力チェック(バリデーション)
SpringBoot フォームとエンティティでDB登録

△上に戻る