web-dev-qa-db-fra.com

c: quand et c: si ça ne marche pas

Je peux accéder à ma variable stockée dans un bean de sauvegarde depuis ma page JSF2, donc des choses comme

<h:outputText value="#{myBean.myValue}"/>

travail, et la valeur (qui est un int btw.) s'imprime bien. Cependant, lorsque vous essayez d'utiliser cette valeur dans des expressions conditionnelles dans c: if et/ou c: when, elle ne vaut jamais rien ... donc:

<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>

ou même

#{myBean.myValue eq '1'} 

ou

#{myBean.myValue == '1'}

ne sera jamais évalué à vrai, même si la valeur est bien 1 ou> 1.

Chose ennuyeuse, la comparaison fonctionne dans l'attribut rend d'une balise! Donc ça:

<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>

c'est bien!

Que se passe-t-il?

MISE À JOUR:

Cela marche:

public int getMyValue() {
    return 1;
}

mais cela ne signifie pas:

@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}

La valeur de l'int est imprimée correctement, mais 1 == 1 est faux.

Les beans entité sont-ils traités d'une manière spéciale? Puis-je les utiliser pour afficher leur valeur sur l'interface utilisateur?

PDATE2:

<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>

imprime Java.lang.Integer.

PDATE3:

Voici le code complet:

<?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>

Il fonctionne lorsqu'il est appelé avec une valeur int. Mais cela ne fonctionne pas:

    <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>

Cela affiche la valeur correcte:

<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
14
egbokul

Avez-vous déclaré le taglib de base JSTL comme suit?

<html xmlns:c="http://Java.Sun.com/jsp/jstl/core">

S'ils ne sont pas déclarés ou s'ils sont incorrectement déclarés, ils ne seront tout simplement pas analysés et finiront en vanille ordinaire dans la sortie HTML générée. Vous pouvez le confirmer en ouvrant la page dans le navigateur, en la cliquant avec le bouton droit et en choisissant Voir la source. Vous ne devriez voir aucune balise JSTL là-dedans.


Mise à jour : selon votre mise à jour, elle est liée au fait que JSTL s'exécute pendant le temps de génération de la vue et JSF pendant le temps de rendu de la vue. Dans votre cas particulier, tout cela échouerait si #{cc.attrs.orderStatus} uniquement disponible pendant le rendu de la vue. Par exemple, lorsqu'il représente l'élément actuellement itéré d'un composant d'itération, tel que <h:dataTable>.

Vous feriez mieux de réécrire le composant composite comme suit pour utiliser l'attribut rendered à la place:

<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>

Voir également:

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

Avant JSF2, ces balises Facelets de type JSTL n'étaient évaluées qu'au moment de la création de l'arborescence ( ref ).

Le doc JSF2 pour c: if ne le mentionne pas et je sais que les deux versions de Facelets ne sont pas compatibles (c'est définitivement dans la spécification) et il n'est pas clair pour moi ce que signifie "traité" dans ce contexte. Il peut être utile de parcourir la spécification pour voir si elle décrit le comportement plus en détail, vérifiez ce qui se trouve dans votre arborescence des composants au moment de l'exécution et vérifiez l'état de votre objet au moment de la création de la vue.

5
McDowell

Dans la plupart des cas, vous pouvez remplacer un attribut rendu, dans certains cas, vous pouvez ajouter un composant supplémentaire neutre comme.

Car il existe une alternative, qui fonctionne plus léger et avec le cycle de vie 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>

Vous pouvez configurer à partir de http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-OtherwiseTag (veuillez utiliser la traduction de page).

1
Tires