Spring Boot 基本

Flash Scopeでリダイレクト先にパラメータを渡してみた

Flash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、Flash Scopeで渡したパラメータが自動的に削除されるため、セッションの場合と違い、終了後にパラメータを削除する処理は不要となる。

今回は、Flash Scopeを利用してリダイレクト先にパラメータを渡してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

コントローラクラスの内容は以下の通りで、リダイレクト遷移する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:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される
サンプルプログラムの実行_1

2) 名前・メモを入力し「確認」ボタンを押下
サンプルプログラムの実行_2

3) 以下のように、確認画面に遷移することが確認できる
サンプルプログラムの実行_3

4) このときのコンソールログの内容は以下の通りで、confirm_redirectメソッドで、FormオブジェクトをFlash Scopeから取得できることが確認できる
サンプルプログラムの実行_4

5) 「登録」ボタンを押下
サンプルプログラムの実行_5

6) 以下のように、完了画面に遷移することが確認できる
サンプルプログラムの実行_6

7) このときのコンソールログの内容は以下の通りで、completeメソッドで、Flash ScopeのFormオブジェクトがクリアされていることが確認できる
サンプルプログラムの実行_7

要点まとめ

  • FlashScopeを利用すると、リダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、Flash Scopeで渡したパラメータが自動的に削除される。
  • FlashScopeでパラメータを渡すには、RedirectAttributesクラスのaddFlashAttributeメソッドを利用すればよい。
  • FlashScopeで渡したパラメータは、Modelクラスで取得できる。