在jsp中显示Java bean的boolean
属性时遇到了一个奇怪的问题。看来,名为isEmpty()
的getter会在EL解析器上导致ParseException。
出于演示目的,我创建了一个显示问题的类。
public class Bookcase {
public boolean isWithoutContent() {
return true;
}
public boolean isEmpty() {
return true;
}
}
调用jsp中的属性:
${bookcase.withoutContent}
${bookcase.empty}
第一个显示true
而第二个显示错误:
org.apache.el.parser.ParseException: Encountered " "empty" "empty ""
at line 1, column 23.
Was expecting:
<IDENTIFIER> ...
现在我知道那里有一个EL empty
运算符但很明显,点运算符建议我在isEmpty()
对象上调用bookcase
方法?显然不是,考虑到错误。
在实际的bean上我不能/不想重命名isEmpty()
方法,但是如何在jsp中显示这个属性?
答案 0 :(得分:2)
empty
是EL中的一个特殊关键字,它基本上检查空值和空虚。它通常用于如下:
<c:if test="${empty bean.object}"> <!-- if (object == null) -->
<c:if test="${empty bean.string}"> <!-- if (string == null || string.isEmpty()) -->
<c:if test="${empty bean.collection}"> <!-- if (collection == null || collection.isEmpty()) -->
<c:if test="${empty bean.map}"> <!-- if (map == null || map.isEmpty()) -->
<c:if test="${empty bean.array}"> <!-- if (array == null || array.length == 0) -->
但是,您使用它作为bean属性并且EL感到困惑。 EL specification禁止使用EL关键字和Java标识符作为bean属性名称:
1.17保留字
以下字词是为该语言保留的,不得用作标识符。
and eq gt true instanceof or ne le false empty not lt ge null div mod
请注意,其中许多单词现在不在语言中,但它们可能在将来,因此开发人员必须避免使用这些单词。
您需要重命名它,或者使用${bean['empty']}
中的括号表示法,或者作为完全不同的替代方案,让Bookcase
实施,例如Collection
界面,以便您可以使用${empty bookcase}
。
答案 1 :(得分:1)
毕竟这很简单:
${bookcase['empty']}
但是仍然让我感到困惑的是为什么在点符号中使用empty
就像保留字一样。