如何在Facelets的EL布尔表达式中使用&&?


83

我在弄清楚Facelets中EL表达式的处理方法和方法时遇到了一些麻烦。所以基本上我有:

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

但我不断得到:

错误跟踪[行:69]实体名称必须紧随实体引用中的“&”之后。

Answers:


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}"

2
JSF的实现应该真正认识到这种情况并给出更好的诊断。这是一个简单的问题,但对于初学者来说非常令人困惑。
Mike Braun

6

除了BalusC的答案之外,请使用以下Java RegExp替换&&and

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

您多次运行了此正则表达式替换操作,以查找所有情况,以防您在EL表达式中使用> 2字面量。如果您的EL表达式语法不同,请注意用$替换前导#。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.