JSF 2.0 и JSTL используют тег c: set для хранения некоторых временных данных - PullRequest
5 голосов
/ 23 ноября 2010

Я занимаюсь разработкой веб-приложения с JSF 2.0 (mojarra) + простыми лицами. В прошлом я успешно использовал тег [c: set] библиотеки jstl для хранения некоторых временных данных или вывода из других тегов.

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

<h:form id="userAdministration">
  <p:messages id="messages" showDetail="true" />
  <p:dataTable id="userTable" selectionMode="single" var="user" value="#{users}">
    <p:column>
      <f:facet name="header">
        <h:outputText value="#{message.user_table_header_id_column}" />
      </f:facet>
      <h:outputText value="#{user.id}" />
    </p:column>

    <p:column>
      <f:facet name="header">
        <h:outputText value="#{message.global_table_header_action_column}" />
      </f:facet>
      <p:commandButton type="push" onclick="#{user.loginname}DeleteConfirmation.show()" value="#{message.global_table_action_delete}" image="ui-icon-trash">
        <f:setPropertyActionListener value="#{user}" target="#{userAdministrationController.selectedUser}" />
      </p:commandButton>
      <!-- 1. WORKS FINE, STORED VALUE IS "loginname" -->
      <c:set var="deleteConfirmationMessage" value="#{user.loginname}"></c:set>
      <!-- 2. VALUE IS "!!!" AND NOT "loginname !!!" -->
      <c:set var="deleteConfirmationMessage2">
        <h:outputText value="#{user.loginname}" />!!!
      </c:set>
      <!-- 3. WORKS FINE (OUTPUT "loginname") -->
      <h:outputText value="#{user.loginname}" />
      <p:confirmDialog  message="#{deleteConfirmationMessage}" header="#{message.user_dialog_delete_confirmation_title}" severity="alert" widgetVar="#{user.loginname}DeleteConfirmation">
        <p:commandButton value="#{message.user_dialog_delete_confirmation_no}" onclick="#{user.loginname}DeleteConfirmation.hide()" update="@form" type="button" /> 
      </p:confirmDialog>
    </p:column>

Ответы [ 3 ]

7 голосов
/ 20 августа 2012

Почему вариант 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> примерах.

1 голос
/ 23 ноября 2010

Просто сделаю обоснованное предположение, потому что я не пытался объединить JSF и JSTL, но я верю, что c: set будет обработан до отображения h: outputText, поэтому он будет видеть только статический текст в своем теле , Я не уверен, какие обработчики тегов порядка вызываются в связи с жизненным циклом JSF, но внесение некоторой записи в журнал поможет это понять.

0 голосов
/ 23 ноября 2010
xmlns:c="http://java.sun.com/jstl/core"

просто добавьте это как taglib для jstl

...