Facelets入門(第二回)Faceletsの使い方 by Jacob Hookom 17 Aug 2005 01:00 EDT |
本稿は、Faceletsに関する連載の第二回です。Faceletsは、JSFでアプリケーションを作るための新しい技術です。第一回はFaceletsの入門編でしたが、本稿ではJacobが、Faceletsを使って実際にJSFのアプリケーションを作るやり方の第一歩を説明します
FaceletsはJSFのViewHandlerの実装ですから、あなたのアプリケーションにおける構成(コンフィギュレーション)も容易です。まず、FaceletsのJAR(jsf-facelets.jar
)をあなたのプロジェクトのクラスパスに置き〔ただしもちろんJSF本体やELなどのライブラリも必要〕、faces-config.xml
に次の数行を加えてください:
<faces-config> <application> <!-- tell JSF to use Facelets --> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> </faces-config>
JavaServer Facesはデフォルトのビュー定義ファイルとしてJSPファイル(*.jsp)を指定しています。それを、WEB-INF/web.xml
ファイルの中で次のように変えましょう:
<context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param>
context-param
を上のように定義したら、あなたが書いたFaceletsは.xhtml
という拡張子を付けたファイル名で保存します。以上で、Faceletsを使う準備は完了です。
Faceletsの上では、JavaServer FacesのAPIに定義されているすべてのUIComponent
を、JSPの場合と同じルールで使えます。ですから、JSFのJSP用のタグライブラリのドキュメンテーションがそのまま役に立ちます。
またFaceletsのライブラリは、JSTLのcoreライブラリを簡略化したバージョンを提供しています。それにより、<c:forEach/>
と<c:if/>
を使えます。
このほかFaceletsのライブラリは、Facelets独特のテンプレート作成や再利用などの機能を支えるタグライブラリも備えています。これらについては、今後の記事で詳しく説明します。
Faceletsのたった一つの要件は、正しいXMLであることです。XHTMLのシンタクスにはとくにこだわりませんから、WML, SVG, SOAPなどとも一緒に使えます。JSPではタグライブラリを(taglibディレクティブを使って)インポートしましたが、FaceletsはJSPXと同じく、コンパイル時にネームスペースを参照します。以下は、XHTML形式のFaceletsドキュメンテーションの最初の部分です:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>My First Facelet</title> </head> <body> <!-- body content goes here --> Hello #{param.name}! </body> </html>
このコードをtest.xhtml
という名前で保存したら、次のようにリクエストしてみましょう:
test.jsf?name=Jacob
(上は、FacesServlet
を*.jsf
にマッピングしている場合です。)
以上で、あなたの環境でFaceletsが正しく動くことを確認できました。
FaceletsはJSF向けの新しいELの規格を使います(EL 2.1)。この、いわゆる“統合化式言語”では、${ }
と#{ }
の両方を…どちらでも…使えます。JSPも、2.1からはこの規格のELを使います。上の例でも見ましたが、ELとふつうのテキストをまぜて書けます。
JSF 1.2からは、ELResolver
のカスタムクラスを書くことによって、Spring, EJB, JNDIなどとの統合化ができます。お望みなら、たった一つのクラスで一気に。また、あなたのアプリケーションの独自のオブジェクトにアクセスするELResolver
を書くこともできます。〔VariableResolver
はJSF APIの一環であり、EL APIの一員ではない。〕
このEL APIはJSP 2.1の規格に含まれますが、それ自身はJSPやJSFに依存しない独立のAPIであり規格です。ですからそれを、Faceletsのいろんな展開で使えます。
上のtest.xhtml
では、JSFのネームスペースが宣言されていますね。これらはJavaServer Faces APIのJSP用タグライブラリのネームスペースそのものです。つまりFaceletsは、使用する技術も、そしてドキュメンテーションも、すでによく知られているJSF自身のものを使う/使えるのです。
ですから、JSFが内蔵しているコンポーネントをFaceletsで使うときは、それらのタグライブラリのドキュメンテーションを手元に置いておきましょう。
さて、test.xhtml
は無事に動きましたから、次は簡単なフォームを作りましょう。以下のコードを、ページの本体(BODY)に書き加えてください:
<h:form> <h:inputText value="#{person.name}"/> <h:commandButton action="#{person.action}"/> </h:form>
そしてpersonビーンを書き、faces-config.xmlに必要な項目を記入すれば、このフォームが使えるようになります。
上で作ったFaceletsドキュメントtest.xhtml
は、DreamweaverのようなHTMLデザインツールの中で見ると何も表示されません。そこでFaceletsは、jsfc
という属性を使うことによって、一つのコンポーネントをHTMLのタグとJSF/JSPのタグの両方で指定できるようにしています(それはTapestryや、Struts ShaleのClayプラグインとよく似ています)。
Faceletsのコンパイラはドキュメントの各成分の中にjsfc
属性を探します。jsfc
属性の値(value)は、ページデザイナーが指定したHTML成分のエイリアス(alias,別名)を指定します。たとえばこのように:
<input type="text" jsfc="h:inputText" value="#{foo.bar}"/>
するとFaceletsはコンパイル時に、h:inputText
コンポーネントをドキュメント中に作り、書かれている属性をすべてコンポーネントに自動的に結び付けます。
このエイリアス化という仕組みによって、ページデザイナーはHTMLのinput
タグを見ることができ、プログラマはそれを、jsfc
属性で指定されているJSFのコンポーネントとして扱えるのです。