【问题标题】:Cannot read Boolean property in JSP EL [duplicate]无法读取 JSP EL 中的布尔属性 [重复]
【发布时间】:2011-04-18 01:05:16
【问题描述】:

如果一个对象属性被声明为布尔类型(不是原始布尔),那么 EL 识别它似乎有问题!

假设你有以下对象

class Case{
     private Boolean  valid;

     public Boolean isValid(){
         return this.valid;
     }

     public void setValid(Boolean val){
         this.valid = val;
     }
}

假设我们在请求中放入了一个名为“case”的Case类型的对象,那么我在JSP中试试这个:

<td>Object is ${case.valid ? "Valid":"Invalid"} </td>

这给了我错误“有效”不是对象的属性案例!如果我将有效的布尔值更改为原始布尔值,它就可以工作!

这是 EL 中布尔类型的一个已知问题,即它们不被识别为布尔值而是作为 Java“普通”对象?处理这个问题的正确方法是什么?

谢谢

【问题讨论】:

  • 我是一个菜鸟 JSP 用户,但你的 valid 对象变量声明中的 private 不是意味着你不能直接访问它吗?
  • 是的,这在 Java 世界中是正确的,但是使用 EL,您可以使用 JavaBean 样式 (object.propertyName) 访问对象属性,前提是您提供了一个 getter(在本例中为 isValid)。因此,当您说 case.valid 时,您实际上是在调用 case.isValid()。您可以看到,如果我将 Boolean 更改为 boolean 它工作正常。
  • 那么如果调用isValid()这个方法,是不是也一样不行呢?
  • 你不能在 EL 中调用 isValid(),正如我所说,你使用 JavaBean 访问样式 object.propertyname。
  • 所以我想我的下一个问题是,如果您将该声明更改为公开,它不起作用? (只是检查)

标签: jsp el


【解决方案1】:

我见过的所有例子都在谈论 boolean 属性,这些属性除了 getProperty() 之外,还允许使用 isProperty() 形式的 getter,而从来没有 Booleans。

我找不到对此行为的任何“官方”参考,但this blog post 似乎描述了我最初评论时所怀疑的内容 - Boolean 是一个对象,而 boolean 是一个原语,而 Java 有自动装箱,EL 将忽略返回 BooleanisProperty() getter,而是寻找 getProperty() 方法。

所以我怀疑,在您的示例中,如果您将isValid() 的返回类型更改为boolean 而不是Boolean(但将字段类型保留为Boolean),您的EL 表达式将起作用如您所愿。

【讨论】:

  • 博文不存在。
  • 优秀的想法,关于布尔/布尔和 is/get。它真的帮助了我。在此处 +1,对您的另一个答案 +1。但是提到的博客不再存在,谁知道我们在哪里可以获得完整的信息,关于为字段和函数和参数设置 b/Boolean 的变体,如果文档中没有描述,不同服务器的行为可能会有所不同。 ..顺便说一句,根据我的实验,布尔值是......不起作用,只有布尔值......(JBoss)
【解决方案2】:

EL 将 Boolean 视为一个对象(这是完全正确的),因此它会查找 getValid() 方法。这符合 JavaBeans 规范。

尝试将您的属性从 Boolean 引用类型更改为 boolean 原始类型。如果这是不可能的,并且您正在使用新的 EL(即 2.2 - 我不确定 2.1),您可以调用一个方法,因此 ${case.isValid()} 将是正确使用此新 EL 功能的一个示例。

【讨论】:

    【解决方案3】:

    JSP 允许或禁止某些 is/get-getter、Boolean/boolean 字段和 Boolean/boolean getter 的组合。如下:

    禁止组合:

    Boolean method, getting by is
    

    允许的组合:

    Boolean method, getting by get
    boolean method, getting by is
    boolean method, getting by get
    

    布尔/布尔类型的字段无关紧要。

    在 IntelliJ 中,自动生成 getter 就足够了。


    通过启动所有组合进行检查。

        <c:if test="${actionBean.code_FMI}">
            <div>Boolean field, Boolean method, getting by is</div>
        </c:if>
        <c:if test="${actionBean.code_FMG}">
            <div>Boolean field, Boolean method, getting by get</div>
        </c:if>
        <c:if test="${actionBean.code_FmI}">
            <div>Boolean field, boolean method, getting by is</div>
        </c:if>
        <c:if test="${actionBean.code_FmG}">
            <div>Boolean field, boolean method, getting by get</div>
        </c:if>
        <c:if test="${actionBean.code_fMI}">
            <div>boolean field, Boolean method, getting by is</div>
        </c:if>
        <c:if test="${actionBean.code_fMG}">
            <div>boolean field, Boolean method, getting by get</div>
        </c:if>
        <c:if test="${actionBean.code_fmI}">
            <div>boolean field, boolean method, getting by is</div>
        </c:if>
        <c:if test="${actionBean.code_fmG}">
            <div>boolean field, boolean method, getting by get</div>
        </c:if>
    

    Java 豆:

    private Boolean code_FMI = true, code_FmI = true, code_FMG = true, code_FmG = true;
    private boolean code_fMI = true, code_fmI = true, code_fMG = true, code_fmG = true;
    
    public Boolean isCode_FMI() {
        return code_FMI;
    }
    
    public boolean isCode_FmI() {
        return code_FmI;
    }
    
    public Boolean getCode_FMG() {
        return code_FMG;
    }
    
    public boolean getCode_FmG() {
        return code_FmG;
    }
    
    public Boolean isCode_fMI() {
        return code_fMI;
    }
    
    public boolean isCode_fmI() {
        return code_fmI;
    }
    
    public Boolean getCode_fMG() {
        return code_fMG;
    }
    
    public boolean getCode_fmG() {
        return code_fmG;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2019-02-16
      • 2018-06-30
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多