Spring Boot 基本

Spring Bootプロジェクトでリダイレクトとフォワードを実装してみた

Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。

リダイレクトとフォワードの違いについては、以下のサイトを参照のこと。
https://www.atmarkit.co.jp/ait/articles/0407/06/news077.html

今回は、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡すサンプルプログラムを作成してみたので、共有する。

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

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

初期表示画面の内容は以下の通りで、リダイレクト遷移とフォワード遷移を行うボタンを配置している。

<!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>

また、メイン画面の内容は以下の通りで、リダイレクト遷移・フォワード遷移により渡されたパラメータを表示している。

<!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>
「AOMEI Partition Assistant Standard(無料)版」は便利なパーティション管理ツールだったハードディスクの記憶領域を論理的に分割し、分割された個々の領域のことを、パーティションといいます。 例えば、以下の図の場合、C/D...

さらに、コントローラクラスの内容は以下の通りで、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡す処理を実装している。

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";
    }
}



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

また、コンフィグクラスの内容は以下の通りで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐようにしている。

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

「FlexClip」はテンプレートとして利用できる動画・画像・音楽などが充実した動画編集ツールだったテンプレートとして利用できるテキスト・動画・画像・音楽など(いずれも著作権フリー)が充実している動画編集ツールの一つに、「FlexCli...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下のように、初期表示画面が表示されることが確認できる。
サンプルプログラムの実行結果_1

2) 「リダイレクト遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、リダイレクト遷移先である「toMainGet」メソッドのURLとなっている。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2

3) 「戻る」ボタンを押下すると、初期表示画面に遷移する。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2

4) 「フォワード遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、フォワード遷移元である「toForward」メソッドのURLとなっている。
サンプルプログラムの実行結果_4_1

サンプルプログラムの実行結果_4_2

5) 次に、以下のように、DemoConfigBean.javaの「@Bean」アノテーションを無効にし、「初回アクセス時に、URLにjsessionidが付与されるのを防ぐためのBean定義」を無効にする。
サンプルプログラムの実行結果_5

6) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセス後、「リダイレクト遷移」ボタンを押下すると、URLにjsessionidが付与されることが確認できる。
サンプルプログラムの実行結果_6_1

サンプルプログラムの実行結果_6_2

要点まとめ

  • Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。
  • 遷移先コントローラ指定時のパス先頭に、リダイレクト遷移するには「redirect:」を付与し、フォワード遷移するには「forward:」を付与すればよい。
  • HTTP POSTメソッドで呼ばれた場合、リダイレクト遷移先はHTTP GETメソッドとなり、フォワード遷移先はHTTP POSTメソッドとなる。
  • 遷移先にパラメータを渡す場合は、リダイレクト遷移時はFlash Scopeを利用し、フォワード遷移時はModelオブジェクトを利用すればよい。
  • Spring Bootアプリケーションで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐ設定を行うこともできる。