В чем разница между # {...} и ${...} в EL Syntax

Мой вопрос прост, как вы можете видеть.

В чем разница между #{...} и ${...} в синтаксисе EL?

Ответ 1

Проще говоря, ${} может выполнять только get, а #{} может выполнять get и a set.

В JSF на устаревшем JSP синтаксис #{} является обязательным для запуска автоматического создания управляемого beans и для установки параметров запроса в качестве значений модели. Если вы использовали ${bean.value} на странице JSF, управляемый bean с именем bean не будет автоматически создан, если он еще не включен в область. Кроме того, управляемое свойство bean value не будет установлено, если форма была отправлена ​​с этим значением во входном компоненте.

В JSF на Facelets ${} интерпретируется как #{}, и поэтому они будут вести себя точно так же.

См. также:

Ответ 2

Результатом ${...} является значение, а результат #{...} - привязка. Эта привязка может выполняться снова и снова.

EL различает два типа привязок; привязка значения и привязка метода. Связывание значений является просто удобством для привязки общего метода, поскольку он представляет собой как getter, так и setter через одно выражение.

В некотором смысле ${...} можно сравнить с передачей значения в метод с помощью выражения:

foo(bar.kaz());

Во время выполнения оценивается bar.kaz(), а foo получает только возвращаемое значение. Метод foo ничего не знает о bar.kaz() и не может выполнить оценку снова в более позднее время.

#{...} можно немного сравнить с передачей лямбда в метод или старым анонимным внутренним классом:

foo(new IntegerReturn() { public int execute() {
    bar.kaz();
});

Здесь foo получает IntegerReturn, который может вызвать столько, сколько захочет, в то время, когда он захочет.

Ответ 3

Прямо из источника

Рассмотрим эти два выражения значений:

${book.quantity}
#{book.quantity}

Первый использует непосредственный синтаксис оценки, тогда как второй использует синтаксис отсроченной оценки. Первое выражение обращается к свойству количества, получает его значение, а значение добавляется к ответу и отображается на странице. То же самое происходит со вторым выражением, если оно оценивается во время первоначального запроса. В этом случае оба выражения представляют собой выражения rvalue.