RedirectAttributesを使ってみよう!
さて、本日は久々にSpring Bootの話です。
皆さんはWebアプリケーションを作る中で、「リダイレクト先にパラメータを渡したい!」なんてことはありませんでしょうか?
筆者は先日、そのような状況に鉢合わせたのですが、ググってみてもなかなか求めている答えが見つからず、少々悩んでしまいました。
GETリクエストであればリダイレクト後にURLからリクエストパラメータが取得できますが、
POSTリクエストやURLにリクエストパラメータを表示するわけにいかない仕様の場合はそうもいきません。
そんなときに役に立つのがRedirectAttributes
です。
では、早速、使い方を見ていきましょう。
リダイレクト先に文字列を送る
まずは単純な例から見ていきましょう。
下記はリダイレクト先に文字列をパラメータとして渡す例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
実際に動かしてみれば、正しくログが出力されることを確認できるでしょう。
上記でreturn "sample";
としているのは単なる例なので、適切なtemplateを指定してあげてください。
リダイレクト先にオブジェクトを送る
続いて、パラメータをまとめて送るパターンです。
今回は下記のように定義されたMyData
を送ってみましょう。
※ソースを簡単にするためにbuild.gradle
にcompile("org.projectlombok:lombok:1.16.6")
を設定して@Data
を利用しています。
1 2 3 4 5 6 7 |
|
では、実際にパラメータを送ってみましょう。
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 |
|
オブジェクトとしてパラメータを送るにはModelMap
に一度格納する必要があります。
パラメータを受け取ったあとに型変換して取り出せばOKです。
RedirectAttributesにおけるaddAttributeとaddFlashAttributeの違い
さて、今回はRedirectAttributes
のaddFlashAttribute
を利用しましたが、RedirectAttributes
にはaddAttribute
というメソッドも存在します。
ではなぜaddFlashAttribute
を利用したのか参考までに書いておきます。
RedirectAttributesのaddAttributeはリダイレクト先に文字列としてパラメータを送る
大きな違いはaddFlashAttribute
のようにModelMap
型でパラメータを送れません。
よって、複数のパラメータを送るには1つずつパラメータをセットするしか方法がありません。
1 2 3 |
|
RedirectAttributesのaddAttributeはリダイレクト先でのパラメータの受取り方が異なる
こちらも大きな違いとなりますが、addFlashAttribute
のときのように@ModelAttribute
を使ってパラメータを受け取ることができません。
addAttribute
の場合、@RequestParameter
を使ってパラメータを受取ります。
1 2 3 4 5 |
|
リロード時の挙動が異なる
最後になりますが、
addAttribute
とaddFlashAttribute
ではリダイレクト後にリロードすると挙動が異なります。
addAttribute
ではGETリクエストとしてURLの末尾に?name=hogehoge&memo=fugafuga
という形でパラメータが渡されるため、リロードをしてもパラメータを受け取ることができます。
しかし、addFlashAttribute
ではflashMap
を利用したパラメータ渡しとなっています。
よって、リダイレクト後はflashMap
からパラメータが残らないため、何もパラメータを受け取ることはできなくなります。
いかがでしたでしょうか?
筆者にとってもSpring Bootに慣れない日々が続きますが、気づいたことや学んだことについてはブログにまとめていきたと思います。
と言ったところで本日はここまで。