2011-04-18 78 views
10

如果将对象属性声明为布尔类型(不是原始布尔值),那么EL在识别它时似乎存在问题!无法在JSP中读取布尔属性EL

假设你有下面的对象

class Case{ 
    private Boolean valid; 

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

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

说我们把这类案件的一个对象的名义下“案例”的要求,然后我尝试这种在JSP:

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

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

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

感谢

+0

我是一个noob JSP用户,但是不会在'valid'对象变量声明中使用'private'意味着你不能直接访问它? – 2011-04-18 01:12:29

+0

是的,在Java世界中这是真实的,但是对于EL,如果您提供了getter(本例中为isValid),则可以使用JavaBean样式(object.propertyName)访问对象属性。所以当你说case.valid你实际上调用case.isValid()。你可以看到,如果我将布尔值更改为布尔值,它可以正常工作。 – DhafirNz 2011-04-18 01:19:25

+0

所以,如果你调用方法'isValid()',它不工作? – 2011-04-18 01:20:39

回答

18

我见过谈boolean的性质,使形式isProperty()的干将除getProperty()永不Boolean S中的所有实例。

我找不到任何“官方”参考此行为,但似乎this blog post来形容我怀疑,当我最初评论 - 一个Boolean是一个对象而boolean是一个原始的,而Java有自动装箱,EL将忽略返回BooleanisProperty()吸气剂,而是改为寻找getProperty()方法。

所以我怀疑的是,在你的例子,如果你改变了isValid()返回类型boolean而不是Boolean(但保留字段的类型为Boolean),您的EL表达式会像您期望的工作。

+2

博客文章不存在。 – 2014-05-24 08:03:36

2

EL将布尔视为一个对象(这是完全正确的),因此它寻找getValid()方法。这与JavaBeans规范一致。

尝试将您的财产从Boolean参考类型更改为boolean原始类型。如果这是不可能的,并且你正在使用新的EL(即2.2 - 我不确定2.1),你可以调用一个方法,所以${case.isValid()}就是正确使用这个新EL特性的一个例子。