- PR -

JSF 列単位にレコード情報を出力する方法

1
投稿者投稿内容
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-01-31 15:11
こんにちわ。

<h:dataTable>で1行1レコードを出力するような、
1列に対して1レコードを出力するようなタグが
無いか調べているのですがどうもなさそうです。

取得したデータを入れ替え
1行に複数列保持するようにし、
<h:dataTable>で出力するくらいの方法しか思いつかないのですが、
何方かご存知の方がいらっしゃいましたら、よろしくお願いします。
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-02-01 22:45
自己レスです。

以下のような出力をしたいと思い、色々考えた結果、
次のように実装してみることにしました

表示形式:□はcheckBox
---------------------------------
□1件目 | □2件目 | □3件目
□4件目 | □5件目 | □6件目
---------------------------------

縦(<td>単位で<dataTable>を用い表示)
ManagedBean内でデータを取得したのち、
列単位のListに格納し直し、画面上に出力。

実際各項目にチェックボックスがあり、
コンポーネントにバインドさせてあります。
今現在はこれといった問題は無いのですが、
ここまでで精一杯でした。

効率的な方法をご存知の方がいましたらよろしくお願いします。

henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2006-02-02 13:03
拡張コンポーネントを使っても良いのであれば、MyFacesのtomahawkに反復を表す「<t:dataList>」があります。
単純に横に並べたい場合、あるいは逆に複雑な制御を行いたい場合に使えます。

ただ、例で示されているように一定の個数を横に並べたものを縦に並べたい場合は「<t:newspaperTable>」を使うと良いかと思います。

http://myfaces.apache.org/tlddoc/tomahawk/
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2006-02-02 13:06
補足です。
「基本的には縦並びだが、横の並びを動的に変えたい」という場合は「<t:columns>」があります。
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-02-03 14:41
返答が遅くなりました。

「<t:newspaperTable>」にて無事Bean内で
分岐させる処理を行わずに出力することが出来ました。

ありがとう御座います。

以下のように実装しました。
-----------------------------------------
<t:newspaperTable width="100%"
binding="#{bean.uiNewsPaperTable}"
value="#{bean.resultList}" var="result">

<h:column>
<h:selectBooleanCheckbox value="#{result.companycd}"
id="checked" rendered="#{result.companycd != null}"/>
<h:outputText value="&nbsp;" escape="false"/>
</h:column>
<h:column>
<h:outputLink id="companyInfo" target="_blank" value="../dummy.jsf">
<f:param value="#{result.companycd}" name="companycd" />
<h:outputText value="#{result.companyname}"/>
</h:outputLink>
<h:outputText value="&nbsp;" escape="false"/>
</h:column>

</t:newspaperTable>
-----------------------------------------
また、質問ばかりで申し訳ないのですが
コンポーネントをバインドさせ、
「どれがチェックされたのか」を取得したいのですが、
うまく取得できません。
バインドさせずにチェックされた情報を取得することは可能なのでしょうか。
参考になるHPなど紹介頂けると助かります。
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2006-02-03 16:27
選択対象は複数個という仕様で宜しいでしょうか。
(選択対象がひとつの場合はボタンを付けてDataModel#getRowData()ですね)

それであれば、例示されている"result"に対応したクラスにbooleanのフィールド"selected"を作成し、JSP側には以下の記述をすると良いかと思います。
<h:selectBooleanCheckbox value="#{result.selected}" />

"result"に対応したインスタンスと画面上のチェック有無は勝手に連動しますので、アクション内で"result"に対応したインスタンスのリストを調べることでチェックの状態を把握できます。
この場合、明示的にbindingを設定する必要はありません。

「アクション起動時点でチェック一覧が出来上がっていて欲しい」という場合はValueChangeListener内で対象コンポーネントの状態をチェック一覧に反映する処理を実行してあげると良さそうです。何だか不必要に煩雑な気もしますが。
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-02-09 22:34
henachocoさん、他皆様、ありがとうございます。

---
"result"に対応したインスタンスと画面上のチェック有無は勝手に連動しますので、アクション内で"result"に対応したインスタンスのリストを調べることでチェックの状態を把握できます。
この場合、明示的にbindingを設定する必要はありません。
---

理解度が足りないようで、上記のようには実装できませんでした。
現在は、HtmlNewsPaperTableコンポーネントをバインドさせて実装しています。

今はまた別な問題が出てきてしまった為、
暫くしたらもう一度チャレンジします。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-02-10 10:50
引用:

理解度が足りないようで、上記のようには実装できませんでした。


<h:selectBooleanCheckbox value="#{result.companycd}"
id="checked" rendered="#{result.companycd != null}"/>
というコーディングがおかしい気がします?
comapnycdとは名前から会社コードが入るプロパティですよね.
それをCheckboxのvalueにバインドする意図が不明.
Checkboxのvalueはチェックしたらtrueが入るbooleanプロパティをバインドするのが
普通でしょう.henachocoさんが説明しているように,例えば,
<h:selectBooleanCheckbox value="#{result.selected}" />
こうすると,selectedがtrueであればそのresultがチェックされたことが分かるわけです.


引用:

現在は、HtmlNewsPaperTableコンポーネントをバインドさせて実装しています。
らもう一度チャレンジします。


JSFのフレームワークの動きにそって実現するのが原則で,
コンポーネントバインディングは最後の手段とすべきだと思います.
そうでないと,あとで何をやっているのか理解しにくくて,保守性が非常に悪い
プログラムになります.

そもそも,JSFは,JSPを書く人,コンポーネントAPIを使う人,業務ロジックを書く人
が明確に役割分担できることに意味があります.コンポーネントバインディングは
この三者が分離できなくなるのでできるだけ避けるべきだと考えます.

どうしてもJSFのフレームワークや標準コンポーネントでは実装できない場合には,
まずコンポーネントバインディングを使って動作確認をしたあと,
それをカスタムコンポーネント化すべきです.
コンポーネントバインディングが使いこなせる人なら,カスタムコンポーネントを作る
のは簡単です.カスタムコンポーネント化すると,JSPを書く人も,業務ロジックを
書く人もそれを部品として利用することになるので,役割が分離できます.
1

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