2010-11-22 43 views
4

我正在开发一个JSF 2.0(mojarra)+ primefaces的web应用程序。在过去,我成功地使用jstl库的[c:set]标记来存储一些临时数据或从其他标记输出。JSF 2.0和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> 

回答

1

只是让一个受过教育的猜测,因为我还没有试过JSF和JSTL结合,但我相信C:集将在小时,然后进行处理:的outputText呈现,所以它只会看到其正文中的静态文本。我不确定哪些订单标记处理程序被称为与JSF生命周期有关,但是在某些日志记录中可以清除该事件。

-3
xmlns:c="http://java.sun.com/jstl/core" 

只是将其添加为标签库的JSTL

+0

谢谢,但我确实已经:(这是我的报头: 的 eglobetrotter 2010-11-23 13:02:18

6

为什么情况2无法正常工作?

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

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

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

但是,在这个特定的构造你实际上根本不需要<h:outputText>。除了将其设置为value,<c:set>之外,您还可以在模板文本中直接内联原始EL表达式(请注意,将JSF与Facelets一起使用时,不使用JSF时使用JSF;因为您使用PrimeFaces,您绝对使用Facelets作为PrimeFaces根本没有JSP taglib)。

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

或许你不知道,你可以像

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

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

根据具体功能要求,其中ISN在属性混合EL和滑动琴弦从问题中可以看出,不同的替代方案可能是使用OmniFaces<o:cache>组件。如果您打算缓存更大范围的值而不仅仅是页面/请求范围(如您的示例中所示),这可能会更有用。