JSF 2.0でコンポーネントのHotDeploy開発

JSF 2.0の開発がスタートしたとき、目標としてコンポーネントの開発を容易にする、HotDeployできるようにするというのがあった。


最初何を言ってるのかわからなかったが実際に触ってみてやっと理解した。


いわゆるJSPXHTMLなどでコンポーネントが開発できるようになった。そこにはTLDJavaの面倒なコードは存在せず、コンパイルは必要ない。特定のディレクトリに配備をしておけば、JSPXHTMLなどのテンプレートは変更があると自動的にコンパイルされるため、これをHotDeployというのだろう。

では実際にコードを書いてみる。足し算をするコンポーネントを作ってみる。


コンポーネントのコード。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:composite="http://java.sun.com/jsf/composite"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <body>
        <!-- インターフェース定義-->
        <composite:interface>
            <composite:attribute name="count" required="true"/>
        </composite:interface>

        <!-- 実装 -->
        <composite:implementation>
            <span style="color: red">
                <c:forEach begin="1" end="#{cc.attrs.count}"></c:forEach>
            </span>
        </composite:implementation>
    </body>
</html>

これを
webルート/resources/calc/add.xhtml
という場所に保存する。

」がインターフェースの定義。ここに引数やリスナーなどを記述できる。

」が実装部分。繰り返してるだけ。ELでインターフェースの定義したものからパラメータの取得ができるのがわかると思う。


コンポーネントを利用するコード。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:s="http://java.sun.com/jsf/composite/star">
    <head>
        <title>おほしさま</title>
    </head>
    <body>
        おほしさま<br/>
        <s:print count="3" /><span jsfc="s:print" count="5" />
    </body>
</html>

xmlnsをみると面白い。「http://java.sun.com/jsf/composite/star」のcompositeから後ろが先ほど作成したコンポーネントディレクトリを指す。

そしてという部分でさっきのコンポーネントのファイル名から拡張子を除いたものを使う。jsfc属性をつかえばデザイナにも優しい。


実行
http://shin.cside.com/diary/2009/0905-01.png


当たり前だが、利用するところにELを使用すればJavaBeansの値を使用することができる。

<s:print count="#{HogeBean.count1}" />
<span jsfc="s:print" count="#{HogeBean.count2}" />

確かに触っていて思ったが、すごく楽。コンポーネントってのはHTMLを生成する部分なのでテンプレートで作るほうが効率がよい。しかもただのXHTMLなのでDreamWeaver等でデザインしてブラウザですぐに確認しながらさくさくいける。

複数個所で同じように使うメニューなどをJSFコンポーネント化して配備していくというのは十分ありだなぁと思った。同じようなコードを書くのはよくないことだが、デザインにもそれは言えるってこと。


つまり、HTMLをベースにしたテンプレートからさらに先を見据えての開発が重要になる。コードだけじゃなく、テンプレートもコンポーネントを意識してくれ、と。重複した部分を取り除こうというのは非常にいいと思う。


標準で用意されているドロップダウンリストのコンポーネントを使うのではなく、デザイナが用意したこぎれいなドロップダウンリストとか多機能なやつとか必要になる場面は非常に多いと思うのでこれはかなりありがたいはず。また、配布も容易だよね。