では、このサンプルを動かしてみましょう。http://localhost:8080/SampleWebApp/jsfsampleでサーブレットを呼び出します。表示結果は次の画面のようになります。
ここで、JSFファイルとサーブレットの内容を振り返ってみましょう。
サーブレット内で作成したデータであるdataList(ArrayListクラス)を、JSFで表示します。データの表示部分は、[リスト4]のJSFファイルの(1)から(3)の部分です。JSFで表示したいオブジェクトの参照をするには #{ } で記述します。
今回参照したいオブジェクトはサーブレットにあるdataListオブジェクトでしたが、このオブジェクトをJSFへ引き渡すよう、コンテナに対して情報を格納してあげなければいけません。その方法は、リクエスト属性やセッション属性といった、サーブレットの世界ですでに格納する器が用意されているので、この器を利用します。この器に格納することで、サーブレットの処理が終了した後、別のサーブレットやJSF、JSPで参照できるようになります。
リクエスト属性はサーブレットが呼ばれてJSFが表示されるまで保存される領域で、大抵はリクエスト属性に格納することになります。対してセッション属性とは、明示的に消去するか、有効期限が過ぎるまで情報を保存してくれる領域です。複数の画面で繰り返し使われる情報をセッション属性に保存することで、処理の効率化や、コード量の軽減が可能です。
リクエスト属性などへ格納する具体的なコードですが、このサンプルではサーブレットの末尾の近くにて、request.setAttribute("dataList", dataList);と記述してある箇所になります。このメソッドはsetAttribute(名前,オブジェクト)でデータをサーブレットのリクエスト属性へ格納されるので、dataListとして作成したオブジェクト(ArrayList)がdataListという名前で格納していることになります。
サーブレット属性にデータが格納されたところで、次はJSFのコードに移ります。
(1)<h:dataTable>valueで指定したオブジェクトがテーブル形式で出力されます。var="item"と指定することで、この<h:dataTable>内で扱われるデータの1行分をitemという名前で扱うことができます。今回の例では、このitemはサーブレット内でdataListに格納していたMap1つになります。
(2)(3)で列の値を表示します。<h:column>は列要素を定義するタグで、左から表示したい順番に記述します。実際に表示される内容は<h:column></h:column>に挟んで記述していきます。
例えば(2)では、<h:outputText>要素があるので、valueで指定した値をエスケープ処理(※1)した上で表示します。表示する内容は #{ item.day }となっているので、itemオブジェクトが持っているdayの内容を表示することを意味します。itemオブジェクトは、今回Mapオブジェクトですから、本来であればget("名前")で参照するところを、.(ドット)で省略して記述できます。
このドットで連結して値やメソッドを指定する方法によって、より階層の深いオブジェクトでもメソッド名を省略して記述することが可能になり、コードが読みやすくなり、データとHTMLの構造がより理解しやすいものになります。
また、(2)(3)は、データの行数分繰り返して、自動的に出力されていきます。
表示する値にHTMLのタグ文字列(<,>)や制御に関する文字(&や"など)があった場合、そのまま出力するとHTMLのタグに影響を及ぼし、記述内容によっては表示されたくない内容を表示させてしまう。こういった文字列を外部参照文字に置換すること。例えば<は<に変換され、ブラウザ上では<で表示される。
まとめ
今回は、JSFのタグの中からdataTableを取り上げて、簡単にJSFでデータを表示する方法を紹介しましたが、次回ではよりもっとダイナミックに画面を作れるようになる、Ajaxを利用したFaceletsを取り上げていきます。