Мой вопрос прост, как вы можете видеть.
В чем разница между #{...}
и ${...}
в синтаксисе 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