在EL中使用“&&”会导致错误:实体名称必须紧接着“&”出现在实体引用中。

13

我正在尝试在JSF中使用EL表达式中的条件表达式,但它无法正常工作。

<h:outputText value="#{(sel.description !=null) && (sel.description !='') ? sel.description : 'Empty description'} - "/>

但是它不起作用,编译器会报错:

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

你有任何建议吗? 谢谢!

2个回答

30

您似乎正在使用Facelets(这是完全可以的)。但是,它是一种基于XML的视图技术。在Facelets中编写的所有内容都必须是语法上有效的XML。在XML中,&是一个特殊字符,表示entity的开始,例如&amp;&lt;&gt;&#160;等。

如果您想在XML中将&表示为原样,则必须将其替换为&amp;

<h:outputText value="#{(sel.description !=null) &amp;&amp; (sel.description !='') ? sel.description : 'Empty description'} - "/>

然而,这并不是很易读的,您最好使用替代的EL运算符and(有关所有可用EL运算符的概述,请参见operators in EL):

<h:outputText value="#{(sel.description !=null) and (sel.description !='') ? sel.description : 'Empty description'} - "/>

总的来说,这种方法相当笨拙,因为有一个更简单的empty关键字可以用于测试null和空值。在您的特定情况下,可以使用以下方式:
<h:outputText value="#{not empty sel.description ? sel.description : 'Empty description'} - "/>

或者

<h:outputText value="#{!empty sel.description ? sel.description : 'Empty description'} - "/>

或者
<h:outputText value="#{empty sel.description ? 'Empty description' : sel.description} - "/>

1
哇,讲解得非常好。&& 对我有用,但出于可读性的考虑,我决定使用 'and'。谢谢提示。 - Dan Torrey

5

请使用and代替&&。您只是有一个XML语法错误。


1
@user1820620,这不仅仅是让它工作,而是学习技术的工作原理。 - Luiggi Mendoza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接