Доступ к свойствам объекта на языке выражений JSTL

Сегодня я следовал учебнику, который заставил меня почесать голову в течение часа. Рассмотреть возможность:

public class MyClass {
    public int getTotal() {
        amount = 100;
        return amount;
    }
}

и выдержка из JSP:

<p>Total: ${objectOfTypeMyClass.total}</p> //object instantiated elsewhere

Нигде в коде не была объявлена ​​или использована переменная экземпляра с именем total. Единственной ссылкой на слово «итого» во всем проекте (кроме JSP) был метод getTotal().

Итак, после некоторых отчаянных экспериментов в последнюю очередь оказалось, что язык выражений оценивает ${someObject.var} как "вызов метода getVar() объекта someObject< /сильный> объект.

Я работал с этим длинным учебным пособием более недели, думая, что ${someObject.var} говорит "напрямую получить сохраненную переменную экземпляра "var" из someObject< /сильный>.

Я все время ошибался, и правильно ли мое наблюдение, что для ссылки на любую переменную экземпляра с использованием EL вы должны предоставить соответствующий метод получения с именем getVarname(), где "Varname< /strong>» — это имя переменной экземпляра?

Кроме того, EL, кажется, нечувствителен к регистру в этом отношении. В моем примере выше, "total" в ${objectOfTypeMyClass.total} все в нижнем регистре, где метод getTotal() имеет заглавную "T".

И пока мы это делаем, почему бы нам не создать экземпляр переменной total? Я предполагаю, что EL на самом деле не ссылается на переменную экземпляра... просто на метод получения?

Что дает?


person ChrisM    schedule 22.09.2010    source источник
comment
Рассмотрите возможность регистрации вашей учетной записи. Теперь ваша другая учетная запись полностью отделена. Доступ к незарегистрированным учетным записям/повторное использование возможен только с использованием одного и того же ПК/веб-браузера, если файлы cookie не очищены.   -  person BalusC    schedule 22.09.2010


Ответы (3)


Я все время ошибался, и правильно ли мое наблюдение, что для ссылки на любую переменную экземпляра с использованием EL вы должны предоставить соответствующий метод получения с именем getVarname(), где Varname — это имя переменной экземпляра?

Это правильно. EL придерживается спецификации JavaBeans, как описано в EL спецификация.

Кроме того, EL, кажется, нечувствителен к регистру в этом отношении. В моем примере выше все в ${objectOfTypeMyClass.total} написано строчными буквами, а метод getTotal() имеет заглавную букву T.

Нет, это, конечно, не чувствительно к регистру. Это заданное поведение. ${bean.Total} не сработало бы.

И пока мы это делаем, почему бы нам не создать экземпляр переменной total? Я предполагаю, что EL на самом деле не ссылается на переменную экземпляра... просто на метод получения?

Это потому, что он должен соответствовать спецификации Javabean.

При всем при этом читайте обе спецификации и все будет понятно :)

Смотрите также:

person BalusC    schedule 22.09.2010

. в objectOfTypeMyClass.total — это точечный оператор JSTL EL. Он может делать несколько разных вещей. В том числе:

  1. map.key получил доступ к значению из map, хранящемуся в key. или
  2. object.property обращается к property из object, используя соглашения "JavaBeans".
person z5h    schedule 22.09.2010
comment
Я думаю, я как бы сделал ** из .... ну .... только меня ..., предположив, что использование оператора точки в EL такое же, как в Java (по крайней мере, при доступе к переменной объекта). Функционально, в конце концов, я думаю, что это так (т.е. даст вам желаемое свойство), но механически я вижу, что это не то же самое под капотом (получает его способом JavaBean). Спасибо за ответ z5h - person ChrisM; 23.09.2010

Это должно работать:

public class MyClass {

    private int total = 100;

    public int getTotal() {
        return total;
    }

    ...
}
person Randall Kwiatkowski    schedule 22.09.2010
comment
Вам, вероятно, также понадобится метод установки, чтобы общее количество не всегда было равно 100. - person Randall Kwiatkowski; 22.09.2010