Wie verwende ich && in EL-Booleschen Ausdrücken in Facelets?

83

Ich habe ein kleines Problem damit, herauszufinden, wie man EL-Ausdrücke in Facelets verwendet und verwendet. Im Grunde habe ich also:

<h:outputText id="Prompt"
    value="Fobar" 
    rendered="#{beanA.prompt == true && beanB.currentBase !=null}" />

Aber ich bekomme immer:

Fehler verfolgt [Zeile: 69] Der Entitätsname muss unmittelbar auf das '&' in der Entitätsreferenz folgen.

Landister
quelle

Antworten:

161

Facelets ist eine XML-basierte Ansichtstechnologie. Das &ist ein Sonderzeichen in XML, das den Beginn einer Entität darstellt, wie sie &amp;mit dem ;Zeichen endet . Sie müssten entweder entkommen, was hässlich ist:

rendered="#{beanA.prompt == true &amp;&amp; beanB.currentBase != null}"

oder andstattdessen das Schlüsselwort zu verwenden, das hinsichtlich Lesbarkeit und Wartbarkeit bevorzugt wird:

rendered="#{beanA.prompt == true and beanB.currentBase != null}"

Siehe auch:


Unabhängig vom konkreten Problem macht der Vergleich von Booleschen Werten mit Booleschen Werten wenig Sinn, wenn der Ausdruck bereits ein boolesches Ergebnis erwartet. Ich würde loswerden == true:

rendered="#{beanA.prompt and beanB.currentBase != null}"
BalusC
quelle
2
Die JSF-Implementierung sollte diesen Fall wirklich erkennen und eine bessere Diagnose liefern. Es ist ein einfaches Problem, aber für Anfänger sehr verwirrend.
Mike Braun
6

Verwenden Sie zusätzlich zur Antwort von BalusC das folgende Java RegExp, um es zu ersetzen &&durch and:

Search:  (#\{[^\}]*)(&&)([^\}]*\})
Replace: $1and$3

Sie haben diese Ersetzung für reguläre Ausdrücke mehrmals ausgeführt, um alle Vorkommen zu finden, falls Sie in Ihren EL-Ausdrücken> 2 Literale verwenden. Ersetzen Sie das führende # durch $, wenn sich Ihre EL-Ausdruckssyntax unterscheidet.

Florian Sager
quelle