Flash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができるが、Flash Scopeを利用してリダイレクト先にパラメータを受け渡すユーティリティを作成しておけば、コントローラクラス以外でもパラメータの受け渡しができるようになる。
今回は、そのユーティリティクラスを作成し呼び出してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
Flash Scopeでリダイレクト先にパラメータを渡してみたFlash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、F...
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。
Flash Scopeを利用してリダイレクト先にパラメータを渡すユーティリティクラスの内容は以下の通り。
package com.example.demo; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.FlashMap; import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest; import java.util.Map; public class DemoUtil { /** * リダイレクト先に渡すFormオブジェクトのキー */ private static final String REDIRECT_FORM_KEY = DemoUtil.class.getName().concat(".REDIRECT_FORM"); /** * リダイレクト先に渡したいFormオブジェクトをFlash Scopeに格納する * @param demoForm Formオブジェクト */ public static void setRedirectForm(DemoForm demoForm){ // 引数がnullの場合はIllegalArgumentExceptionをスロー if(demoForm == null){ throw new IllegalArgumentException("demoForm is null"); } // リクエストが取得できない場合はRuntimeExceptionをスロー HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); if(request == null){ throw new RuntimeException("request is null"); } // リダイレクト先に渡したいFormオブジェクトをFlash Scopeに格納 FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request); flashMap.put(REDIRECT_FORM_KEY, demoForm); } /** * リダイレクト先に渡したいFormオブジェクトをFlash Scopeから取得する * @return Formオブジェクト */ public static DemoForm getRedirectForm(){ // リクエストが取得できない場合はRuntimeExceptionをスロー HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); if(request == null){ throw new RuntimeException("request is null"); } // Flash ScopeからFormオブジェクトを取得 Map<String, ?> flashMap = RequestContextUtils.getInputFlashMap(request); if(flashMap != null){ return (DemoForm) flashMap.get(REDIRECT_FORM_KEY); } return null; } }
また、コントローラクラスの内容は以下の通り。
package com.example.demo; import org.springframework.stereotype.Controller; 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; @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オブジェクト * @return ModelAndViewオブジェクト */ @PostMapping("/confirm") public ModelAndView confirm(DemoForm demoForm, ModelAndView mav){ System.out.println("confirmメソッド demoForm : " + demoForm); // リダイレクト先に渡したいFormオブジェクトをFlash Scopeに格納 DemoUtil.setRedirectForm(demoForm); mav.setViewName("redirect:/confirm_redirect"); return mav; } /** * 確認画面に遷移する * @param mav ModelAndViewオブジェクト * @return ModelAndViewオブジェクト */ @GetMapping("/confirm_redirect") public ModelAndView confirm_redirect(ModelAndView mav){ // Flash ScopeからFormオブジェクトを取得し、Formオブジェクトの各値が // 取得できることを確認 DemoForm demoForm = DemoUtil.getRedirectForm(); System.out.println("confirm_redirectメソッド demoForm : " + demoForm); // 画面上でdemoFormの設定値を表示するために、戻り値のModelAndViewオブジェクトに // demoFormオブジェクトを設定 mav.addObject("demoForm", demoForm); mav.setViewName("confirm"); return mav; } /** * 完了画面に遷移する * @param mav ModelAndViewオブジェクト * @return ModelAndViewオブジェクト */ @PostMapping("/complete") public ModelAndView complete(ModelAndView mav){ // Flash ScopeからFormオブジェクトを取得し、Formオブジェクトがクリアされている // ことを確認 DemoForm demoForm = DemoUtil.getRedirectForm(); System.out.println("completeメソッド demoForm : " + demoForm); mav.setViewName("complete"); return mav; } }
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-flash-scope-util/demo
サンプルプログラムの実行結果
下記記事とほぼ同じ実行結果になる。
Flash Scopeでリダイレクト先にパラメータを渡してみたFlash Scopeを利用すると、セッションを使わなくてもリダイレクト先にパラメータを渡すことができる。また、リダイレクト終了後に、F...
ただし、出力ログを確認すると、completeメソッドのdemoFormの値がnullになっている点が異なっている。
要点まとめ
- Flash Scopeを利用してリダイレクト先にパラメータを受け渡すユーティリティを作成しておくと、コントローラクラス以外でもパラメータの受け渡しができるようになる。