无法读取布尔属性' isEmpty'在豆上

时间:2015-10-26 11:45:19

标签: jsp el

在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中显示这个属性?

2 个答案:

答案 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就像保留字一样。