リダイレクトとフォワード時に、パラメータを受け渡す方法を確認します。
なお、STS3(3.9.6)+SpringBoot2.0+tymeleaf3.0迄動作確認しています。
Springにおけるリダイレクトとフォワード
リダイレクトとフォワードの一般的な解説はこちらのほうがわかりやすいです。
ここでは、Springにおけるリダイレクトとフォワードについてに絞ります。
Springにおけるリダイレクトとフォワードは、以下の違いがあります。
- フォワード:URLは変わりません。パラメータも継承されます。
- リダイレクト:URLは変わります。パラメータも継承されません。
ちょっとわかりづらいので、実際のコードと例で説明します。
いずれも、/localhost:8080/index?msg=TEST のURLから、/localhost:8080/hello?msg=TEST に飛ばします。
まず、フォワードです
@RequestMapping("/index")
public String helo(@RequestParam(defaultValue = "NOT INDEX PARAM") String msg,Model model) {
return "forward:hello";
}
これは簡単です。forward: を遷移先の前につけるだけです。これだけで、msgに渡されたパラメータの値が、そのままhelloに渡されて、TESTという値が表示されます。
この時、表示されている画面は"hello.html"の画面なんですけど、ブラウザに表示されているURLは「/localhost:8080/index?msg=TEST」のままになるというのが、フォワードのミソです。
次に、リダイレクトです
@RequestMapping("/index")
public String helo(@RequestParam(defaultValue = "NOT INDEX PARAM") String msg,RedirectAttributes redirectAttribute) {
redirectAttribute.addAttribute("msg", msg);
return "redirect:hello";
}
リダイレクトの場合は、パラメータを自分で渡してやる必要がありますので、受け渡しに使う「RedirectAttributes」を引数に加える必要があります。
そして、「redirectAttribute.addAttribute("msg", msg);」のようにして、明示的にセットして、遷移先の指定に「redirect:」をつけます。
実行すると、フォワードの時と同じように、「hello.html」が表示されるのですが、このときのブラウザのURLは「/localhost:8080/hello?msg=TEST」のように「hello」に変わってます。
フォワードとリダイレクトをどう使い分けるのか?
同じことができるなら、どう使い分けるのか?という疑問がでてきます。
実際。
同じプロジェクト内のページに飛ぶのに、redirect:を使う理由は思いつきません。
処理効率も悪いですし、面倒な手続きは増えますし。
でも、フォワードは内部のページにしかとべませんが、リダイレクトは全く関係ない外部のページにもとべます。
たとえば、
return "redirect:http://arakan-pgm-ai.hatenablog.com/";
のようにすると、”BOKU"のブログのトップページにとべます。
これらを頭にいれて、使い所を考えるということですね。
STS +Spring Boot +thymeleaf 関連記事
入力画面に関連する記事
参照画面・画面遷移に関連する記事
参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。
入力チェックに関連する記事
入力チェック:@Patternと正規表現で独自チェックする。
入力チェック用アノテーション定義を自分で作る。(独自実装版)
データアクセス・その他に関連する記事