Webの世界では、標準技術であるJavaServer Faces(JSF)をベースにしたTapestryふうのフレームワークが欲しい、という声が高まっていました。JavaServer FacesとJSPはある意味で夫婦のような中ですが、しかしFacelets はJSPの規格にまったくとらわれずに、パフォーマンスの良いJSF主体のビュー技術を提供します。しかしFaceletsもJSPのようにXMLふうのタグを使いますから、JSPページを書いたことのある人はすぐにFaceletsを使えるようになるでしょう。両者の違いは、楽屋裏の実装部分にあります。FaceletsはJSPベンダのAPIという重荷を取り除いて、JSFをプラットホームとして強化し、JSPのタグを開発せずにすむ簡単で早い開発ができるようにしています。
JavaServer FacesのUIComponents
が、Faceletsの世界の主役です。ビューをまとめるための余計なオブジェクトを開発する必要が、ありません。また、ビューを定義するための特別のXMLスキーマを勉強する必要もありません。
Faceletsでビューを定義することがどれだけ簡単か、まず以下の例を見ていただきましょう:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jstl/core"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Hello</title> </head> <body> <form id="helloForm" jsfc="h:form"> <h2> やあ。ぼくはデュークです。今ぼくは #{UserNumberBean.minimum}から #{UserNumberBean.maximum} までの数を心に思っているんだけど、 あなたにその数が当てられるかな? </h2> <img id="waveImage" src="wave.med.gif" /> <input type="text" jsfc="h:inputText" id="userNo" value="#{UserNumberBean.userNumber}" validator="#{UserNumberBean.validate}"/> <input type="submit" jsfc="h:commandButton" id="submit" action="success" value="Submit" /> <p /> <h:message showSummary="true" id="errors1" for="userNo"/> <p /> <c:forEach begin="1" end="4" varStatus="v"> #{view.viewId} #{v.index}<br/> </c:forEach> </form> </body> </html>
これらのマークアップを見てみなさんは、ものすごく見慣れた感じがしたでしょう。その点が、重要ですね。つまり、まったく新しいテンプレート言語やスキーマを勉強する必要がないのです。
ずば抜けて重要な理由は、FaceletsがJSPコンテナに依存しないことです。ですから、JSP 2.1のコンテナを待たなくても、JSF 1.2の新しい機能を使えます。JSF 1.1とJSPのあいだには、はじめのころ深刻な問題がありました。それらの問題の多くを、Hans Bergstenの"Improving JSF by Dumping JSP."が詳しく論じています(記事本文)。JSF 1.2とFaceletsに移行するための強力な根拠として、ぜひこの記事を読むことをお勧めします。
第二の理由は、Faceletsがデザイナーフレンドリであることです。Tapestryのjwcid
属性に倣い、Faceletsはjsfc
と適切なネームスペースを使って、HTML成分を、それらに該当するJSFのコンポーネントに変換します。上の例では、jsfc
(JSF Compilation)を使ってコンパイラに、ビューの中にh:inputText
コンポーネントを構築せよ、と指示しています。
そしてさらに、Faceletsはとても軽量です。テンプレートエンジンとしてVelocity'sを使ったことのあるかたは、Faceletsに同じ機能があることをご理解いただけるでしょう。つまりFaceletsでは、サーブレットコンテナがなくてもJSFのビューを定義し試験することができるのです。フレームワークとしてのオーバヘッドは最少ですから、本格的な開発業務に適しています。またFaceletsは、Portletをはじめ、サーブレット以外の環境でのJSFの利用と展開の道を開きます。
Faceletは次のようにして作ります:
// FaceletFactoryを取得してFaceletを作る FaceletFactory factory = FaceletFactory.getInstance(); Facelet f = factory.getFacelet(viewToRender.getViewId()); // UIViewRootの中身を作る f.apply(context, viewToRender);
<input id="bar" type="text" jsfc="h:inputText" value="#{foo.bar}"/>
)。<input type="text"/>
を<h:inputText/>
へ変換する)。誰もがデザイナーフレンドリを志向しますが、今のところデベロッパたちのその要望を満たすものはTapestryしかありません。しかし一方では、誰もがオープンスタンダードであるJSFを開発のベースにしたいと願っています。しかしJSFがデザイナーフレンドリー、かつ、デベロッパフレンドリーであるためには、もっと“プラッガブルな”ViewHandlerが必要です。
デベロッパたちは、UIComponent, Converter, Validatorsなどなどを作ってそれらをfaces-config.xmlに定義します。そしてFaceletsがデベロッパに要求するのは、ページにそれらのオブジェクトをはめこむための、エイリアス名の指定だけです(XMLは要りません)。複数のコンポーネントをページへ統合化することが楽であり、したがってページの〜アプリケーションの開発が楽です。
結論として、FaceletsはJSFの不安な部分を一掃した、クリーンなプラットホームです。テンプレート作成と再利用と開発の容易化がFaceletsの最優先事項ですから、デベロッパチームは大規模なプロジェクトにJSFを安心して採用できます。