JSF-rendering: Zustand des EL Aussage falsch
Ich habe ein problem mit meinem JSF-rendering. Einem bestimmten Zustand, in Expression-Sprache, wird nicht ausgeführt, in der richtigen Weise.
E. g:
Beispiel 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}" />
Beispiel 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>
Problem
In beiden Beispielen, sowohl meine Parameter werden Hinzugefügt, um meine Umgebung h:outputLink.
Ich bin nicht sicher, welche anderen code hinzufügen, so dass, wenn Sie Jungs brauchen etwas anderes, um mir zu helfen, werde ich Sie gerne zur Verfügung stellen.
Vielen Dank im Voraus.
Beispiel 3 (auf Anfrage)
<?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>
Habe ich aufgeräumt ist dieses Beispiel ein wenig, aber die Essenz ist da.
Ich habe die Stelle die ersten Beispiele von a, wenn/sonst-Konstruktion, ob mein Produkt.Kategorie.Eltern.uri null ist oder nicht, es wird mir das erste Ergebnis in diesem Fall.
NÖ, und das gegeben .uri null, in der Tat.
In der Tat sollten Sie Debuggen, warum das Produkt nicht in den Anwendungsbereich.
Was meinst du genau?
warum hat Ihr EL die " # " - Zeichen? sollte es nicht "$" ?
InformationsquelleAutor Menno | 2012-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre zentrale problem ist, dass Sie völlig unübersichtlich Ansicht erstellen tags und view render time-tags.
Ansicht bauen, die Zeit ist der moment, in eine XHTML-Datei konvertiert werden, um eine JSF-Komponente Baum als verfügbar
FacesContext#getViewRoot()
. Die Ansicht render-Zeit ist der moment, in der JSF-Komponente Baum zu erzeugen HTML-code, eingeleitet durchUIViewRoot#encodeAll()
.Alle JSTL
<c:xxx>
- tags und alle JSF<ui:xxx>
tags, die nicht haben einerendered
Attribut ausgeführt werden, während anzeigen erstellen. Alle JSF -<ui:xxx>
- tags, die tun haben einerendered
- Attribut, und alle JSF<h:xxx>
- tags beim anzeigen render-Zeit. Also, Sie laufen nicht synchron, wie Sie erwarten würden, von der Codierung.Kommen Sie zurück zu Ihrem konkreten problem, das ist zwei-Fach:
Den
<f:param>
gilt als ein tag-handler nicht unterstützenrendered
Attribut überhaupt.Den
#{product}
ist in Ihrem code definiert durch<ui:repeat var>
, dem sei ein Blick auf render-Zeit-tag, doch Sie versuchen zu lassen, JSTL<c:xxx>
Ansicht erstellen-tags abhängt. Dies wird natürlich nicht funktionieren. Die#{product}
istnull
bei der Betrachtung erstellen, weil einfach die<ui:repeat>
noch nicht zu diesem Zeitpunkt ausführen.Deinem konkreten problem kann nur gelöst werden, indem mit der Ansicht erstellen Zeit-tag
<c:forEach>
statt der view render time-tag<ui:repeat>
Durchlaufen Produkte.Siehe auch
Unabhängigen zu dem konkreten problem, der folgende ungeschickt block
kann ersetzt werden durch den folgenden einfacheren Ansatz mit Hilfe der conditional-operator in EL:
Diese Weise müssen Sie in der Lage sein zu halten mit der
<ui:repeat>
.Also, wenn einige faclets (ui-tags) und h-tags gehören zu der Ansicht, render-Zeit, zu was gehören die composite-und die reichen (richfaces) - tags?
Es muss ein taghandler, die Art, wie es sich verhält. So lassen sich benutzerdefinierte tags ausführen immer anzeigen erstellen? Nun, wie schaffen Sie dann benutzerdefinierte tags, die in view-render-Zeit (also, das ist nach Ansicht bauen, Zeit)?
bitte verwechseln Sie die Komponenten mit taghandlers.
Ich weiß es nicht. So, hier ist eine der zwei Antworten. Benutzerdefinierte tags gehören taghandlers als angenommen: balusc.blogspot.ch/2011/09/...
InformationsquelleAutor BalusC
Laut der Dokumentation gibt es keine
rendered
- Attribut zur Verfügung, die für dief:param
tag, damit es ignoriert wird.Sehen, JSF <2.x - http://docs.oracle.com/javaee/5/javaserverfaces/1.2/docs/tlddocs/f/param.html
Sehen für JSF - >2.0 - http://javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/f/param.html
Nun, das könnte darauf hindeuten, dass Beispiel 2 sollte immer noch funktionieren, so könnte ich Fragen, ob das nicht
product.category.parent.uri
ist wirklich null, im Gegensatz zu leer ist (d.h. leere Zeichenfolge). Haben Sie versucht, um zu testen, leer (Prüfungen für null und der leere string)?Die andere alternative, die zwar nicht ideal ist, ist bedingt erscheinen zwei separaten Ausgang links und bestimmen, welche zum Rendern basierend auf Ihrem Wert. Wie:
Ich gebe mal beide Vorschläge probieren!
Sparen Sie sich die Mühe. Keines von beiden, wird die Lösung für Ihr spezielles problem. Bionic_Geek selbst ist nicht zu verstehen, das konkrete problem und kann nur raten, die Antwort, ohne auch nur getestet/experimentiert der Anwendungsfall selbst.
Warum? Ich Stimme mit Ihrem Punkt auf render-Zeit-Problem, aber eine Zusammenlegung der beiden Antworten, haben wir zusammen mit einer passenden Schleife über die Daten der parameter Wahl, Problem ist das gleiche. Auch mit c:ForEach tag du bist immer noch nicht, um eine gerenderte Attribut auf eine f:param. Und es ist erwähnenswert, dass der code-snippet, das ich dort nicht wie der rest der facelets-tags, das macht es außerhalb des Bereichs der Kernfrage, die Sie gesprochen haben. Aber ich Schätze die unkonstruktiven flame in den Kommentaren.
InformationsquelleAutor Bionic_Geek