Как использовать && в EL булевых выражениях в Facelets?
У меня есть небольшая проблема, когда я выясняю, как это сделать и на выражениях EL в Facelets.
Так что в основном я:
<h:outputText id="Prompt"
value="Fobar"
rendered="#{beanA.prompt == true && beanB.currentBase !=null}" />
Но я продолжаю получать:
Ошибка трассировки [строка: 69] Имя объекта должно немедленно следовать за символом '&' в ссылке на объект.
Ответы
Ответ 1
Facelets - это технология просмотра на основе XML. &
представляет собой специальный символ в XML, представляющий начало объекта типа &
, который заканчивается символом ;
. Вам нужно либо сбежать, что уродливо:
rendered="#{beanA.prompt == true && beanB.currentBase != null}"
или вместо этого использовать ключевое слово and
, что является предпочтительным для удобства чтения и обслуживания:
rendered="#{beanA.prompt == true and beanB.currentBase != null}"
См. также:
Несвязанный к конкретной проблеме, сравнение булевых элементов с булевыми значениями маловероятно, когда выражение ожидает булевский результат. Я бы избавился от == true
:
rendered="#{beanA.prompt and beanB.currentBase != null}"
Ответ 2
В дополнение к ответу BalusC, используйте следующий Java RegExp, чтобы заменить &&
на and
:
Search: (#\{[^\}]*)(&&)([^\}]*\})
Replace: $1and$3
Вы использовали эту регулярную замену выражений несколько раз, чтобы найти все вхождения, если вы используете > 2 литерала в ваших выражениях EL. Ум, чтобы заменить ведущий # на $, если ваш синтаксис выражения EL отличается.