アラカン"BOKU"のITな日常

あれこれ興味をもって考えたことを書いてます

画面遷移:リダイレクトとフォワードでパラメータを受け渡す STS 3.8.3(Spring Boot 1.5.1)+thymeleaf 

 前回、Spring Boot + thymeleaf でGET時のパラメータを受け取る方法の確認をしました。

arakan-pgm-ai.hatenablog.com

 

そうすると、通常(例えば、return "hello" で、hello.htmlを呼び出すような)以外の画面遷移=リダイレクトとフォワード時に、どうやってパラメータを受け渡すのだろうか?という疑問がわきます。

 

ということで、今回はそれを確認していきます。

 

リダイレクトとフォワードとはそもそもなんぞやというのは、JavaTips 〜JSP/サーブレット編:リダイレクトとフォワードの違いを知る - @IT で非常にわからやすく説明されてます。わからない場合は、あわせて読んで下さい。

 

さて、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という値が表示されます。

f:id:arakan_no_boku:20170402220737j:plain

この時、表示されている画面は"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:」をつけます。

f:id:arakan_no_boku:20170402220737j:plain

実行すると、フォワードの時と同じように、「hello.html」が表示されるのですが、このときのブラウザのURLは「/localhost:8080/hello?msg=TEST」のように「hello」に変わってます。

 

ここまでで、結局、同じことができるなら、どう使い分けるのか?という疑問が当然のごとくわいてきます。

 

実際、同じプロジェクト内のページに飛ぶのに、redirect:を使う理由はあまり思いつきません。処理効率も悪いですし、面倒な手続きは増えますしね。

 

ただ、フォワードは内部のページにしかとべませんが、リダイレクトは全く関係ない外部のページにもとべます。

 

たとえば、

return "redirect:http://arakan-pgm-ai.hatenablog.com/";

のようにすると、”BOKU"のブログのトップページにとべます。

 

これらを頭にいれて、使い所を考えるということですね。

 

 


 STS  3.8.3(Spring Boot 1.5.1)+thymeleaf 関連記事

 

入力画面に関連する記事

画像をSUBMITボタン代わりに使う

ラジオボタンとラジオボタングループを使う 

ラジオボタンとラジオボタングループを使う 

チェックボックスを使う。 

HTMLのタグの閉じ忘れで例外が発生する!

プルダウンリストとマルチセレクトボックスを使う。

今度はテキストエリアで複数行入力する。 

テキストボックスの入力と基本的なチェックを使う。

 

参照画面・画面遷移に関連する記事

参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。 

参照画面:条件に一致した時のみHTML要素を出力する。

セッションを使って画面間で情報を受け渡す 

画面遷移:GET時のリクエストパラメータを受け取る 

日本語しか使わなくても、i18N対応はする意味がある。

 

入力チェックに関連する記事

入力チェック:未入力時に空文字が渡される仕様を回避する。 

入力チェック:@Patternと正規表現で独自チェックする。

入力チェック:アノテーション定義を自分で作る。(再利用版)

入力チェック用アノテーション定義を自分で作る。(独自実装版)

入力チェック:複数項目の相関チェックアノテーションの作り方

 

データアクセス・その他に関連する記事

データアクセス:Jprepositoryを使って簡単にCRUDする。 

データアクセス:ネイティブなSQL文を実行する 

クラスパス内の静的ファイルにアクセスする 

SpringBootだとログの書き出しも楽ちんです。 

SpringBootプロジェクトでJUNIT4を使った単体テストをする。

 

f:id:arakan_no_boku:20170404203859j:plain