Java EE 7でさらに使いやすく、便利になったJSF 2.2、CDI 1.1、EL 3.0の主な強化ポイント

Oracle Java & Developers編集部
2013-09-30 11:00:00
  • このエントリーをはてなブックマークに追加

JSFのコンポーネント・ツリーとは?

 次に加藤田氏は、JSFによる画面開発の基礎について説明した。

 加藤田氏によれば、JSFの基本はコンポーネント・ツリーにある。JSFを使ったシステムでは、一般的なWebアプリケーションとは異なり、Webブラウザ上のUIとサーバ上のビジネス・ロジックとの間に、HTMLによるUI構成を写し取ったコンポーネント・ツリーがJavaコンポーネントとして保持される。このコンポーネント・ツリーがあることで、HTML上の情報をいったんサーバ上に保持したうえで処理が行える。


※クリックすると拡大画像が見られます

 コンポーネント・ツリーの存在により、JSFの内部処理のライフサイクルは次の図のようになる。


※クリックすると拡大画像が見られます

 図中のRestoreView、Apply Request Valuesは、Webブラウザ側のUIを写したコンポーネント・ツリーをサーバ上に保持し、それぞれのコンポーネントが持つ値を適用するという処理である。その後、Validationを通った場合は入力された値がModelに適用されたうえで処理が行われ、レスポンスを返すといった流れになる。この仕組みは「入力とModelのひも付けをわかりやすくするためのもの」(加藤田氏)だという。

 処理シーケンスについては、他のリクエスト・ベースのアプリケーションとは異なり、処理前と処理後に画面描画を行う「二段構成」がひとまとまりになって進む点がポイントとなる(下図の番号は上図の番号に対応する)。


※クリックすると拡大画像が見られます

 JSFの構成要素としては、画面側にXHTMLベースのテンプレート・エンジンであるFaceletsとEL、サーバ側には値や処理を制御するバッキングBean(ManagedBeanもしくはCDIで作成)およびビジネス・ロジック(SessionBeanとエンティティ)などが必要になる。

 なお、JSF 2.2で提供される画面側のコンポーネントとしては、次のようなものがある。

【JSF 2.2で提供される画面側のコンポーネント】

  • Faceletsテンプレーティング
  • HTMLベーシック
  • Faceletsコア
  • 複合コンポーネント
  • パススルー・アトリビュート
  • パススルー・エレメント

 このうちFaceletsテンプレーティングは、Apache Tilesのような画面のテンプレート機能を提供するものだ。テンプレートをファイルとして用意しておけば、個々の画面の作成者は、そのファイル名を指定するだけでテンプレートを使えるようになる。

 また、サーバ側の機能としては、outcome値による画面遷移の仕組み、SessionやRequestをはじめとするほとんどの情報にアクセスできるFacesContextインスタンスなどがある。

大幅に強化されたEL 3.0、JSFとの親和性が高まったCDI 1.1

 JSFによるWebアプリケーション開発で、演算結果や参照結果を返す処理の簡易的な記法であるELは、Java EE 6のEL 2.2からEL 3.0へとメジャー・バージョンアップされた。最大の変更点は、ELでLambda式を使うことが可能になった点だ。Lambda式は今後、Java SE 8での対応が予定されているが、それに先行してELで使用できるようになった。


※クリックすると拡大画像が見られます

 また、filterやmapといったコレクション系のストリーム・パイプラインが利用可能になったほか、これまで対応していなかったstaticフィールド・メソッドの参照、Enumの参照などが可能になっている。

 さらに、セミコロン・オペレータによる複数処理の記述、アサインメント・オペレータによる代入処理、文字列連結処理などにも対応した。

 「今回のバージョンアップにより、ELそのものが1つの言語として成り立つほどに豊富な機能を持つようになりました。ELは今後、JSFの画面処理だけでなく、Java開発のさまざまな場面で使われるようになるかもしれません」(加藤田氏)

 インスタンス注入(インジェクト)の仕組みであるCDIについては、Java EE 6のCDI 1.0からCDI 1.1にバージョンアップされている。EJBやJSFなど、さまざまな技術をまたがって使われるCDIには、主に「依存性の注入(DI:Dependency Injection)」、「ライフサイクル管理」、「ログ出力などの横断的な処理(AOP)の追加」という3つの役割がある。JSFとの連携では、CDIのクラスにアノテーション@Namedを付加しておき、FaceletsからEL式で参照するといったかたちで使用する。


※クリックすると拡大画像が見られます

※クリックすると拡大画像が見られます

 最新のCDI 1.1では、JSFでViewScopedやFlowScopedが使えるようになったほか、JSFのコンバータやバリデータでの@Injectの使用、Java Transaction API(JTA)で定義されている@Transactionalへの対応など、主に他の仕様との親和性の向上が図られている。加えて、以前のバージョンではCDIを有効にするためにbeans.xmlを用意する必要があったが、CDI 1.1からは何も用意しなくてもデフォルトで有効化されるようになった。

使って感じたJSFのメリット、使用上の注意点

 最後に加藤田氏は、これまで業務でJSFによる開発を行う中で感じたメリットと、使用に際しての注意点に触れた。

 まずJSFを使った開発の大きなメリットは、「コンポーネント・ベースのため、画面と処理の関連性がわかりやすい」ことだという。このわかりやすさは、開発生産性の高さや保守性の高さにつながるものだ。

 また、JSFはAjaxに対応しているため、「Ajaxを活用した高度なUIを、JavaScriptに関する深い知識がなくても作れる」、「UIやロジックの部品化が容易で再利用性しやすい」、「標準技術であるため仕様の信頼性が高く、将来にわたって資産を保護できる」といった点もメリットとして挙げた。

 一方、使用にあたっての注意点としては、「セッションを前提としたシステム構成を開発時に意識する必要がある」、コンポーネント・ツリーをサーバに保持する仕組みであるため「クライアント側での動的な画面生成は難しい」、「コンポーネントを大量に使用するとパフォーマンスが低下する」といったことがあるという。

 「JSF 2.2は、新機能もさることながら、CDIとの相性の向上や、ファイル・アップロード機能の提供、ステートレス・モードの追加など、開発を行う際に便利な機能改善が多いことがポイントだと思います。

 ただし、新機能に関しては、まだバグが残っている部分もあり、対応するアプリケーション・サーバも少ないので、まずはJava EE 6のJSF 2.1から取り組みを始めることをお勧めします。初期のJSFには、XMLで膨大な量の設定情報を書く必要があったり、必要な機能が不足していたりといった課題がありましたが、現在のJSFはそれとは別物と言ってよいほどまでに進化しています」(加藤田氏)

 なお、先にパフォーマンス低下を注意点として挙げたが、これも初期のバージョンに比べれば飛躍的に改善されているという。加藤田氏は、「初期のJSFを使ってみて『使いづらい』、『パフォーマンスが悪い』と感じた方こそ、この機会に改めてJSFを試してみてください。JSF 2.2に対応したNetBeansと併せて使うことで、大幅に生産性が向上することを実感できるはずです」と呼びかけて講演を締めくくった。

 以上、ここではJava EE 7のJSF 2.2と、その関連機能であるCDI 1.1、EL 3.0の主な強化ポイントを紹介した。読者もぜひ、加藤田氏が勧めるようにJava EE 6で今すぐ新たなJSFによる開発に取り組んでいただきたい。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]