一尘不染

GET和JSTL EL访问器转换优先级同时存在吗?

jsp

这是一个分为两个部分的问题。

我有一个带有char属性的人员对象,称为“活动”。Person有一个getActive()方法,该方法可以按预期返回char。在我的JSTL
EL中,我具有以下内容:

<c:if test="${person.active == '1'}">Active</c:if>

这永远不会过去。我的理解是,JSTL中带引号的文字是字符串(无论是单引号还是双引号),并且char类型是从getActive调用中保留的,因此当getActive()返回字符‘1’时,这两个值不相等。

作为替代,我添加了一个isActive()方法,该方法返回一个布尔值。在这种情况下,以下工作:

<c:if test="${person.active == true}">Active</c:if>

这是我的问题:

  1. 关于字符比较,我的理解正确吗?如果是这样,是否有任何方法可以转换JSTL中的类型,使其具有可比性?
  2. 当同时存在getActive()和isActive()时,EL转换会调用哪一个?似乎isActive()获得了优先权,但是对此有正式记录的命令吗?

阅读 170

收藏
2020-06-08

共1个答案

一尘不染

关于字符比较,我的理解正确吗? 如果是这样,是否有任何方法可以转换JSTL中的类型,使其具有可比性?

EL
2.2规范的
第1.8.2章(强调我的观点):

1.8.2 A {==,!=,eq,ne} B

  • 如果A==B,请申请运营商
  • 如果Anull或者Bnull回报false==eqtrue用于!=ne
  • 如果A或者BBigDecimal,无论是强迫ABBigDecimal,然后:
    • 如果operator是==eq,则返回A.equals(B)
    • 如果operator是!=ne,则返回!A.equals(B)
  • 如果A或者BFloatDouble要挟都ABDouble,应用运营商
  • 如果A或者BBigInteger,无论是强迫ABBigInteger,然后:
    • 如果operator是==eq,则返回A.equals(B)
    • 如果operator是!=ne,则返回!A.equals(B)
      * 如果A或者BByteShortCharacterInteger,或Long要挟都ABLong,应用运营商
  • 如果A或者BBoolean要挟两者ABBoolean,应用运营商
  • 如果A或者B是一个enum,胁迫都ABenum,应用运营商
  • 如果A或者BString要挟两者ABString,比较词汇
  • 否则,如果在调用时发生A.equals(B)错误,则报错
  • 否则,将运算符应用于 A.equals(B)

char/ Character是在EL从而强迫和评价Long。那决不能等于字符串文字'1'


当同时存在getActive()和isActive()时,EL转换会调用哪一个? 似乎isActive()获得了优先权,但是对此有正式记录的命令吗?

Javabeans规范的第8.3.2章(重点是我的):

8.3.2布尔属性

此外,对于布尔属性,我们允许使用getter方法来匹配模式:

public boolean is<PropertyName>();

可以提供此“ is < PropertyName >”方法来代替“ get < PropertyName >”方法,或者除了“ get <
PropertyName >”方法之外,还可以提供该方法。

在任一情况下,如果“是 < 属性名 >”的方法是存在用于一个布尔属性然后,我们将使用“是< 属性名 >”方法来读取的属性值。

布尔属性的示例可能是:

    public boolean isMarsupial();
    public void setMarsupial(boolean m);

结合前面引用的EL规范第1.8.2章中强调点之后的点,

  • 如果A或者BBoolean要挟两者ABBoolean,应用运营商

将赋予isXxx()方法优先级。

2020-06-08