JSF 1.xは以下のようにナビゲーションルールをXMLで記述していた。
<navigation-rule> <from-view-id>/page1.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/page2.jsp</to-view-id> </navigation-case> </navigation-rule>
「from-view-id」が現在表示中のページID、「from-outcome」がアクションの戻り値となる文字列で、「to-view-id」が移動先となる。Strutsと考え方は近いが、アクションベースのフレームワークはまずアクションの実行をして最終的なレンダリング先をどうするか、というのに対してJSFはJSPなどのテンプレートがまず呼び出されて、それらがどういったアクションを呼び出すかと動きが逆転している。
で、JSF 2.0ではこのナビゲーションルールを使う方法もできるが、必要としなくなった。Spring MVCのように直接JSPやXHTMLなどを記述できるようになった。テンプレートで記述してもよいが、イメージをつかみやすいようにactionで書いてみる。
public String action(){ //なんかロジック return "page2.xhtml"; }
特に難しいことはないと思う。
先頭がスラッシュから始まる場合は絶対アドレス指定で、スラッシュがない場合は相対アドレスによる指定。また、拡張子は省略できる。
public String action(){ //なんかロジック return "/hoge/page2"; }
とやってもいいわけだ。
ちなみにピリオド2個で親ディレクトリを指定するのは無効な模様。
あと、XMLによるナビゲーションルールではredirect指定も可能だったが、コレはどうするのか。ちゃんと用意されている。
public String action(){ //なんかロジック return "page2?faces-redirect=true"; }
「?faces-redirect=true」という文を加えることで上のpage2へのアクセスはリダイレクトされる。これでURLがひとつ遅れてついてくるように見えるということもない。
JSFはJSPやXHTMLなどのテンプレートファイルのパスで解決するので、JSPやXHTMLなどをそのまま使えるようになったことで結果的にアクションベースよりも直感的になったと思う。