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

Posted

技术标签:

【中文标题】如何在 Facelets 的 EL 布尔表达式中使用 &&?【英文标题】:How to use && in EL boolean expressions in Facelets? 【发布时间】:2012-01-23 02:03:23 【问题描述】:

我在弄清楚如何在 Facelets 中使用 EL 表达式时遇到了一些麻烦。 所以基本上我有:

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

但我不断得到:

Error Traced[line: 69] 实体名称必须紧跟在 '&' 之后 在实体引用中。

【问题讨论】:

【参考方案1】:

Facelets 是一种基于 XML 的视图技术。 &amp;amp; 是 XML 中的 special character,表示像 &amp;amp; 这样以 ; 字符结尾的实体的开始。您需要逃避它,这很难看:

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

或使用and 关键字代替,这在可读性和可维护性方面是首选:

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

另见:

Java EE 6 tutorial - Operators in EL

与具体问题无关,当表达式已经期望布尔结果时,将布尔值与布尔值进行比较毫无意义。我会摆脱== true

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

【讨论】:

JSF 实现应该真正认识到这种情况并提供更好的诊断。这是一个简单的问题,但对初学者来说非常混乱。【参考方案2】:

除了BalusC的答案,使用下面的Java RegExp将&amp;&amp;替换为and

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

如果您在 EL 表达式中使用 >2 个文字,您已经多次运行此正则表达式替换以查找所有出现的情况。如果您的 EL 表达式语法不同,请注意将前导 # 替换为 $。

【讨论】:

以上是关于如何在 Facelets 的 EL 布尔表达式中使用 &&?的主要内容,如果未能解决你的问题,请参考以下文章

将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递

如何阻止 EL 表达式在未呈现的 JSF 组件中进行评估?

EL 提议/自动完成/代码辅助 Facelets 与 Eclipse

如何调试 JSF/EL

Facelets

如何检查 EL 中的布尔条件?