JavaServer Faces

JavaServer Faces  は、JavaベースのWebアプリケーションフレームワークである。Javaの拡張機能セットであるJakarta EE  の仕様の一つに採用され、名称がJakarta Server Facesに変更されている。Jakarta EE9からパッケージ名称もjavax.facesからjakarta.facesに変更された。

1. 概要
-----

他の伝統的なリクエスト駆動型のMVC Webフレームワークと異なり、JSFはコンポーネントベースのアプローチをとっている。UIコンポーネントの状態は、クライアントが新しいページをリクエストした際に保存され、リクエストに対するレスポンスが返されるときに復帰される。JSFは当初、画面表示技術にJavaServer Pages  を用いていたが、2.0以降はより普通のHTMLに近いFaceletsが採用されている。

JSFには下記の要素が含まれる:

UIコンポーネントの表現、状態の管理、イベントのハンドル、値の変換、ページナビゲーションの定義、国際化とアクセシビリティサポートなどのためのAPIセット
UIコンポーネントのデフォルトのセット
JSPページ内のJavaServer Facesインタフェースを表現するための二つのJSPカスタムタグライブラリ
サーバサイドのイベントモデル
状態の管理
管理Bean 
JSP 2.0 と JSF 1.2 のための式言語JSF仕様はJava Community Processの元で、JSF 1.0および1.1を定義する//JSR127//として、 JSF 1.2を定義する//JSR252//として開発された。またJSF 2.0は//JSR 314//として開発されている。

2. JSF のバージョン
-------------

JSF 1.0:  JSF仕様の最初のリリース
JSF 1.1:  バグフィックスリリース。HTML仕様やHTML 出力部分に変更はない。
JSF 1.2: コアシステムとAPIに多くの改善を含むリリース。Java EEに採用された最初のバージョンで、Java EE 5に含まれる。
コンテンツ織込みの問題についての暫定的な解決策を提供する改善内容については、[1] に記述されている。
設定ファイルに DTD の代わりに XML Schema を提供
Faces アプリケーションが、複数のフレームや複数のウインドウを持つ UI デザインができるような改善
TCKのサポート範囲を多くするための f: タグライブラリの改善、 f:viewライフタイムイベント、その他の小さな機能改善
API オブジェクトのデコレータのサポート
クライアント側での状態保存のためのセキュリティの改善
ボタンの多重押し問題の解決
実装を容易にするため、仕様書を標準を記述している部分とそうでない部分を分離するよう整理
Portlet に関連するバグ修正
最小限の仕様変更を伴うバグ修正
JSF 2.0 : 使いやすさの改善や機能の追加、パフォーマンスの向上が図られたメジャーリリース。Ajax対応。Java EE 6に含まれる。
JSF 2.1 : 2.0のメンテナンスリリースで、ごく小さな仕様変更が行われている。
JSF 2.2 : HTML5の対応、テンプレートを切り替えるリソース・ライブラリ・コントラクト、画面遷移を管理するFacesフロー、サーバー側でコンポーネントツリーを保持しないステートレス・モードの追加、といった変更が加えられている。Java EE 7 に含まれる。
JSF 2.3 :Java EE 8 に含まれる。WebSocket機能、CDI拡充、BeanValidation相関チェック対応、Date and Time API対応、Ajax機能強化。

3. Facelets
-----------

Faceletsは、JSFのために開発されたWebテンプレートエンジンである。JSF 2.0からJSPに代わってJSFのデフォルトの画面表示技術として採用されている。Faceletsの最初のバージョンが登場したのは2005年のことで、当時はJSF 1.1, 1.2をターゲットとしていた。JSFと同じコンポーネントベースのWebアプリケーションフレームワークであるApache Tapestryとは似通っており、Facelets自体もTapestryの考え方を一部取り入れている。

Faceletsのテンプレートは主にXHTMLで作成される。テンプレートを記述する方法としては、Facelets独自のXMLタグを直接埋め込む手法と、通常のXHTMLタグにjsfc属性を用いて間接的に埋め込む手法の2つがある。以下にまず独自のXMLタグを用いる場合の例を示す。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

jsfc属性を用いた場合、上の例は以下のようになる。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

jsfc属性を用いたテンプレートの場合、他のアプリケーションからは普通のXHTMLとして扱えるため、ブラウザで表示を確認したり、WYSIWYGデザインツールを用いて編集したりすることができる。

4. 他の Web GUI フレームワークとの比較
-------------------------

4.1. Struts
-----------

StrutsはApacheソフトウェア財団が提供するMVCフレームワークである。Strutsはpage-at-a-time型のMVCフレームワークを提供し、JSFスタイルのコンポーネントモデルは備えていない。

ページは入力をアクションに接続するディスパッチサーブレット  を備えたモデルにマップされる。Strutsアプリケーションはビューを表示するために主にJSPを使用するため、手近なタグライブラリの使い方に影響を受けやすい。

4.2. WebObjects / Wotonomy
--------------------------

WebObjectsは、よく知られた最も初期のWebアプリケーションフレームワークで、元々はNeXT Softwareによって開発された。その後Apple ComputerがNextを買収した際に獲得された。 WebObjectsはJSF 同様のコンポーネントおよびイベントモデル、ライフサイクルを備えている。 J2EEがなくても配備することができるが、サーブレットコンテナー内に配置することもでき、その場合にはディスパッチャオブジェクトがJ2EE Webアプリケーションのエントリーポイントとして動作する。

JSFとは異なり、コンポーネントはJSPファイルには定義されず、html/xml/wmlテンプレートファイル、フィールドやアクションをJavaコードにマップするファイル、.javaのクラスファイルのいずれかあるいはすべてを含む .wocディレクトリに定義される。テンプレートファイルは表示とレイアウト部分を提供し、他のWebObjectsコンポーネントを含んでも良く、JSFが既定で使用するRenderKitへの委譲のアプローチとは異なる。これは、JSFでの委譲モデルと直接描画モデルの中間点にある。

WebObjectsは、最も初期のオブジェクト関係マッピングのフレームワーク、Enterprise Objects Frameworkを備えた、レイヤー化されたアーキテクチャを含んでいる。

Wotonomyは、WebObjectsフレームワークのオープンソースの再実装であり、クリーンルームで開発され、 LGPL でライセンスされている。WotonomyはWebObjectsのすべての部品を実装しようと試みており、完全なMVC web-GUIスタックを実装している。WebObjectsのクローンであり、未完成な部分を除けばJSFとの違いはWebObjectと全く同様である。

4.3. Apache Tapestry
--------------------

Tapestryは動的で、堅固で、スケーラブルな Web アプリケーションをJavaで開発するためのオープンソースのフレームワークである。Tapestry は標準的な Java Servlet API の上に構築され、任意のサーブレットコンテナやアプリケーションサーバの上で動作する。JSFとは異なり、 TapestryはJSPを表示技術として用いない。代わりに、簡単に HTML をプレビューでき、編集できる 別のテンプレートエンジンを選択している。

4.4. Microsoft ASP.NET
----------------------

JSFは、Webアプリケーションの開発に、マイクロソフトのASP.NETに似たコンポーネントベースのアプローチをとっている。JSFではレンダリングとコンポーネントのインターフェイスが分離可能で出力部分をカスタマイズできるが、ASP.NET v1では、コンポーネントの出力のコードは UI コンポーネントに結合されている。ASP.NET v2は制御アダプターフレームワークを導入し、標準の出力エンジンをサードパーティーのコードで置き換えることができる。

コンポーネントから生成し、コンポーネントとは別のファイル  に格納されるイベントを受信することでビジネスコードが UI コンポーネントに接続される。 従って、典型的な ASP.NET のページは視覚上のページレイアウトを記述した  ファイルと、ページのロジックを記述したファイルからなる。マイクロソフトの開発ツールによって、両方のファイルを一つの要素として扱うことができる。

書籍//Core JSF//の著者によれば JSFはVisual Studio 2005に似たようなRapid application development  の領域でJavaがASP.NET/Visual Studioと競争できるような手段を提供し、開発コストや開発を始める際の障壁を下げている。

5. JSFとAjax
-----------

JSFはリッチインターネットアプリケーション技術であるAjaxとともに言及されることが多い。Ajaxはリッチなインターユーザインタフェースの作成を可能にする技術の組み合わせである。MojarraとApache MyFacesにおけるユーザインタフェースコンポーネント は元々は HTML のためだけに開発されたもので、AjaxはJavaScriptを介して追加せねばならなかったが、これは変わった。

JSFは複数の出力形式をサポートしているため、JSFベースのユーザインタフェースの品質を向上させるため、Ajax を用いるコンポーネントを簡単に追加することができる。JSF 2.0 仕様では、UI ロジックの一部がサーバ側だけではなくクライアント側でも動作できるようにし、また JavaScript がブラウザで無効の場合にもうまく品質を落とせるようにすることで、Ajax のサポートを改善することを意図している。

5.1. Ajaxを用いるJSFコンポーネントとフレームワーク
-------------------------------

以下の企業やプロジェクトがAjaxに基づくJSFの実装や設計を提案している：

ADF Faces //ADF Faces Rich Client//, [2]
Backbase //Enterprise Ajax   ? JSF Edition//, Ajax framework
OmniFaces オープンソースのJava JSF拡張フレームワーク
PrimeFaces オープンソースのJava JSF拡張フレームワークおよびリッチコンポーネント
ICEfaces オープンソースのJava JSF拡張フレームワークおよびリッチコンポーネント、JavaScriptを用いないAjax
jBoss Ajaxを用いたJSFコンポーネントである//RichFaces//および//Ajax4JSF//
MyFaces Ajaxコンポーネントを用いたJSF実装
Sun //Java BluePrints AJAX Components//
MB Technologies //BindowsFaces// [3]
ZK JSFコンポーネントを用いたAjaxフレームワーク [4]
J4Fry Ajax JSF Solution [5]

6. 脚注
-----

7. 参考文献
-------

[6] 
[7] 
[8] 
[9] 
[10] 

8. 関連項目
-------

グラフィカルユーザインタフェース
Apache Struts

9. 外部リンク
--------

[11] Core Servlets Tutorials Page
[12] - JSF Components のための設計時メタデータ 　
[13] JSF に関する記事、ブログ、チュートリアルなどの膨大なリスト
[14] JavaServer Faces コミュニティ
[15]
[16] Apache MyFaces プロジェクト：Apache ソフトウェア財団傘下のオープンソースによる JSF 実装
[17] 様々な JSF 実装と、その機能の比較