Мой вопрос прост, как вы можете видеть.
В чем разница между #{...} и ${...} в синтаксисе EL?
Мой вопрос прост, как вы можете видеть.
В чем разница между #{...} и ${...} в синтаксисе EL?
Проще говоря, ${} может выполнять только get, а #{} может выполнять get и a set.
В JSF на устаревшем JSP синтаксис #{} является обязательным для запуска автоматического создания управляемого beans и для установки параметров запроса в качестве значений модели. Если вы использовали ${bean.value} на странице JSF, управляемый bean с именем bean не будет автоматически создан, если он еще не включен в область. Кроме того, управляемое свойство bean value не будет установлено, если форма была отправлена с этим значением во входном компоненте.
В JSF на Facelets ${} интерпретируется как #{}, и поэтому они будут вести себя точно так же.
Результатом ${...} является значение, а результат #{...} - привязка. Эта привязка может выполняться снова и снова.
EL различает два типа привязок; привязка значения и привязка метода. Связывание значений является просто удобством для привязки общего метода, поскольку он представляет собой как getter, так и setter через одно выражение.
В некотором смысле ${...} можно сравнить с передачей значения в метод с помощью выражения:
foo(bar.kaz());
Во время выполнения оценивается bar.kaz(), а foo получает только возвращаемое значение. Метод foo ничего не знает о bar.kaz() и не может выполнить оценку снова в более позднее время.
#{...} можно немного сравнить с передачей лямбда в метод или старым анонимным внутренним классом:
foo(new IntegerReturn() { public int execute() {
bar.kaz();
});
Здесь foo получает IntegerReturn, который может вызвать столько, сколько захочет, в то время, когда он захочет.
Прямо из источника
Рассмотрим эти два выражения значений:
${book.quantity} #{book.quantity}Первый использует непосредственный синтаксис оценки, тогда как второй использует синтаксис отсроченной оценки. Первое выражение обращается к свойству количества, получает его значение, а значение добавляется к ответу и отображается на странице. То же самое происходит со вторым выражением, если оно оценивается во время первоначального запроса. В этом случае оба выражения представляют собой выражения rvalue.
Ознакомьтесь с этими двумя замечательными статьями от Sun:
Уровень веб-сайта для перехода на Java EE 5: Резюме Новые возможности в технологии JSP 2.1