m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Spring bootでHttpSessionを使用する

セッションを使用する

データが複数画面に跨ったり一定期間データを保持する必要があるデータの管理をすることがあるので…

イメージ

f:id:m_shige1979:20161126041412p:plain
うん、適当だねw

やること

  • コントローラーでセッションを使用する
  • データを渡すフォーム系のクラスをシリアライズ化する

実装

src/main/java/HelloController.java
package com.example;

import java.util.Date;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.example.beans.TestForm;

@Controller
public class HelloController {
	
	@Autowired
	HttpSession session;
	
	@RequestMapping(value = {"/"}, method = {RequestMethod.GET})
	public ModelAndView index(@ModelAttribute TestForm form) {
		
		// 生成
		ModelAndView mv = new ModelAndView();
		
		// テンプレートを指定
		mv.setViewName("index");
		
		// 日時を取得、設定
		mv.addObject("now", new Date().toString());
		
		// modelに設定して画面に表示するようにする
		mv.addObject("form", form);
		
		// 返却
		return mv;
	}
	
	// POST用のパラメータを受け取る
	@RequestMapping(value = {"/formPost"}, method = {RequestMethod.POST})
	public String postTest1(
			@ModelAttribute TestForm form) {
		
		// セッションへ保存
		session.setAttribute("form", form);
		
		// リダイレクト
		return "redirect:/formPostView";
	}
	
	// GET用のパラメータを受け取る
	@RequestMapping(value = {"/formPostView"}, method = {RequestMethod.GET})
	public ModelAndView getTest1() {
		
		// 生成
		ModelAndView mv = new ModelAndView();
		
		// テンプレートを指定
		mv.setViewName("test1/post");
		
		// セッションを取得
		TestForm form = (TestForm) session.getAttribute("form");
		if(null != form){
			// セッションよりデータを取得して設定
			mv.addObject("form", form);
		}
		
		// セッションクリア
		session.invalidate();
		
		// 返却
		return mv;
	}
	
}

※最後にセッションをクリアします

src/main/java/TestForm.java
package com.example.beans;

import java.io.Serializable;

public class TestForm implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4674112863194397526L;
	private String name;
	private String age;

	public String getName() {
		return name;
	}

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

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
}
src/main/resources/templates/test1/post.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Spring Sample Demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<h1>Spring Sample</h1>
	<div>
    	Post Data
	</div>
	<br />
	<form method="post" action="formPost">
		<span>name: </span>
		<span th:if="${form} != null" th:text="${form.name}"></span>
		<br />
		<span>age: </span>
		<span th:if="${form} != null" th:text="${form.age}"></span>
		<br />
	</form>
	<a href="/">back</a>
</body>
</html>

実行

f:id:m_shige1979:20161126044245p:plain

f:id:m_shige1979:20161126044258p:plain

リロードしたあと
f:id:m_shige1979:20161126044326p:plain

所感

セッションのデータの扱いはそこまで複雑ではないかと期待する。
Javaになるとロードバランサとか絡んでいくのでセッションの関与もちょっとややこしいことになりそうだけど
扱い自体はそこまで手間をかけたくないので…