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

Lan*_*ter 81 jsf facelets el

我在Facelets中弄清楚如何处理EL表达式时遇到了一些麻烦.基本上我有:

<h:outputText id="Prompt"
    value="Fobar" 
    rendered="#{beanA.prompt == true && beanB.currentBase !=null}" />
Run Code Online (Sandbox Code Playgroud)

但我一直在:

错误跟踪[第69行]实体名称必须紧跟实体引用中的"&".

Bal*_*usC 157

Facelets是一种基于XML的视图技术.它&是XML中的一个特殊字符,表示&amp;;字符结尾的实体的开头.你需要逃避它,这是丑陋的:

rendered="#{beanA.prompt == true &amp;&amp; beanB.currentBase != null}"
Run Code Online (Sandbox Code Playgroud)

或者使用and关键字,这是可读性和可维护性的首选:

rendered="#{beanA.prompt == true and beanB.currentBase != null}"
Run Code Online (Sandbox Code Playgroud)

也可以看看:


具体问题无关,当表达式期望已经有布尔结果时,将布尔值与布尔值进行比较几乎没有意义.我摆脱了== true:

rendered="#{beanA.prompt and beanB.currentBase != null}"
Run Code Online (Sandbox Code Playgroud)

  • JSF的实际应该真正认识到这种情况并提供更好的诊断.这是一个简单的问题,但对初学者来说非常困惑. (2认同)

Flo*_*ger 6

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

Search:  (#\{[^\}]*)(&&)([^\}]*\})
Replace: $1and$3
Run Code Online (Sandbox Code Playgroud)

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