Flash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、Flash Scopeで渡したパラメータが自動的に削除されるため、セッションの場合と違い、終了後にパラメータを削除する処理は不要となる。
今回は、Flash Scopeを利用してリダイレクト先にパラメータを渡してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。
コントローラクラスの内容は以下の通りで、リダイレクト遷移するconfirmメソッド内で、FormオブジェクトをFlash Scopeで渡している。また、リダイレクト後のconfirm_redirectメソッド・completeメソッドで、FormオブジェクトをFlash Scopeから取得している。
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から取得し表示している。
<!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ファイルの内容は以下の通り。
<!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><!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クラスの内容は以下の通り。
package com.example.demo;
import lombok.Data;
@Data
public class DemoForm {
/** 名前 */
private String name;
/** メモ */
private String memo;
}さらに、build.gradleの内容は以下の通りで、Lombokを利用できるようにしている。
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クラスで取得できる。









