如何在 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;
是 XML 中的 special character,表示像 &amp;
这样以 ;
字符结尾的实体的开始。您需要逃避它,这很难看:
rendered="#beanA.prompt == true && 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将&&
替换为and
:
Search: (#\[^\]*)(&&)([^\]*\)
Replace: $1and$3
如果您在 EL 表达式中使用 >2 个文字,您已经多次运行此正则表达式替换以查找所有出现的情况。如果您的 EL 表达式语法不同,请注意将前导 # 替换为 $。
【讨论】:
以上是关于如何在 Facelets 的 EL 布尔表达式中使用 &&?的主要内容,如果未能解决你的问题,请参考以下文章
将 EL 方法表达式作为自定义 Facelets 标记文件的属性传递