【问题标题】:JSF 2.0 and JSTL use of c:set tag to store some temporary dataJSF 2.0 和 JSTL 使用 c:set 标签来存储一些临时数据
【发布时间】:2011-05-14 02:34:13
【问题描述】:

我正在使用 JSF 2.0 (mojarra) + primefaces 开发一个 Web 应用程序。过去我成功使用jstl库的[c:set]标签来存储一些临时数据或从其他标签输出。

在我目前的情况下,我想再次使用它,但它不能正常工作,我不知道为什么。在下面的例子中,它特别有效。为什么情况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>

【问题讨论】:

    标签: jstl jsf-2 primefaces


    【解决方案1】:

    为什么情况2不能正常工作?

     <!-- 2. VALUE IS "!!!" AND NOT "loginname !!!" -->
     <c:set var="deleteConfirmationMessage2">
       <h:outputText value="#{user.loginname}" />!!!
     </c:set>
    

    这是因为标签处理程序和 UI 组件不会同时运行。 JSTL 标记是标记处理程序,它们在构建视图期间运行(当 XHTML 文件转换为 JSF 组件树时)。 JSF &lt;h:xxx&gt; 标签是 UI 组件,它们在呈现视图期间运行(当 JSF 组件树被转换/呈现为 HTML 代码时)。另见JSTL in JSF2 Facelets... makes sense?

    所以,当&lt;c:set&gt; 运行时,&lt;h:outputText&gt; 根本没有运行。

    但是在这个特殊的结构中,你实际上根本不需要&lt;h:outputText&gt;。除了将其设置为&lt;c:set&gt;value 之外,您还可以在模板文本中内联原始EL 表达式(请注意,这在将JSF 与Facelets 一起使用时有效,而不是在将JSF 与JSP 一起使用时有效;鉴于您重新使用 PrimeFaces,您肯定在使用 Facelets,因为 PrimeFaces 根本没有 JSP 标签库)。

     <c:set var="deleteConfirmationMessage2">
       #{user.loginname}!!!
     </c:set>
    

    或者您可能不知道您可以在属性中混合 EL 和纯字符串,例如

     <c:set var="deleteConfirmationMessage2" value="#{user.loginname}!!!" />
    

    <p:confirmDialog  message="#{user.loginname}!!!">
    

    根据具体的功能要求(从问题中并不完全清楚),另一种选择可能是使用OmniFaces&lt;o:cache&gt; 组件。如果您打算将值缓存到比 &lt;c:set&gt; 示例中的页面/请求范围更广的范围内,这可能会更有用。

    【讨论】:

      【解决方案2】:
      xmlns:c="http://java.sun.com/jstl/core"
      

      只需将其添加为 jstl 的标记库

      【讨论】:

      【解决方案3】:

      只是做一个有根据的猜测,因为我没有尝试将 JSF 和 JSTL 结合起来,但我相信 c:set 会在渲染 h:outputText 之前处理,所以它只会在其正文中看到静态文本.我不确定在 JSF 生命周期中调用了哪些订单标签处理程序,但添加一些日志记录可以解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多