JSF rendu: la condition de EL déclaration incorrecte
J'ai un problème avec mon JSF-rendu. Une condition donnée dans l'Expression de la Langue ne sera pas exécuté dans le droit chemin.
E. g:
Exemple 1
<f:param name="cat" value="#{product.category.uri}" rendered="#{product.category.parent.uri == null}" />
<f:param name="cat" value="#{product.category.parent.uri}" rendered="#{product.category.parent.uri != null}" />
Exemple 2
<c:if test="#{product.category.parent.uri == null}">
<f:param name="cat" value="#{product.category.uri}" />
</c:if>
<c:if test="#{product.category.parent.uri != null}">
<f:param name="cat" value="#{product.category.parent.uri}" />
</c:if>
Problème
Dans les deux exemples, mes deux paramètres seront ajoutés à mon entourage h:outputLink.
Je ne suis pas sûr de ce que d'autres code à ajouter, donc si vous les gars ont besoin de rien d'autre pour m'aider, je serai heureux de fournir.
Merci d'avance.
Exemple 3 (sur demande)
<?xml version='1.0' encoding='UTF-8' ?>
<ui:composition template="./WEB-INF/templates/base.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:define name="content">
<c:choose>
<c:when test="#{webshop.productlist.size() > 0}">
<div id="spacer">
<ui:repeat value="#{webshop.productlist}" var="product">
<div id="block">
<p>
<h:outputLink value="product.xhtml">
#{product.name}
<c:choose>
<c:when test="#{product.category.parent.uri == null}">
<f:param name="cat" value="#{product.category.uri}" rendered="" />
</c:when>
<c:otherwise>
<f:param name="cat" value="#{product.category.parent.uri}" />
</c:otherwise>
</c:choose>
<f:param name="product" value="#{product.uri}" />
</h:outputLink>
</p>
</div>
</ui:repeat>
</div>
</c:when>
<c:otherwise>
(...)
</c:otherwise>
</c:choose>
</ui:define>
</ui:composition>
J'ai nettoyé cet exemple un peu, mais l'essentiel est là.
J'ai remplacé les premiers exemples par un lorsque/le contraire de la construction, si mon produit.de la catégorie.parent.uri est null ou pas, il me donnera le premier résultat dans ce cas.
Nope, et la donnée .uri est nul en fait.
En fait, vous devez déboguer pourquoi le produit n'est pas dans le champ d'application.
Que voulez-vous dire exactement?
pourquoi est-ce que votre EL ont le signe"#"? ne devrait-elle pas être "$" ?
OriginalL'auteur Menno | 2012-09-07
Vous devez vous connecter pour publier un commentaire.
Votre problème de base est que vous êtes complètement déroutante vue moment de la construction et de balises de vue, le temps de rendu des balises.
Le point de vue du temps de compilation est le moment où un fichier XHTML est être convertis à un composant JSF arbre à disposition par
FacesContext#getViewRoot()
. Le point de vue le temps de rendu est le moment où le JSF composant de l'arbre est sur le point de produire un code HTML, initié parUIViewRoot#encodeAll()
.Tous JSTL
<c:xxx>
balises et tous les JSF<ui:xxx>
balises qui ne pas ont unrendered
attribut exécuter pendant les temps de construction. Tous les JSF<ui:xxx>
balises qui ne ont unrendered
d'attributs et de toutes les JSF<h:xxx>
tags exécuter pendant les temps de rendu. Donc, ils ne courent pas dans la synchro comme vous pouvez vous attendre à partir du codage.De revenir à votre problème concret, c'est deux fois:
La
<f:param>
ne comme étant un tag handler pas en charge larendered
attribut.La
#{product}
est dans votre code défini par<ui:repeat var>
, ce qui est un point de vue temps de calcul de la balise, mais encore que vous essayez de laisser JSTL<c:xxx>
vue moment de la construction des balises en dépend. Ce ne sera évidemment pas le travail. Le#{product}
estnull
lors de la vue de la génération, tout simplement parce que le<ui:repeat>
n'a pas exécuté à ce moment-là.Concrètement, votre problème ne peut être résolu par l'utilisation de la vue moment de la construction de la balise
<c:forEach>
au lieu de la vue, le temps de rendu de la balise<ui:repeat>
pour itérer sur les produits.Voir aussi
Sans rapport avec au problème concret, le prédécesseur maladroit bloc
peut être remplacé par ce qui suit approche plus simple avec l'aide de l'opérateur conditionnel dans EL:
De cette façon, vous devez être en mesure de continuer à utiliser le
<ui:repeat>
.Donc si certains faclets (ui tags) et h balises appartiennent à la vue du temps de rendu, de ce qui appartient le composite et riche (richfaces) tags?
Il doit être un taghandler, la façon dont il se comporte. Donc la coutume balises de toujours exécuter en vue de construire des temps? Comment faites-vous pour créer ensuite des balises personnalisées qui s'exécutent en vue de rendre le temps (c'est donc après avoir vue le temps de construction)?
merci de ne pas confondre les composants avec taghandlers.
Je n'ai pas. Voici donc l'une des deux réponses. Les balises personnalisées appartiennent à taghandlers comme on le suppose: balusc.blogspot.ch/2011/09/...
OriginalL'auteur BalusC
Selon la documentation, il n'y a pas de
rendered
attribut disponible pour lef:param
balise de sorte qu'il est ignoré.Voir JSF <2.x - http://docs.oracle.com/javaee/5/javaserverfaces/1.2/docs/tlddocs/f/param.html
Voir JSF >2.0 - http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/f/param.html
Maintenant que peut suggérer que l'exemple 2 doivent encore travailler, donc je pourrais question de savoir si ou de ne pas
product.category.parent.uri
est vraiment nul, par opposition à vide (c'est à dire chaîne vide). Avez-vous essayé de test à vide (vérifie nulle et chaîne vide)?L'autre alternative, tout n'est pas idéal, est conditionnelle, rendu deux sortie séparée des liens et de déterminer de rendu basé sur votre valeur. Tels que:
Je vais vous donner les deux suggestions de l'essayer!
Vous épargner l'effort. Aucun des deux permettra de résoudre votre problème particulier. Bionic_Geek est elle-même ne pas comprendre le problème concret à tous et juste deviner la réponse sans même avoir testé/expérimenté le cas d'utilisation elle-même.
Pourquoi? Je suis d'accord avec votre point de vue sur le temps de rendu problème, mais la fusion des deux réponses que nous avons fait ensemble, avec une bonne boucle sur les données le paramètre de choix question est la même. Même avec un c:ForEach tag vous n'êtes toujours pas aller pour avoir un rendu attribut sur un f:param. Et il vaut la peine de mentionner que l'extrait de code j'ai mis il n'y a pas, y compris le reste de la facelets balises qui en fait en dehors de la portée de la question principale, vous étiez en train de parler. Mais j'apprécie le peu constructive de la flamme dans vos commentaires.
OriginalL'auteur Bionic_Geek