- PR -

JSF+faceletsでのJSTL使用について

1
投稿者投稿内容
青江
会議室デビュー日: 2008/10/14
投稿数: 4
投稿日時: 2008-10-14 19:42
JSF1.2 facelets1.8 にてWEBアプリを製造しています。
beanの持つCollectionからチェックボックスを生成するため、

<h:selectManyCheckbox value="#{testBean.selectedItem}">
<f:selectItems value="#{testBean.ckboxItem}" />
</h:selectManyCheckbox>

と記述してチェックボックスを表示していましたが(この時点で表示は問題なくできています。)、
#{testBean.ckboxItem}の項目数が多いため、
チェックボックス10個くらいで改行し、複数行で表示がしたいと思っています。
JSTLが使用できるとのことで、

<h:selectManyCheckbox value="#{testBean.selectedItem}">
<c:forEach items="#{testBean.ckboxItem}" var="ckboxitem" varStatus="status">
<f:selectItem itemValue="#{ckboxitem.value}" itemLabel="#{ckboxitem.label}" />
</c:forEach>
</h:selectManyCheckbox>

↑のようにして、c:forEach文でstatusのインデックスを見て改行処理を入れればいいかと思ったのですが、ラベルが空のチェックボックスが1つ表示されるのみでした。
エラー等は表示されません。
試しに

<c:if test="${1 == 0}" var="flg" />
<c:if test="${flg}" >
TRUEです
</c:if>
<c:if test="${!flg}" >
FALSEです
</c:if>

<c:forEach begin="1" end="10" varStatus="status">
index:#{status.index}
</c:forEach>
などともやってみたのですが、trueルートもfalseルートも両方表示されてしまい、ループの中身をも1回しか表示されませんでした。(エラーの表示はありませんでした。)
c:ifの時点でおかしいということは、何か根本的に間違っているのでしょうか。
チェックボックスの集合の途中で改行し、複数行で表示したい場合、どのようにして実現するものなのでしょうか?

色々調べてみたのですが、どうしても解決できず行き詰ってしまい、質問しました。
何かヒントやチェックポイント等ありましたらご教授ください。よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-10-15 09:21
faceletsでの正確な挙動は調べてないので間違っているかもしれませんが、
JSTLとJSFのコンポーネントでは評価のタイミングが違うので出来ません。

実現方法としては、Rendererを作る or 拡張する必要があります。

引用:

青江さんの書き込み (2008-10-14 19:42) より:
<h:selectManyCheckbox value="#{testBean.selectedItem}">
<c:forEach items="#{testBean.ckboxItem}" var="ckboxitem" varStatus="status">
<f:selectItem itemValue="#{ckboxitem.value}" itemLabel="#{ckboxitem.label}" />
</c:forEach>
</h:selectManyCheckbox>


この場合は、"#{testBean.ckboxItem}"の要素数に応じて、

コード:

<h:selectManyCheckbox value="#{testBean.selectedItem}">
  <f:selectItem itemValue="#{ckboxitem.value}" itemLabel="#{ckboxitem.label}" />
  <f:selectItem itemValue="#{ckboxitem.value}" itemLabel="#{ckboxitem.label}" />
  <f:selectItem itemValue="#{ckboxitem.value}" itemLabel="#{ckboxitem.label}" />
  (省略)
</h:selectManyCheckbox>


と書いた場合と同じような意味になります。
'$'と'#'のEL式の違いにも関係するのですが、<c:forEach>のvar="ckboxitem"を
ループが終わった後(タグの評価後⇒deferred)に参照しても意味はないですよね?
青江
会議室デビュー日: 2008/10/14
投稿数: 4
投稿日時: 2008-10-20 11:34
あしゅ様、レスありがとうございます。

ご指摘いただいた方法含め、いろいろ調べたり試したりしてみましたが、
やはりあしゅ様のおっしゃるように、制御文を入れて途中で改行やテーブルを閉じたりするのは無意味でした。
レンダラを自作するしかないようだという結論になりました。
レンダラの自作はまだ上手くできておらず、試行錯誤中ですが・・・


それと制御文が使用できない件ですが、自己解決しました。
faceletsでJSTLを使う場合、JSTLのライブラリのバージョンにかかわらず、JSTL1.0のネームスペースを指定しないとならないそうです。
JSTLを使用する際、ネームスペースはなんだっけ・・・とライブラリのtldファイルから引っ張ってきたのがいけなかったようです。
JSTL1.0のネームスペースにすることで<c:forEach/>等の制御文は正しく動作するようになりました。

また、お恥ずかしながら'$'と'#'のEL式の違い等をあまり意識していなかったので、
ご指摘いただいてから気づいて色々調べました。とてもためになりました。

ご丁寧な対応ありがとうございました。
1

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