連載 役に立つXMLツール集(10)
XULとJSFでリッチクライアント 〜ロジック編〜 Page 2

www.netpotlet.com
原田洋子
2004/8/18

JSF利用者の5つのカテゴリ

 JSFの仕組みが分かったので、今度はプログラミングです。ここで、プログラムをどのように作るかを考える前に、JSFの利用者の定義を振り返ってみます。すでに前回説明したとおり、JSFの仕様では利用者をページ作成者、コンポーネント作成者、アプリケーション開発者、ツール提供者、JSF実装作成者の5つのカテゴリに分類しています。プレゼンテーションツールをJSPにしてHTML出力するという一般的なスタイルでWebベースのアプリケーションを開発するなら、ページ作成者とアプリケーション開発者の役割を担うだけで十分です。あらかじめ用意されているUIコンポーネントを間接的に使うだけで、UIコンポーネントのクラスを作ることはあまりありません。

 つまり、アプリケーション開発者の作業は通常、

  • JavaBeansのクラスを作る
  • リスナのクラスを作る
  • faces-config.xmlを書く

だけということになります。ただし、場合によっては入力値が想定どおりの形式になっているかどうかを調べるバリデーションのクラスや、オブジェクトの型変換を行うコンバータのクラスを作ることがあります。

 さて、ここ数回の記事では“レスポンスをXULで返す”“JSPを使わない”というサンプルを紹介していますので、そのためにはUIコンポーネントも作らなければなりませんでした。つまり、このサンプルではコンポーネント作成者の作業も必要になります。

 コンポーネント作成者になる場合、気を付けなければならないのはUIコンポーネントを使うだけの利用者がいるということです。つまり、プログラミング以外の何らかの方法でコンポーネントに十分な情報を渡せる手段を用意しておかなければならないのです。

JSPの指定方法

 コンポーネントを作らずにWebアプリケーションを作れるようにするため、JSFではJSPのカスタムタグを多数定義しています。例えば、フォームから入力されるパラメータを扱う場合は、

  <h:inputText id="username" value="#{logonBean.username}"/>

のようにinputTextタグのvalue属性を使ってJavaBeansのプロパティにセットするという指示を出せるようになっています。また、リスナについては

  <h:commandButton label="Login">
    <f:actionListener type="custom.MyActionListener"/>
  </h:commandButton>

のように指示できます。ValidatorやConverterも、JSPのJSF用カスタムタグを使って指定できるようになっています。

XULの定義

 では、XULで同様の指定方法をどのようにして採り入れるかを考えます。サンプルはデータバインディングツールを利用してプログラミングしますから、定義が必要です。前回はXMLインスタンスから定義を引き出しました。確かにこの方法はスキーマを記述しなくていいので、手軽に始められます。しかし、わずかでも構成が変わるとこれまでのプログラムでは対応できなくなってしまいますので、アイデアを試す程度にしておくのがよさそうです。今回はRELAX NGでXULのスキーマを定義しました。

 スキーマ定義ですから、まず、XULにどのような要素と属性があるかを調べます。本連載「第8回 XULとJSFでリッチクライアント 〜XUL編〜」で紹介したXUL Planetの解説を参考にしますが、すべてのタグを定義するとなるとかなりの数になります。これらすべてを1つのXML文書で定義しようとするとスキーマは巨大なファイルになってしまいます。そこで、基本的に1タグ1モジュール(1ファイル)に分割して定義を記述し、これらのモジュールをインクルードして統合する方法で全体を定義することにしました。この方法はバリデータ、Jing(本連載第5回参照)とともに配布されているXHTMLで採用されているので、これをお手本にしてXULのスキーマを定義しました。

 リスト1がタグの定義を統合したxul.rngです。7〜34行目で分割したモジュールをインクルードしています。モジュールについては数が多いのでダウンロード用アーカイブに入れてありますので、そちらを参照してください。11行目のbutton.rngと31行目のtextbox.rngだけをここで紹介します(リスト2、3参照)。

 リスト2の35〜37行目とリスト3の36〜38行目に注目してください。ひとまとめにして扱いたいタグは、このようにcombine="choice"を指定すればいくつでも追加できます。

リスト1 xul.rng(別ウィンドウで表示します)

リスト2 button.rng(別ウィンドウで表示します)

リスト3 textbox.rng(別ウィンドウで表示します)

XUL定義へのJSF要素の組み込み

 XULの定義ができたので、JSPのカスタムタグで行っていたようなJSF独自要素の組み込みを考えます。このとき、元のXUL定義には手を加えないようにします。というのは、元の定義に手を加えてしまうと、XULだけの定義が欲しい場合でもJSFの定義まで付いてきてしまうからです。どうすれば元の定義に手を加えないで新たな定義を追加できるかですが、本連載第5回ですでに紹介しましたので参照してください。元の定義をインクルードして必要な部分だけ再定義する方法です。オブジェクト指向的な表現をすると、ちょうど、継承してメソッドをオーバーライドするかのようなものです。

 リスト4のxul-jsf.rngがJSFで使う要素を追加した定義です。17、26行目に記述したように、XULのbuttonタグとtextboxタグでJSF専用のタグを使えるように拡張しました。7行目でインクルードしているのはリスト5のjsf-config.rngです。

 このような定義にするとリスト6のように書けるようになります。ここでは、

  • リスト6の5行目―名前空間を追加
    (リスト5の4行目で宣言した名前空間)
  • リスト6の21、28行目―JSF専用のタグを追加

を行っていますが、もちろんスキーマ定義による検証もできます。これで、JSFのWebアプリケーション開発者はUIコンポーネントに十分な情報を渡せるようになりました。

リスト4 xul-jsf.rng(別ウィンドウで表示します)

リスト5 jsf-config.rng(別ウィンドウで表示します)

リスト6 language.xul(別ウィンドウで表示します)


まとめ&サンプルダウンロード

 今回は、JSFではロジックをどう動かすように決められているか、また、XULにどのように組み込めばいいかを説明しましたが、いかがだったでしょうか。プレゼンテーション部分は利用者が必ず書くところです。そこに、サーバサイドで必要になる情報をどうやって記述できるようにするかは実装者にとっては悩みどころではないかと思います。今回はXML的な解決法、別の名前空間を設けて組み合わせるという方法を採用しました。これが唯一の方法ではありませんし最良ではないかもしれませんが、少なくとも用意しなければならないファイルが増えない、XULではないタグを使っているところが明らかになるという利点があります。

 次回は具体的にどのように実装するか、どのように動くかを見ていきます。

 なお、XULのRELAX NGによる定義とリスト6のXULファイル、XML文書の検証を行うAntのビルドファイルbuild.xmlをアーカイブにまとめましたので、ダウンロードして試してください。

1/2

 Index
連載 役に立つXMLツール集(10)
XULとJSFでリッチクライアント 〜ロジック編〜
  Page 1
・はじめに
・JSF仕様の復習
Page 2
・JSF利用者の5つのカテゴリ
・JSPの指定方法
・XULの定義
・XUL定義へのJSF要素の組み込み
・まとめ&サンプルダウンロード


「連載 役に立つXMLツール集」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間