読者です 読者をやめる 読者になる 読者になる

redirect forward

Teeda Seasar

TeedaにおいてPageクラスのメソッドの戻り値によって挙動が異なります。

これは少しだけ理解が必要です。

doXxxメソッドの戻り値と挙動は以下の通りです

戻り値 画面遷移
String redirectで指定Pageへ
class redirectで指定Pageへ
null forwardで自画面へ

補足すると、以前Pageクラスの名前を変更した際にリファクタリングが追従出来るように
と要望があった為、戻り値にStringだけでは無くclassも使用出来るようになりました(JSFはfaces-config.xmlで設定した文字列を返すのが基本)
そして上記の通り、Stringやclassを戻り値とした場合は指定ページへredirectされます。
nullを戻り値とした場合は、自画面にforwardされて遷移します。


ここでredirectとforwardの理解が必要になります。

簡単にまとめると、a.htmlからb.htmlへ画面遷移する場合
# ここでclientとはブラウザと読み替えて下さい

redirect(リダイレクト)

client -> server -> client -> server -> client(b.html表示)

clientからserverにa.htmlをリクエストし、serverからclientにredirect命令(b.html)します。
b.htmlのredirect命令を受け取ったclientはserverにb.htmlをリクエストします。
そしてserverはclientにb.htmlを返却します。

つまりリクエストが2回行われる為、リクエスト情報は引き継がれません。

forward(フォワード)

client -> server -> client(b.html表示)
clientからserverにa.htmlをリクエストし、serverからclientにb.htmlを返却します。
つまりリクエストは1回だけなのでリクエスト情報は引き継がれます。



TeedaにおけるPageクラスのメソッドでreturn null;とした場合には、JSFの肝であるFacesContext情報は引き継がれますが
redirectする場合(Stringやclassを返す場合)は、最初のリクエストと2回目のリクエストが異なる為
FacesContext関連の情報は異なるので、FacesMessage等の引継ぎには注意が必要になります。


そして異なるリクエストで値を引き継ぎたい場合は、セッションを利用する事になります。

補足ですがJSFは基本的にforwardベースのアーキテクチャです。