BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JSF 2.2 and HTML5

JSF 2.2 and HTML5

ブックマーク

原文(投稿日:2013/06/28)へのリンク

JSF 2.2はマイナーリリースに過ぎないが,JSFコンポーネントの介在を必要としないパススルー(pass through)HTML属性など,JSFアプリケーションでのHTML5テクノロジ利用を望む開発者にとって特に重要な機能がアップデートされている。

HTML5の豊富な新機能のひとつに,既存要素に追加された一連の属性がある。例えばinput要素のtype属性では,text, search, email, url, tel, range, number, date などの値がサポートされている。さらにはHTML要素に小さなデータをアタッチすることを目的とした,さまざまなカスタムデータ属性がある。レンダリングはされないが,JavaScriptを使って読み取り可能だ。

JSFのようなコンポーネントベースのライブラリにとって,これには問題がある。新しい属性を認識するために,既存のJSFコンポーネントを更新しなければならないからだ。新しい属性をサポートする必要のあるコンポーネントならば,そのような修正にも合理性がある。しかしほとんどの場合は,最終的に生成するマークアップに含めるものでしかない。JSF 2.2のパススルー属性は,まさにそれを行うためのものだ。

Faceletからパススルー属性をセットする方法は3つある。

1.コンポーネントタグ上で,名前空間を指定した属性を使用する

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://java.sun.com/jsf/passthrough">
<h:form>
<h:inputText value="#{bean.value}" p:placeholder="Enter text"/>
</h:form>
</html>

2. 子TagHandler として f:passThroughAttribute を使用し,単一の属性をセットする

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<h:inputText value="#{bean.value}" >
<f:passThroughAttribute name="placeholder" value="Enter text" />
</h:outputText>
</h:form> 
</html>

3.子TagHandlerとして f:passThroughAttributes を使用し,multiple属性をセットする

<h:outputText value="Something" >
<f:passThroughAttributes value="#{bean.multipleAttributes}" />
</h:outputText>

#{bean.multipleAttributes} は Map<String, Object> の参照で,リテラルまたは値式を指定できる。

Expression Language 3.0(同じくJava EE 7に含まれる)を使用すれば,multiple属性をEL式で直接定義することも可能だ。

<h:outputText value="Something" >
<f:passThroughAttributes value="{"one":1, "two":2, "three":3}" />
</h:outputText>

このような変更の結果,JSFビューを純粋にHTMLのみで記述することが可能になった。これはWicketなどの競合フレームワークでも,しばしばメリットとして引用されているものだ。

サーバエンドからは,UIComponentに新たに追加されたメソッド getPassThroughAttributes(),あるいは getPassThroughAttributes(boolean create0 を通じて,次のように設定することができる。

UIComponent component = new SomeComponent();
Map passThrough = component.getPassThroughAttributes();
passThrough.put("placeholder", "Enter text");

JSF 2.2.ではパススルー機能の他,Faces FlowやStateless Viewといった重要な拡張機能も導入されている。

Faces Flow

Faces Flowは,ADF Task FlowやSpringのWeb Flowにインスパイアされたもので,一連のページと関連するユースケースを通じて,ユーザのワークフローを直接サポートする機能だ。ワークフローは"ノード"間のフローとして定義する。ノードには以下のものが使用できる。

  • ビュー: アプリケーション内の任意のJSFページ
  • メソッドコール: フローグラフからELを通じて,アプリケーションロジックを呼び出す
  • スイッチ: ブールELに基づく,フローグラフ内のナビゲーション判断
  • フローコール: 別のフローをパラメータ付きで呼び出して,戻り値を受け取る
  • フローリターン: コールしたフローに戻る

ノードは,フローの入口と出口となるポイントを定義する。

新たに2つのアノテーションが追加されている。

  • FlowScoped は,特定のフローにおけるビーンのスコープを定義するCDIスコープである。スコープの開始/終了時に,ビーンが自動的に活性化/非活性化される。
  • FlowDefinition は,FlowBuilder APIを使用した自然なフロー定義を可能にする,クラスレベルのアノテーションである。

最後に,フローのローカルストレージ用の #{flowScope} という,新しいELオブジェクトも導入された。このオブジェクトは facesContext.getApplication().getFlowHandler().getCurrentFlowScope() にマップされる。

Stateless View

フレームワーク,特にコンポーネントフレームワークは,一般的にステートフルだ。しかしステートの管理が必要でないことにも,いくつかのメリットがある。特に重要なのは,クラスタの複数ノード間でのステートの複製や,要求を発信したノードに結果が戻ることを保証するスティッキーセッションの使用が不要になることだろう。しかしながら,これら以外にメリットとして引用される内容は,必ずしも明確とは言えない。ステートフルなWebフレームワークでは,パフォーマンスやメモリ消費量が問題とされることもあるが,実際にはこれらは,エンタープライズアプリケーションではほとんどが些細な問題に過ぎない。ステートの適用や保存はパフォーマンスにも影響する。しかしJSF2.xでは,ステートの変更のみを更新するPartial State Savingを採用しているため,この処理は非常に効率的で,ステート情報の格納に使用されるメモリ量も,一般的には非常に小さい。

JSFのステートレス実装は単純だ。<f:view> のTagHandlerに transient というブール属性が追加されていて,これが UIViewRoot#setTransient に渡される。 ページがtransientにセットされると,JSFのStateManagerはこのビューに関連する情報を一切保存しない。ビューのリストアフェーズでは,ステートを適用せずにビューが生成される。

その他にも,膨大な数のマイナーチェンジがある。Arjan Tijms氏のJ-Developmentでの 記事 には,より詳細な情報が報告されている。

この記事に星をつける

おすすめ度
スタイル

BT