Почему вариант 2 не работает должным образом?
<!-- 2. VALUE IS "!!!" AND NOT "loginname !!!" -->
<c:set var="deleteConfirmationMessage2">
<h:outputText value="#{user.loginname}" />!!!
</c:set>
Это потому, что обработчики тегов и компоненты пользовательского интерфейса не работают одновременно.Теги JSTL являются обработчиками тегов и выполняются во время построения представления (когда файл XHTML преобразуется в дерево компонентов JSF).Теги JSF <h:xxx>
являются компонентами пользовательского интерфейса и выполняются во время рендеринга представления (когда дерево компонентов JSF преобразуется / отображается в код HTML).См. Также JSTL в JSF2 Facelets ... имеет смысл?
Итак, когда <c:set>
запускается, <h:outputText>
вообще не запускается.
Но в этой конкретной конструкции вам вообще не нужен <h:outputText>
.Помимо установки значения value
из <c:set>
, вы также можете просто вставить необработанное выражение EL в текст шаблона (обратите внимание, что это работает при использовании JSF с Facelets, а не при использовании JSF с JSP; учитывая тот факт, что вы 'При использовании PrimeFaces вы определенно используете Facelets, так как PrimeFaces вообще не имеет JSP taglib).
<c:set var="deleteConfirmationMessage2">
#{user.loginname}!!!
</c:set>
или, возможно, вы не знали, что вы можете смешивать строки EL и обычные строки в атрибутекак
<c:set var="deleteConfirmationMessage2" value="#{user.loginname}!!!" />
или
<p:confirmDialog message="#{user.loginname}!!!">
В зависимости от конкретного функционального требования, которое не совсем ясно из вопроса, другой альтернативой может быть использование <o:cache>
компонент OmniFaces .Это может быть более полезно, если вы собираетесь кэшировать значение для более широкой области, чем просто область страницы / запроса, как в <c:set>
примерах.