Приоритет трансляции JSTL EL, когда получить, и оба ли существуют? - PullRequest
1 голос
/ 27 февраля 2012

Это как бы вопрос из двух частей.

У меня есть объект person с атрибутом char, который называется "active".У человека есть метод getActive (), который возвращает символ, как и ожидалось.В моем 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 () получает приоритет, но есть ли официально документированный порядок этого?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Правильно ли мое понимание относительно сравнения символов?Если да, есть ли способ преобразовать типы в JSTL, чтобы они были сопоставимы?

Из главы 1.8.2 EL 2.2 спецификация (выделено мной):

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

  • Если A==B, примените оператор
  • Если A равен null или Bравно null возврат false для == или eq, true для != или ne.
  • Если A или B равно BigDecimal, приведите обаA и B до BigDecimal, а затем:
    • Если оператор == или eq, вернуть A.equals(B)
    • Если оператор != или ne, возврат !A.equals(B)
  • Если A или B равняется Float или Double, приведите оба A и B к Double, примените оператор
  • Если A или B равно BigInteger, принудительно введите A и B до BigInteger, а затем:
    • Если оператор == или eq, вернуть A.equals(B)
    • Если оператор != или ne, вернуть !A.equals(B)
  • Если A или BByte, Short, Character, Integer или Long принудительно A и B до Long, примените оператор
  • Если A или B равен Boolean, принудительно оба A иB до Boolean, примените оператор
  • Если A или B является enum, принудительно введите A и B в enum, примените оператор
  • Если A или B равен String принудительно A и B к String, сравнить лексически
  • В противном случае, если при вызове A.equals(B) возникает ошибка, ошибка
  • В противном случае, применить оператор к результату A.equals(B)

char / Character находится в EL, таким образом, приведено и оценено как Long.Это никогда не может быть равно строковому литералу '1'.


Когда существуют оба метода getActive () и isActive (), какой из них вызывается переводом EL?Кажется, isActive () получает приоритет, но есть ли официально задокументированный порядок этого?

Из главы 8.3.2 Javabeans спецификация (выделено мной):

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

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

public boolean is<PropertyName>();

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

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

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

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

Это, в сочетании суказывать сразу после выделенного пункта в ранее цитированной главе 1.8.2 спецификации EL,

  • Если A или B равняется Boolean, принудительно A и B к Boolean, применить оператор

даст приоритет isXxx() метода.

0 голосов
/ 27 февраля 2012

Что вы можете сделать, это проверить значение персонажа, что-то вроде

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

Что касается того, какой из них получает приоритет - это XXX () или getXXX (), это в значительной степени зависит от реализации.

...