Flash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、Flash Scopeで渡したパラメータが自動的に削除されるため、セッションの場合と違い、終了後にパラメータを削除する処理は不要となる。
今回は、Flash Scopeを利用してリダイレクト先にパラメータを渡してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。
コントローラクラスの内容は以下の通りで、リダイレクト遷移するconfirmメソッド内で、FormオブジェクトをFlash Scopeで渡している。また、リダイレクト後のconfirm_redirectメソッド・completeメソッドで、FormオブジェクトをFlash Scopeから取得している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller public class DemoController { /** * Formオブジェクトを初期化して返却する * @return Formオブジェクト */ @ModelAttribute("demoForm") public DemoForm createDemoForm(){ DemoForm demoForm = new DemoForm(); return demoForm; } /** * 入力画面に遷移する * @return 入力画面へのパス */ @GetMapping("/") public String index(){ return "input"; } /** * 確認画面に遷移するためのリダイレクト遷移を行う * @param demoForm demoFormオブジェクト * @param mav ModelAndViewオブジェクト * @param redirectAttributes リダイレクト先に渡す属性 * @return ModelAndViewオブジェクト */ @PostMapping("/confirm") public ModelAndView confirm(DemoForm demoForm, ModelAndView mav , RedirectAttributes redirectAttributes){ System.out.println("confirmメソッド demoForm : " + demoForm); // リダイレクト先に渡したいFormオブジェクトをFlash Scopeに格納 redirectAttributes.addFlashAttribute("demoForm", demoForm); mav.setViewName("redirect:/confirm_redirect"); return mav; } /** * 確認画面に遷移する * @param mav ModelAndViewオブジェクト * @param model Modelオブジェクト * @return ModelAndViewオブジェクト */ @GetMapping("/confirm_redirect") public ModelAndView confirm_redirect(ModelAndView mav, Model model){ // Flash ScopeからFormオブジェクトを取得し、Formオブジェクトの各値が // 取得できることを確認 DemoForm demoForm = (DemoForm)model.asMap().get("demoForm"); System.out.println("confirm_redirectメソッド demoForm : " + demoForm); mav.setViewName("confirm"); return mav; } /** * 完了画面に遷移する * @param mav ModelAndViewオブジェクト * @param model Modelオブジェクト * @return ModelAndViewオブジェクト */ @PostMapping("/complete") public ModelAndView complete(ModelAndView mav, Model model){ // Flash ScopeからFormオブジェクトを取得し、Formオブジェクトがクリアされている // ことを確認 DemoForm demoForm = (DemoForm)model.asMap().get("demoForm"); System.out.println("completeメソッド demoForm : " + demoForm); mav.setViewName("complete"); return mav; } } |
また、確認画面のHTMLファイルの内容は以下の通りで、FormオブジェクトをFlash Scopeから取得し表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>確認画面</title> </head> <body> <p>入力内容を確認してください。</p><br/> <form method="post" th:action="@{/complete}" th:object="${demoForm}"> <!-- 下記に、Flash Scopeに格納したFormオブジェクトの名前・メモが取得される --> <span th:text="'名前: ' + *{name}">ここに名前が表示されます</span> <br/> <span th:text="'メモ: ' + *{memo}">ここにメモが表示されます</span> <br/><br/> <input type="submit" value="登録" /> </form> </body> </html> |
その他、入力画面・完了画面のHTMLファイルの内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>入力画面</title> </head> <body> <p>下記必要事項を記載の上、「確認」ボタンを押下してください。</p><br/> <form method="post" th:action="@{/confirm}" th:object="${demoForm}"> 名前: <input type="text" th:value="*{name}" th:field="*{name}" /> <br/> メモ: <input type="text" size="40" maxlength="40" th:value="*{memo}" th:field="*{memo}" /> <br/><br/> <input type="submit" value="確認" /> </form> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 | <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>完了画面</title> </head> <body> <p>お申し込みが完了しました。 </p><br/> <input type="button" value="閉じる" onclick="window.close();" /> </body> </html> |
また、Formクラスの内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.example.demo; import lombok.Data; @Data public class DemoForm { /** 名前 */ private String name; /** メモ */ private String memo; } |
さらに、build.gradleの内容は以下の通りで、Lombokを利用できるようにしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' //lombokを利用するための設定 compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' } |
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される
4) このときのコンソールログの内容は以下の通りで、confirm_redirectメソッドで、FormオブジェクトをFlash Scopeから取得できることが確認できる
7) このときのコンソールログの内容は以下の通りで、completeメソッドで、Flash ScopeのFormオブジェクトがクリアされていることが確認できる
要点まとめ
- FlashScopeを利用すると、リダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、Flash Scopeで渡したパラメータが自動的に削除される。
- FlashScopeでパラメータを渡すには、RedirectAttributesクラスのaddFlashAttributeメソッドを利用すればよい。
- FlashScopeで渡したパラメータは、Modelクラスで取得できる。