如果对象属性声明为Boolean类型(不是原始布尔值),那么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>
这给我错误“有效”不是对象Case的属性!如果我将有效值从布尔值更改为原始布尔值,则可以正常工作!
这是EL中布尔类型的一个已知问题,它们不被识别为布尔值而是被识别为Java“普通”对象?处理这个问题的正确方法是什么?
由于
答案 0 :(得分:19)
我见过的所有示例都讨论boolean
属性,除了isProperty()
和getProperty()
之外,还允许使用Boolean
格式的获取者。
我找不到这种行为的“正式”引用,但this blog post似乎描述了我最初评论时的疑问 - Boolean
是一个对象而boolean
是一个原语,当Java有自动装箱时,EL将忽略返回isProperty()
的{{1}} getter,而是查找Boolean
方法。
所以我怀疑,在您的示例中,如果您将getProperty()
的返回类型更改为isValid()
而不是boolean
(但将字段类型保留为Boolean
}),您的EL表达式将按预期工作。
答案 1 :(得分:4)
EL将布尔值视为对象(完全正确),因此它会查找getValid()
方法。这与JavaBeans规范一致。
尝试将您的属性从Boolean
引用类型更改为boolean
基元类型。如果这是不可能的并且您正在使用新的EL(即2.2 - 我不确定2.1),您可以调用方法,因此${case.isValid()}
将是正确使用此新EL功能的示例。
答案 2 :(得分:0)
JSP允许或禁止is / get-getter,布尔值/布尔值字段和布尔值/布尔值getter的某些组合。如下:
禁止组合:
Boolean method, getting by is
允许的组合:
Boolean method, getting by get
boolean method, getting by is
boolean method, getting by get
布尔/布尔类型的字段无关。
在IntelliJ中,足以自动生成吸气剂。
通过启动所有组合进行检查。
<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 bean:
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;
}