JavaServer Faces

**Jakarta Faces** (**JSF**) は、Eclipse Foundationが開発している、JavaベースのWebアプリケーションフレームワークである。

名称は下記の変遷をたどっている。
* Java 8 までは Java Platform, Enterprise Edition の一部で **JavaServer Faces** という名称だった。
* Java 9 以降は Eclipse Foundation の Jakarta EE に移管され、Jakarta EE 8, 9 は **Jakarta Server Faces** 2.3, 3.0 という名称だった。Jakarta Server Faces 3.0 からパッケージ名がjavax.facesからjakarta.facesに変更された。
* Jakarta EE 10 以降は Jakarta Faces という名称に変わった。JSFという略称が廃止された。

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

JSFには下記の要素が含まれる:
* UIコンポーネントの表現、状態の管理、イベントのハンドル、値の変換、ページナビゲーションの定義、国際化とアクセシビリティサポートなどのためのAPIセット
* UIコンポーネントのデフォルトのセット
* JSPページ内のJavaServer Facesインタフェースを表現するための二つのJSPカスタムタグライブラリ
* サーバサイドのイベントモデル
* 状態の管理
* 管理Bean (Managed Bean)
* JSP 2.0 と JSF 1.2 のための式言語（EL 3.0以降は独立した規格となっている。）

JSF仕様はJava Community Processの元で、JSF 1.0および1.1を定義する*JSR127*として、
JSF 1.2を定義する*JSR252*として開発された。またJSF 2.0は*JSR 314*として開発されている。

## バージョン
* JavaServer Faces 1.0（2004年3月11日）: (DEPRECATED) JSF仕様の最初のリリース
* JavaServer Faces 1.1（2004年5月27日）: (DEPRECATED) バグフィックスリリース。HTML仕様やHTML 出力部分に変更はない。
* JavaServer Faces 1.2（2006年5月11日）: コアシステムとAPIに多くの改善を含むリリース。Java EEに採用された最初のバージョンで、Java EE 5に含まれる。
** コンテンツ織込みの問題についての暫定的な解決策を提供する改善内容については、http://www.onjava.com/pub/a/onjava/2004/06/09/jsf.html に記述されている。
** 設定ファイルに DTD の代わりに XML Schema を提供
** Faces アプリケーションが、複数のフレームや複数のウインドウを持つ UI デザインができるような改善
** TCKのサポート範囲を多くするための f: タグライブラリの改善、 f:viewライフタイムイベント、その他の小さな機能改善
** API オブジェクトのデコレータのサポート
** クライアント側での状態保存のためのセキュリティの改善
** ボタンの多重押し問題の解決
** 実装を容易にするため、仕様書を標準を記述している部分とそうでない部分を分離するよう整理
** Portlet に関連するバグ修正
** 最小限の仕様変更を伴うバグ修正
* JavaServer Faces 2.0（2009年6月28日） : 使いやすさの改善や機能の追加、パフォーマンスの向上が図られたメジャーリリース。Ajax対応。Java EE 6に含まれる。
* JavaServer Faces 2.1（2010年10月22日） : 2.0のメンテナンスリリースで、ごく小さな仕様変更が行われている。
* JavaServer Faces 2.2（2013年5月21日） : HTML5の対応、テンプレートを切り替えるリソース・ライブラリ・コントラクト、画面遷移を管理するFacesフロー、サーバー側でコンポーネントツリーを保持しないステートレス・モードの追加、といった変更が加えられている。Java EE 7 に含まれる。
* JavaServer Faces 2.3（2017年4月17日） : Java EE 8 に含まれる。WebSocket機能、CDI拡充、BeanValidation相関チェック対応、Date and Time API(JSR-310)対応、Ajax機能強化。
* Jakarta Server Faces 2.3（2019年8月14日） : Jakarta EE 8 に含まれる。
* Jakarta Server Faces 3.0（2020年9月23日） : Jakarta EE 9 に含まれる。
* Jakarta Faces 4.0（2022年5月16日） : Jakarta EE 10 に含まれる。
* Jakarta Faces 4.1（2024年5月7日） : Jakarta EE 11 に含まれる。

## 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タグを用いる場合の例を示す。


```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <h:form>
            <h:outputText value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
            <h:inputText value="#{bean.property}" />
            <h:commandButton value="OK" action="#{bean.doSomething}" /> 
        </h:form>
    </body>
</html>
```


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


```html4strict
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <form jsfc="h:form">
            <span jsfc="h:outputText" value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
            <input type="text" jsfc="h:inputText" value="#{bean.property}" />
            <input type="submit" jsfc="h:commandButton" value="OK" action="#{bean.doSomething}" /> 
        </form>
    </body>
</html>
```


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

## 他の Web GUI フレームワークとの比較
### Struts

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

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

### 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と全く同様である。

### Apache Tapestry

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

### Microsoft ASP.NET

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

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

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

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

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

### Ajaxを用いるJSFコンポーネントとフレームワーク
以下の企業やプロジェクトがAjaxに基づくJSFの実装や設計を提案している：

* ADF Faces *ADF Faces Rich Client*, (ADF Faces site)
* Backbase *Enterprise Ajax&nbsp;? 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* （BindowsFacesのウェブサイト）
* ZK JSFコンポーネントを用いたAjaxフレームワーク （ZK JSF のサイト）
* J4Fry Ajax JSF Solution （J4Fryのオープンソースコミュニティサイト）

## 脚注

## 関連項目
* グラフィカルユーザインタフェース
* Apache Struts

## 外部リンク
* Jakarta Faces
* JavaServer Faces Technology

### 仕様
* JSR 127 (JSF 1.0 and 1.1)
* JSR 252 (JSF 1.2)
* JSR 314 (JSF 2.0 and JSF 2.1)
* JSR 344 (JSF 2.2)
* JSR 372 (JSF 2.3)
* Jakarta Server Faces 2.3
* Jakarta Server Faces 3.0
* Jakarta Faces 4.0
* Jakarta Faces 4.1