[HOME][JSFfollow-up]
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を作る

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が正しく動くことを確認できました。

ELを使う

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に必要な項目を記入すれば、このフォームが使えるようになります。

コンポーネントのエイリアス化(jsfc属性)

上で作った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のコンポーネントとして扱えるのです。


Jacob HookomはSunのJavaServer Faces参考実装とGlassfishプロジェクトのデベロッパであり、JavaServer Faces Expert Groupの現役メンバーです。彼は16歳のときにコンサルティングを始め、その後、情報技術やプロダクトマネージャなどの仕事を経験しました。そして最近Jacobは、JavaServer Facesを使った開発のための理想的な基盤として、Faceletsプロジェクトをスタートしました。彼はウィスコンシン州オークレアのウィスコンシン大学で総合コンピュータ科学の学士号を取得しています。

[HOME][JSFfollow-up]