web-dev-qa-db-ja.com

c:whenとc:ifが機能しない

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}"/>
14
egbokul

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>

以下も参照してください。

25
BalusC
<c:if test="#{myBean.myValue == 1}">

JSF2以前は、これらのJSTLのようなFaceletsタグは、ツリーの作成時にのみ評価されていました( ref )。

JSF2 doc for c:if はこれについて言及しておらず、2つのFaceletsバージョンには互換性がないことを知っています(は間違いなく仕様では)、そしてこの文脈で「処理された」が何を意味するのか私には明確ではありません。仕様を詳しく調べて動作を詳細に説明しているかどうかを確認し、実行時に コンポーネントツリー の内容を確認し、ビューの作成時にオブジェクトの状態を確認することをお勧めします。

5
McDowell

ほとんどの場合、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 (ページ翻訳を使用してください)から構成できます。

1
Tires