Как язык выражения 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)
не выбрасывает исключение, верните его
См. также:
Ответ 2
В принципе, вы заявили, что это все. EL ожидает, что объект будет следовать стандартным стандартам java bean. Эти 2 должны помочь:
Ответ 3
НЕ ОТВЕТ: попробуйте применить методы класса 2: String getA() и Boolean isA. а затем h: outputText value = "# {bean.a}"
Вы также можете играть С# {bean.a? 'true': 'false'}, чтобы определить, вызван ли метод в зависимости от контекста.
Я бы проверял себя, но я не могу правильно это понять.