Как использовать && в логических выражениях EL в Facelets?

83

У меня небольшие проблемы с тем, чтобы понять, как делать и с выражениями EL в Facelets. Итак, в основном у меня есть:

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

Но я продолжаю получать:

Обнаружена ошибка [строка: 69] Имя объекта должно сразу следовать за символом "&" в ссылке на объект.

Ландистер
источник

Ответы:

162

Facelets - это технология просмотра на основе XML. &Это специальный символ в XML , представляющий собой начало сущности , как , &amp;который заканчивается с ;характером. Вам нужно либо избежать этого, что уродливо:

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

или andвместо этого использовать ключевое слово, которое предпочтительнее с точки зрения удобочитаемости и удобства обслуживания:

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

Смотрите также:


Не связанное с конкретной проблемой, сравнение логических значений с логическими значениями имеет мало смысла, если выражение уже ожидает логический результат. Я бы избавился от == true:

rendered="#{beanA.prompt and beanB.currentBase != null}"
BalusC
источник
2
Реализация JSF действительно должна распознать этот случай и дать лучшую диагностику. Это простая проблема, но очень запутанная для новичков.
Майк Браун,
6

В дополнение к ответу BalusC используйте следующий Java RegExp для замены &&на and:

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

Вы запускали эту замену регулярного выражения несколько раз, чтобы найти все вхождения в случае, если вы используете> 2 литералов в своих выражениях EL. Не забудьте заменить начальный # на $, если синтаксис вашего выражения EL отличается.

Флориан Сагер
источник