В чем разница между # {expr} и ${expr} в jsf? Есть ли случаи, когда мы должны предпочесть ${expr}?

Я кое-что прочитал о разнице в "Core JSF", но теперь я не могу найти это место.

Тем не менее, я не помню, что было слово о случаях, когда мы должны использовать ${expr} в jsf. Так что мне просто интересно, в чем разница (в каштане), и если есть случай использовать ${expr} в приложении JSF?

Ответ 1

Подводя итог на понятном языке: ${expression} делает только get, а #{expression} может выполнять как get, так и . Это связано с тем, что ${expression} оценивается только один раз (немедленный), а #{expression} оценивается при каждом доступе (отложен).

В JSF на JSP 2.0 или Facelets 1.x, когда вы помещаете что-то вроде этого в качестве первого выражения страницы

${bean.property}

где bean - управляемый запрос с помощью bean, вы ничего не увидите. Но если bean - это управляемый сеансом bean, который уже был создан ранее, вы увидите напечатанное значение свойства. Это также относится к тому, что ранее созданный bean с расширенным запросом создавался #{bean.xxx} на той же странице.

Если вы вместо этого выполняете первое выражение страницы

#{bean.property}

тогда EL проверит, если bean равно null, и если да, то он будет установить (создать) новый. Если свойство задано во время построения bean, то вы увидите, что свойство отображается этим выражением.

Это все, что необходимо, чтобы получить среди прочих JSF UIInput компоненты, такие как <h:inputText> для работы. Когда вы отправляете форму, #{expression} будет установить значения в bean.

Ответ 2

Из учебник JavaEE:

Все выражения, использующие синтаксис ${}, оцениваются немедленно. Эти выражения могут использоваться только в тексте шаблона или в качестве значения атрибута тега JSP, который может принимать выражения во время выполнения. [...] Немедленные оценочные выражения всегда являются выражениями только для чтения. Выражение, показанное выше, может получить только общую стоимость от корзины bean; он не может установить общую цену.
Отсроченные оценочные выражения принимают форму # {expr} и могут быть оценены на других этапах жизненного цикла страницы, как определено любой технологией, использующей выражение. В случае технологии JavaServer Faces ее контроллер может оценивать выражение на разных этапах жизненного цикла в зависимости от того, как выражение используется на странице.