JSF 2.0のGETサポート新コンポーネント

JSFは画面遷移は全てPOSTによるポストバック動作が標準だった。そのため「h:form」タグで囲む必要もあった。画面遷移だけのためにこれはあんまり。

そこでGETで移動しようと思った場合リンクタグ「h:outputLink」で生成することもできたが、これはナビゲーションケースを無視したもので、生成先のURLを正確に知る必要があった。もしくはbuttonを配置してscriptでlocationをセットするなどでもよいが、どちらにしろナビゲーションルールは使えずJSFを離れた動きが必要だった。

<h:outputLink value="/hoge/bar.xhtml" >barへ</h:outputLink>

JSF 2.0ではナビゲーションが使えるボタンタグとリンクタグが用意された。

<h:button outcome="bar" value="barへ"/>
<br/>
<h:link outcome="bar" value="barへ"/>

実行するとこのようになる。
http://shin.cside.com/diary/2009/0831-01.png


生成されるHTMLは以下の通り。

<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>foo</title>
    </head>
    <body><input type="button" 
onclick="window.location.href='/WebApplication15/faces/hoge/bar.xhtml'; return false;" 
value="bar&#12408;" />
        <br /><a href="/WebApplication15/faces/hoge/bar.xhtml">bar&#12408;</a>
    </body>
</html>

これまた非常にシンプルだが、GETで移動できるようになったのはうれしいところ。

GETパラメータを動的に生成してもいいのだが(そういうAPIJSF 2.0でいろいろと追加されている)、パラメータ数が固定ならばテンプレートに記述できる。

<h:link outcome="bar" value="barへ">
    <f:param name="type" value="link"/>
</h:link>

という文では

http://localhost:8080/WebApplication15/faces/hoge/bar.xhtml?type=link

というURLになる。


もちろんJSFC属性も使えるため

<a jsfc="h:link" outcome="bar" >barへ</a>

もしくは

<a jsfc="h:link" outcome="bar" value="barへ" />

のように記述してもよい。

href指定は消されるので

<a jsfc="h:link" outcome="bar" href="href指定は消される">barへ</a>

のように記述しておいてもよい。これはHTMLのデザインと分離する上において大変便利だ。