Spring bootでHttpSessionを使用する
セッションを使用する
データが複数画面に跨ったり一定期間データを保持する必要があるデータの管理をすることがあるので…
イメージ
うん、適当だね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>
実行
↓
リロードしたあと
所感
セッションのデータの扱いはそこまで複雑ではないかと期待する。
Javaになるとロードバランサとか絡んでいくのでセッションの関与もちょっとややこしいことになりそうだけど
扱い自体はそこまで手間をかけたくないので…