[HOME][JSFfollow-up]

Facelets入門(1)

          --Jacob Hookom

[原文]

本稿はFaceletsに関する連載記事の第一回です。Faceletsは、JSFアプリケーションを構築するための新しいビュー技術です。Faceletsは強力なテンプレートシステムで、JSFのビューをHTMLふうのテンプレートを使って定義できます。そして複数のコンポーネントをビューの中でまとめるためのコードが、少なくてすみます。それに、Webコンテナを使いません。本稿では筆者のJacobが、Faceletsの特長と、彼自身がFaceletsを作った動機を説明します。


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を使うのか?

ずば抜けて重要な理由は、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);

Faceletsの特長と機能一覧

以下は、現在のFaceletの特長および機能の簡単な一覧です:

なぜFaceletsは成功間違いなしか

誰もがデザイナーフレンドリを志向しますが、今のところデベロッパたちのその要望を満たすものはTapestryしかありません。しかし一方では、誰もがオープンスタンダードであるJSFを開発のベースにしたいと願っています。しかしJSFがデザイナーフレンドリー、かつ、デベロッパフレンドリーであるためには、もっと“プラッガブルな”ViewHandlerが必要です。

デベロッパたちは、UIComponent, Converter, Validatorsなどなどを作ってそれらをfaces-config.xmlに定義します。そしてFaceletsがデベロッパに要求するのは、ページにそれらのオブジェクトをはめこむための、エイリアス名の指定だけです(XMLは要りません)。複数のコンポーネントをページへ統合化することが楽であり、したがってページの〜アプリケーションの開発が楽です。

結論として、FaceletsはJSFの不安な部分を一掃した、クリーンなプラットホームです。テンプレート作成と再利用と開発の容易化がFaceletsの最優先事項ですから、デベロッパチームは大規模なプロジェクトにJSFを安心して採用できます。


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