- PR -

JSFのdataTableについて

1
投稿者投稿内容
tak
会議室デビュー日: 2005/07/06
投稿数: 12
お住まい・勤務地: Tokyo
投稿日時: 2006-07-07 13:28
いつもお世話になっております。

ただ今JSFを使用した開発を進めておりますが、いくつか実装方法をどうするのか悩んでいる部分があり、
ご助言頂ければと思い投稿させていただきました。

悩んでいる部分というのは、以下の2つです。

1. dataTableでの動的にColumnを生成したい場合の最適解
2. dataTableのColumnのヘッダに表示する値を動的に指定すると表示されない

1に関しては、コンポーネントバインディングを使用したり、
Columnを予め予想される最大数を用意しておきrenderedで切り替えるなど、
いくつか実現する方法は確認しているのですが、今現在皆さんはどの様にしているのか
というのが気になった次第です。
#ほとんどの方がMyFaces等を使っているのでしょうか。。

2に関しても1と被ってくる部分ではあるのですが、私の環境ですと以下の様な現象が起こっています。

<h:dataTable var="item" value="#{bean.result}" >
<h:column id="column1" >
<f:facet name="header">
<h:outputText value="#{item.name}" />
</f:facet>
<h:outputText value="#{item.value}" />
</h:column>
</h:dataTable>

この様な場合に#{item.value}は問題なく取得も出来表示されるのですが、
#{item.name}の方は表示されません。
(name,value共に値は確実に入っているという前提です)
尚、#{item.value}をヘッダ部に入れ替えても同じ現象が発生します。
そもそもdataTableのヘッダ部には動的な値を指定できないのでしょうか?

以上、どんな事でも結構ですのでご助言頂けたらと思います。

環境:
JSF実装 ... IBM JSF
稼働環境 ... WebSphere Portal5.0.2 (J2EE1.3, JRE 1.3)
#少々特殊ですが,JSF RIの場合などでは..という風にお答え頂いて構いません。

どうぞよろしくお願いいたします。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-07 13:55
引用:
1に関しては、コンポーネントバインディングを使用したり、
Columnを予め予想される最大数を用意しておきrenderedで切り替えるなど、


rendered="#{bean.numColumns > 5}"のような感じでしょうか。

引用:
#ほとんどの方がMyFaces等を使っているのでしょうか。。


そんなところでしょう。

引用:
この様な場合に#{item.value}は問題なく取得も出来表示されるのですが、
#{item.name}の方は表示されません。
ろしくお願いいたします。


当然です。dataTableでは、rowIndexを0からインクリメントしながらループ処理でレンダリング(その他の処理も)を行い、その時、ループ内でvarで指定した変数をrequestスコープで束縛します。header, footerはループの外なのでvar変数は束縛されていません。

[ メッセージ編集済み 編集者: よしだひろゆき 編集日時 2006-07-07 13:56 ]
t_yamo
常連さん
会議室デビュー日: 2006/02/16
投稿数: 21
投稿日時: 2006-07-07 14:37
私はMyFacesを使ってますので、カラム数が動的に変化する場合はTomahawkの「<t:columns>」や「<t:dataList>」で実装しています。
Tomahawk 1.1.3はJSF RIとの互換性を強く意識している様ですので、IBM JSFでも使えるかもしれません(未確認)。

過去の類似情報
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27968&forum=12&7
tak
会議室デビュー日: 2005/07/06
投稿数: 12
お住まい・勤務地: Tokyo
投稿日時: 2006-07-07 20:57
よしださん、t_yamoさんご返信ありがとうございます。

引用:
当然です。dataTableでは、rowIndex を0からインクリメントしながらループ処理でレンダリング(その他の処理も)を行い、その時、ループ内でvarで指定した変数をrequestスコープで束縛します。header, footerはループの外なのでvar変数は束縛されていません。



なるほど。。非常に参考になります。

確かに考えてみれば出来るはずがないですね。
そうなると1のrenderedで切り替えというのも、無理そうですね。

もともと構想としては、Columnのrendered属性にvar変数の値が入っているかの計算式を入れて、
Column毎に表示、非表示を判断しようと考えていたのですが、この方法も無理ですね。

引用:
私はMyFacesを使ってますので、カラム数が動的に変化する場合はTomahawkの「<t:columns>」や「<t:dataList>」で実装しています。
Tomahawk 1.1.3はJSF RIとの互換性を強く意識している様ですので、IBM JSFでも使えるかもしれません(未確認)。



MyFacesは標準のものと比べるとはるかに拡張機能が豊富ですし、
一度採用してみたいのですが、今回はPortletでJSFを扱う必要があるので断念した次第です。
#PortalServerがJRE1.3というのが足枷になっています。。

いずれの方法にしろ、標準のdataTableで動的なColumnを生成するのは
どれも無理矢理するしかないという感じですね。

現在、JSFで実装するか、他の技術で実装するか判断に迫られているのですが、
他に標準のdataTableで動的なColumnを表示する良いロジック、案があればアドバイス頂けたらと思います。
1

スキルアップ/キャリアアップ(JOB@IT)