немедленная и отложенная оценка для чтения свойств bean-компонента

Мне все еще неясно, как использовать JSF immediate evaluation против deferred evaluation, главным образом потому, что в онлайн-примерах почти никогда не используется первый метод.

Я видел немало примеров JSF, в том числе содержащиеся в http://docs.oracle.com/javaee/6/tutorial/doc/, и меня немного озадачивает тот факт, что я почти всегда вижу примеры только с #{} вместо ${}, даже когда все, что мы делаем, это читаем бобовое свойство.

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

Если все всегда используют #{} для чтения свойств bean-компонента, когда вы порекомендуете использовать ${}?

Итак, резюмируя:

  • Почему все предпочитают #{} ${} при чтении свойств компонента?
  • Когда бы вы рекомендовали использовать ${} вместо #{}?
  • Можете ли вы привести пример, когда использование ${} будет иметь другой результат, чем использование #{} (и можете ли вы объяснить, почему результат отличается)?

person Student    schedule 20.03.2013    source источник
comment
Извините, неправильно задан вопрос. Я думаю, что это связано: Разница между JSP EL, JSF EL и Unified EL   -  person Luiggi Mendoza    schedule 20.03.2013


Ответы (1)


В Facelets ${} обрабатывается как #{}, поэтому технически нет никакой разницы, и он всегда откладывается.

В JSP 2.0 и более ранних версиях ${} не будет автоматически создавать управляемый компонент, если он еще не находится в области действия. Таким образом, вы можете использовать его только в том случае, если вы можете гарантировать, что #{} в том же управляемом компоненте использовался где-то раньше в дереве компонентов, а также принять просмотр времени сборки и просмотр времени рендеринга с учетом жизненного цикла. Во всех версиях JSP ${} не может устанавливать представленные значения входных компонентов JSF в модели. В общем, их смешивание может сбить с толку новичков, а в долгосрочной перспективе даже вас самих, и поэтому не рекомендуется.

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

person BalusC    schedule 20.03.2013
comment
Спасибо за ваш быстрый ответ. Однако я не понимаю, что вы подразумеваете под автоматическим созданием управляемого компонента, а также могу ли я гарантировать, что #{} ... уже использовался где-то раньше в дереве компонентов.... Я провел небольшой тест : я создал новый проект, одну страницу index.xhtml и один управляемый компонент Bean.java JSF с одним геттером/свойством. Я сослался на свойство с помощью ${bean.name}. Я развернул и все заработало по первому запросу. Я не уверен, где этот управляемый компонент мог использоваться раньше в дереве компонентов, но мой код работал без ошибок. Можете ли вы объяснить, что вы имели в виду? - person Student; 20.03.2013
comment
p.s. Я заметил, что вы удалили JSF EL в заголовке моего вопроса. Когда я ищу существующие вопросы на SO, без этого префикса сложнее понять, о чем этот вопрос. Теги труднее заметить при просмотре списка из нескольких вопросов. Это запрос в формате SO? Если нет, я не уверен, почему вы предпочитаете удалить его. - person Student; 20.03.2013
comment
Я улучшил ответ. Что касается заголовков, то они уже представлены тегами. Вы можете добавить, например. [jsf][el] для поиска по ключевым словам для фильтрации по тегам. Вам не нужно повторять теги в заголовке, как на старомодных дискуссионных форумах, где тегов не существует. - person BalusC; 20.03.2013
comment
в порядке. однако мне все еще не ясно, почему docs.oracle.com/javaee /6/tutorial/doc/bnahr.html доходит до таких подробностей, чтобы объяснить, что для #{} в случае технологии JavaServer Faces ее контроллер может оценивать выражение на разных этапах жизненного цикла, в зависимости о том, как выражение используется на странице., тогда как для ${} они объясняют, что реализация JavaServer Faces оценивает выражение ${sessionScope.cart.total}, преобразует его и передает возвращенный значение обработчику тега. - person Student; 20.03.2013
comment
<fmt:xxx> — это обработчик тегов, а не компонент пользовательского интерфейса. Обработчики тегов запускаются во время сборки представления и, таким образом, по умолчанию оценивают EL уже во время сборки представления. Я признаю, что это объяснение/пример в руководстве по Java EE вводит в заблуждение, поскольку оно не связано с немедленной/отложенной оценкой. Точно такой же эффект произойдет при использовании #{} вместо этого конкретного примера. Также обратите внимание, что <fmt:xxx> taglib сама по себе не поддерживается в Facelets, но только в JSP. - person BalusC; 20.03.2013
comment
Похоже, тогда мне лучше придерживаться #{} :-). В очередной раз благодарим за помощь! - person Student; 21.03.2013