- PR -

JSFでのカスタムタグ作成

1
投稿者投稿内容
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-01-16 22:32
はじめまして、

現在、勉強の為にJSFを使用しているのですが、(まだまだ勉強不足です)
<h:dataTable>内で、データをリスト表示させる箇所で、
条件分岐のタグを作成しようと思ったのですが、動作しませんでした。
具体的には、
<h:dataTable value="#{testBean.results}" var="list">とし
---
<h:column>
<h:outputText value="#{list.key}">
</h:column>
<h:column>
<h:outputText value="#{list.name}">
</h:column>
としています。
データの表示は問題ないのですが、
ここで、
<test:jyoken value="#{list.name}" compare="<%= Hoge.kei1 %>">
<h:outputText value="#{list.name}">
</test:jyoken>
上記のように、jyokenタグのvalueとcomapreを比較し、同値ならば
<h:outputText value="#{list.name}">
を出力する。(単純に、doStart()でSKIP_BODYさせるかを判断させたい)
としたいのですが、dataTableで指定したvar属性から
値を取得できません。

outputTextのrendered属性を使用することも考えたのですが、
分岐パターンが多く、また、上記のように<%= %>が使用できなかったもので
このようなタグを作成出来ないか。とチャレンジしていました。

ループしない箇所で似たような条件分岐のタグを作成したのですが
それは問題なく値を取得し処理されました。

どなたかご存知の方がおりましたら、ご教授願えないでしょうか。
よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-01-17 12:08
どうしても、というのであればJSTLに<c:choose>や<c:if>タグがありますが、
JSPで細かく条件分岐する作りはあまりよくないと思いますよ。
他にも、JSFと組み合わせた場合は問題も起こりやすいですし。

バッキングビーン(var="list"の実体)側に出力したいデータを返す
プロパティを追加してみたり、変換して出力するプロパティを持った
JavaBeansで包んで扱ってみたらどうでしょうか。

コード:
public String getConvertedValue() {
  if (Hoge.getKei1().equals(getName()) {
    return getName();
  } else {
    return getKey();
  }
}

まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2006-01-18 02:07
ご指摘ありがとうございます。

まだまだJSFの各フェーズの動作を理解出来ていないため、
タグの作成は諦めました。
結果としましては、<h:outputText>等のrenderer属性を使用し
ManagedBeanにbooleanを返すメソッドを加え、
そのメソッド内でdataTableにバインドしたUIDataの現在行を取得し
値を取得、判断の処理。という形式を取りました。

表示パターンが多いため、力技ですが実現できました。

ありがとうございます。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-01-18 13:57
JSFの難しいところの一つなのですが,childコンポーネントのレンダリングを
親が実行する(encodeChildren)ものと,JSPに任せっぱなしのものがあります.
前者はrendersChildrenプロパティがtrueのものですが,どれがそうなのかは仕様書にも
javadocにも書いてありません >_<)

前者はh:commandLink,h:panalGrid, h:panelGroup, h:outputLink, h:dataTableなどです.
f:viewやh:formは後者です.

特にh:dataTableは繰返し処理をencodeChildrenの中で実施します.
具体的には,var属性で指定された繰返し変数にデータを一つずつバインドしてから,
childコンポーネント達のencodeBeginなどを呼び出します.
したがって,JSFのコンポーネントで表現されていないものは繰り返せません.
また「<%= Hoge.kei1 %>」はJSP実行でコンポーネントが作成されるときに評価されるので,
ループ処理時にバインドされるvar変数は参照できないのだと思います.
1

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