Jak używać && w wyrażeniach boolowskich EL w Facelets?

83

Mam mały problem ze zrozumieniem, jak to zrobić i na wyrażeniach EL w Facelets. Więc w zasadzie mam:

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

Ale ciągle dostaję:

Śledzenie błędów [wiersz: 69] Nazwa jednostki musi występować bezpośrednio po znaku „&” w odwołaniu do encji.

Landister
źródło

Odpowiedzi:

162

Facelets to technologia widoku oparta na języku XML. Jest &to znak specjalny w XML-u reprezentujący początek jednostki, na przykład &amp;kończący się ;znakiem. Musisz albo uciec, co jest brzydkie:

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

lub andzamiast tego użyć słowa kluczowego, które jest preferowane ze względu na czytelność i łatwość konserwacji:

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

Zobacz też:


Bez związku z konkretnym problemem, porównywanie wartości logicznych z wartościami logicznymi nie ma większego sensu, gdy wyrażenie oczekuje już wyniku boolowskiego. Pozbyłbym się == true:

rendered="#{beanA.prompt and beanB.currentBase != null}"
BalusC
źródło
2
Wdrożenie JSF powinno naprawdę rozpoznać ten przypadek i dać lepszą diagnostykę. To prosty problem, ale bardzo mylący dla początkujących.
Mike Braun,
6

Poza odpowiedzią BalusC, należy użyć następującego Java RegExp zastąpić &&z and:

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

Wykonałeś tę zamianę wyrażenia regularnego wiele razy, aby znaleźć wszystkie wystąpienia w przypadku, gdy używasz> 2 literałów w wyrażeniach EL. Postaraj się zastąpić wiodący # znakiem $, jeśli składnia wyrażenia EL jest inna.

Florian Sager
źródło