JSF2ページからバッキングBeanに格納されている変数にアクセスできるので、
<h:outputText value="#{myBean.myValue}"/>
動作し、値(int btw。)は正常に出力されます。ただし、この値をc:ifおよび/またはc:whenタグ内の条件式で使用しようとすると、決して何にも等しくありません... so:
<c:if test="#{myBean.myValue == 1}">
<c:set var="myVar" value="true"/>
</c:if>
<c:choose>
<c:when test="#{myBean.myValue > 1}">
<c:set var="myVar" value="true"/>
</c:when>
</c:choose>
あるいは
#{myBean.myValue eq '1'}
または
#{myBean.myValue == '1'}
値が実際に1または> 1であっても、trueと評価されることはありません。
厄介なことに、比較はタグのrendered属性で機能します。したがって、この:
<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>
結構です!
何が起こっている?
更新:
これは機能します:
public int getMyValue() {
return 1;
}
しかし、これはしません:
@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}
Intの値は正しく出力されますが、1 == 1は偽です。
エンティティBeanは特別な方法で処理されますか?それらをUIに値を表示するために使用できますか?
PDATE2:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
java.lang.Integerを出力します。
PDATE3:
ここに完全なコードがあります:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://Java.Sun.com/jsp/jstl/core"
xmlns:h="http://Java.Sun.com/jsf/html"
xmlns:cc="http://Java.Sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="orderStatus" required="true"/>
</cc:interface>
<cc:implementation>
<c:choose>
<c:when test="#{cc.attrs.orderStatus == 1}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 2}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 3}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:when test="#{cc.attrs.orderStatus == 99}" >
<c:set var="unknownStatus" value="false"/>
</c:when>
<c:otherwise>
<c:set var="unknownStatus" value="true"/>
</c:otherwise>
</c:choose>
<h:graphicImage url="#{resource['img/icons/flag_yellow.png']}" rendered="#{cc.attrs.orderStatus == 1}"/>
<h:outputText value="Created" rendered="#{cc.attrs.orderStatus == 1}"/>
<h:graphicImage url="#{resource['img/icons/flag_orange.png']}" rendered="#{cc.attrs.orderStatus == 2}"/>
<h:outputText value="Stopped" rendered="#{cc.attrs.orderStatus == 2}"/>
<h:graphicImage url="#{resource['img/icons/flag_green.png']}" rendered="#{cc.attrs.orderStatus == 3}"/>
<h:outputText value="Active" rendered="#{cc.attrs.orderStatus == 3}"/>
<h:graphicImage url="#{resource['img/icons/flag_red.png']}" rendered="#{cc.attrs.orderStatus == 99}"/>
<h:outputText value="Failed" rendered="#{cc.attrs.orderStatus == 99}"/>
<h:graphicImage url="#{resource['img/icons/question_mark.png']}" rendered="#{unknownStatus}"/>
<h:outputText value="Unknown" rendered="#{unknownStatus}"/>
</cc:implementation>
</html>
Int値で呼び出されたときに機能します。しかし、これはうまくいきません:
<p:dataTable value="#{cc.attrs.orders}" var="order">
<p:column>
<f:facet name="header">
<h:outputText value="Status"/>
</f:facet>
<mytag:orderStatus orderStatus="#{order.adcOrderStatus.orderStatus}"/>
</p:column>
</p:dataTable>
これは正しい値を表示します:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
JSTLコアtaglibを次のように宣言しましたか?
<html xmlns:c="http://Java.Sun.com/jsp/jstl/core">
宣言されていない場合、または誤って宣言されている場合、それらは単に解析されず、生成されたHTML出力で単純なバニラになります。これを確認するには、ブラウザーでページを開き、右クリックしてView Sourceを選択します。そこにJSTLタグは表示されません。
Update:更新に従って、ビューのビルド時にJSTLが実行され、ビューのレンダリング時にJSFが実行されるという事実に関連しています。あなたの特定のケースでは、ビューのレンダリング時にのみ#{cc.attrs.orderStatus}
が利用可能な場合、これはすべて失敗します。たとえば、<h:dataTable>
など、反復コンポーネントの現在反復されているアイテムを表す場合。
代わりにrendered
属性を使用するように、複合コンポーネントを次のように書き直すことをお勧めします。
<h:panelGroup rendered="#{cc.attrs.orderStatus == 1}">
<h:graphicImage url="#{resource['img/icons/flag_yellow.png']}" /> Created
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 2}">
<h:graphicImage url="#{resource['img/icons/flag_orange.png']}" /> Stopped
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 3}">
<h:graphicImage url="#{resource['img/icons/flag_green.png']}" /> Active
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus == 99}">
<h:graphicImage url="#{resource['img/icons/flag_red.png']}" /> Failed
</h:panelGroup>
<h:panelGroup rendered="#{cc.attrs.orderStatus != 1 && cc.attrs.orderStatus != 2 && cc.attrs.orderStatus != 3 && cc.attrs.orderStatus != 99}">
<h:graphicImage url="#{resource['img/icons/question_mark.png']}" /> Unknown
</h:panelGroup>
<c:if test="#{myBean.myValue == 1}">
JSF2以前は、これらのJSTLのようなFaceletsタグは、ツリーの作成時にのみ評価されていました( ref )。
JSF2 doc for c:if はこれについて言及しておらず、2つのFaceletsバージョンには互換性がないことを知っています(は間違いなく仕様では)、そしてこの文脈で「処理された」が何を意味するのか私には明確ではありません。仕様を詳しく調べて動作を詳細に説明しているかどうかを確認し、実行時に コンポーネントツリー の内容を確認し、ビューの作成時にオブジェクトの状態を確認することをお勧めします。
ほとんどの場合、rendered-Attributeに置き換えることができます。場合によっては、などの中立的な追加コンポーネントを追加できます。
JSFライフサイクルと一緒に使用すると、より軽量な代替手段があります。
<e:div>
<h:selectBooleanCheckbox id="boolean" value="#{bean.value}" rendered="#{bean.type == 'boolean'}"/>
...
<e:otherwise>
<h:inputText id="text" value="#{bean.value}"/>
</e:otherwise>
</e:div>
http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-OtherwiseTag (ページ翻訳を使用してください)から構成できます。