Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。
リダイレクトとフォワードの違いについては、以下のサイトを参照のこと。
https://www.atmarkit.co.jp/ait/articles/0407/06/news077.html
今回は、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡すサンプルプログラムを作成してみたので、共有する。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。
初期表示画面の内容は以下の通りで、リダイレクト遷移とフォワード遷移を行うボタンを配置している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>index page</title> </head> <body> これは初期表示画面です。 <br/><br/> <form method="post" th:action="@{/toRedirect}"> <input type="submit" value="リダイレクト遷移" /> </form><br/><br/> <form method="post" th:action="@{/toForward}"> <input type="submit" value="フォワード遷移" /> </form><br/><br/> </body> </html> |
また、メイン画面の内容は以下の通りで、リダイレクト遷移・フォワード遷移により渡されたパラメータを表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>main page</title> </head> <body> メイン画面に遷移しました。<br/><br/> 押下されたボタン: <span th:text="${pushedBtn}">pushedBtnの値</span><br/> 通過したメソッド: <span th:text="${passedMethod}">passedMethodの値</span> <br/><br/> <form method="post" th:action="@{/toIndex}"> <input type="submit" value="戻る" /> </form> </body> </html> |
さらに、コントローラクラスの内容は以下の通りで、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡す処理を実装している。
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 82 83 | package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller public class DemoController { /** * 初期表示画面に遷移する * @return 初期表示画面 */ @GetMapping("/") public String index(){ return "index"; } /** * メイン画面にGETメソッドで遷移する * @param model Modelオブジェクト * @return メイン画面 */ @GetMapping("/toMainGet") public String toMainGet(Model model){ model.addAttribute("passedMethod", "toMainGetメソッド"); return "main"; } /** * メイン画面にPOSTメソッドで遷移する * @param model Modelオブジェクト * @return メイン画面 */ @PostMapping("/toMainPost") public String toMainPost(Model model){ model.addAttribute("passedMethod", "toMainPostメソッド"); return "main"; } /** * リダイレクトでメイン画面に遷移する * @param redirectAttributes リダイレクト属性値 * @return メイン画面 */ @PostMapping("/toRedirect") public String toRedirect(RedirectAttributes redirectAttributes){ // メイン画面に渡す値を設定する // リダイレクト遷移する場合はFlash Scopeを利用する redirectAttributes.addFlashAttribute("pushedBtn", "リダイレクト遷移ボタン"); // リダイレクトでメイン画面に遷移する // このとき、リダイレクト遷移先はGETメソッドとする return "redirect:/toMainGet"; } /** * フォワードでメイン画面に遷移する * @param model Modelオブジェクト * @return メイン画面 */ @PostMapping("/toForward") public String toForward(Model model){ // メイン画面に渡す値を設定する // フォワード遷移する場合はModelオブジェクトに値を設定する model.addAttribute("pushedBtn", "フォワード遷移ボタン"); // フォワードでメイン画面に遷移する // このとき、リダイレクト遷移先はPOSTメソッドのままとする return "forward:/toMainPost"; } /** * 初期表示画面に戻る * @return 初期表示画面 */ @PostMapping("/toIndex") public String toIndex(){ return "index"; } } |
また、コンフィグクラスの内容は以下の通りで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐようにしている。
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 | package com.example.demo; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.SessionTrackingMode; import java.util.Collections; @Configuration public class DemoConfigBean { /** * 初回アクセス時に、URLにjsessionidが付与されるのを防ぐためのBean定義 * @return ServletContextInitializerオブジェクト */ @Bean public ServletContextInitializer servletContextInitializer() { ServletContextInitializer initializer = servletContext -> { servletContext.setSessionTrackingModes( Collections.singleton(SessionTrackingMode.COOKIE) ); }; return initializer; } } |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-redirect-forward/demo
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下のように、初期表示画面が表示されることが確認できる。
2) 「リダイレクト遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、リダイレクト遷移先である「toMainGet」メソッドのURLとなっている。
4) 「フォワード遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、フォワード遷移元である「toForward」メソッドのURLとなっている。
5) 次に、以下のように、DemoConfigBean.javaの「@Bean」アノテーションを無効にし、「初回アクセス時に、URLにjsessionidが付与されるのを防ぐためのBean定義」を無効にする。
6) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセス後、「リダイレクト遷移」ボタンを押下すると、URLにjsessionidが付与されることが確認できる。
要点まとめ
- Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。
- 遷移先コントローラ指定時のパス先頭に、リダイレクト遷移するには「redirect:」を付与し、フォワード遷移するには「forward:」を付与すればよい。
- HTTP POSTメソッドで呼ばれた場合、リダイレクト遷移先はHTTP GETメソッドとなり、フォワード遷移先はHTTP POSTメソッドとなる。
- 遷移先にパラメータを渡す場合は、リダイレクト遷移時はFlash Scopeを利用し、フォワード遷移時はModelオブジェクトを利用すればよい。
- Spring Bootアプリケーションで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐ設定を行うこともできる。