5

我正在使用 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>

4

3 回答 3

7

为什么案例 2 不能正常工作?

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

这是因为标记处理程序和 UI 组件不会同时运行。JSTL 标记是标记处理程序,它们在构建视图期间运行(当 XHTML 文件转换为 JSF 组件树时)。JSF<h:xxx>标记是 UI 组件,它们在呈现视图期间运行(当 JSF 组件树被转换/呈现为 HTML 代码时)。另请参阅JSF2 Facelets 中的 JSTL... 有意义吗?

因此,当<c:set>运行时,<h:outputText>根本没有运行。

但是在这个特定的构造中,您实际上根本不需要<h:outputText>。除了将其设置为 之外value<c:set>您还可以在模板文本中内联 EL 表达式 raw (请注意,这在将 JSF 与 Facelets 一起使用时有效,而不是在将 JSF 与 JSP 一起使用时有效;鉴于您使用的是 PrimeFaces,您re 肯定使用 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<o:cache>的组件。如果您打算将值缓存到比示例中的页面/请求范围更广的范围内,这可能会更有用。<c:set>

于 2012-08-20T13:30:40.500 回答
1

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

于 2010-11-22T21:17:26.650 回答
-3
xmlns:c="http://java.sun.com/jstl/core"

只需将其添加为 jstl 的 taglib

于 2010-11-23T09:18:04.427 回答