Как язык выражения Java решает логические атрибуты? (в JSF 1.2)

Итак, мы все знаем, что #{someBean.value} попытается получить содержимое некоторого свойства на someBean, называемом value. Он будет искать getValue(). Однако, что, если это свойство boolean? Он будет искать isValue(). Он не будет искать hasValue().

Это заставило меня задуматься, что именно он делает?

Раздел руководства по Java EE 5 - Язык унифицированных выражений относится к PageContext.FindAttribute(). PageContext отправляет вас на JSPContext. Ни один из них не объясняет правила, которые они выполняют, чтобы определить имя метода, который они ищут.

Также довольно легко найти документацию, в которой говорится, что имена методов должны начинаться с get. Однако я знаю, что isValue() работает.

Может ли кто-нибудь указать мне на документацию, где это записано. Я не ищу учебники или примеры, которые я ищу для справки.

Ответ 1

Он авторитетно документирован как в JavaBeans Spec, так и EL Спецификация.

Чтобы взять свойство boolean в качестве примера, он описан в главе 8.3.2 спецификации JavaBeans:

8.3.2 Булевы свойства

Кроме того, для булевых свойств мы позволяем методу геттера соответствовать шаблону:

public boolean is<PropertyName>();

Этот метод "is <PropertyName> " может быть предоставлен вместо метода "get <PropertyName> ", или он может быть предоставлен в дополнение к методу "get <PropertyName> ".

В любом случае, если метод "is <PropertyName> " присутствует для логического свойства, тогда мы будем используйте метод "is <PropertyName> " , чтобы прочитать значение свойства.

Пример логического свойства может быть:

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

Итак, #{bean.marsupial} ожидает точно указанную выше пару getter/setter.

И в главе 1.18.5 спецификации EL:

1.18.5 Принуждение A к булевому

  • Если A - null или "", верните false
  • В противном случае, если A является boolean, верните A
  • В противном случае, если A является String, а Boolean.valueOf(A) не выбрасывает исключение, верните его

См. также:

Ответ 3

НЕ ОТВЕТ: попробуйте применить методы класса 2: String getA() и Boolean isA. а затем h: outputText value = "# {bean.a}"
Вы также можете играть С# {bean.a? 'true': 'false'}, чтобы определить, вызван ли метод в зависимости от контекста.
Я бы проверял себя, но я не могу правильно это понять.