gpt4 book ai didi

jSTL - JSF 2.0 和 JSTL 使用 c :set tag to store some temporary data

转载 作者:行者123 更新时间:2023-12-04 08:21:58 29 4
gpt4 key购买 nike

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

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

最佳答案

Why does the case 2 not work properly?

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

这是因为标记处理程序和 UI 组件不会同时运行。 JSTL 标记是标记处理程序,它们在构建 View 期间运行(当 XHTML 文件转换为 JSF 组件树时)。 JSF <h:xxx>标签是 UI 组件,它们在呈现 View 期间运行(当 JSF 组件树被转换/呈现为 HTML 代码时)。另见 JSTL in JSF2 Facelets... makes sense?
所以,当 <c:set>运行, <h:outputText>根本没有跑。
但是在这个特定的构造中,您实际上不需要 <h:outputText>根本。除了设置为 value<c:set> ,您也可以在模板文本中直接内联 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}!!!">
根据具体的功能要求(从问题中并不完全清楚),另一种选择可能是使用 <o:cache> OmniFaces 的组件.如果您打算为更广泛的范围缓存值,而不仅仅是像 <c:set> 那样的页面/请求范围,这可能更有用。例子。

关于jSTL - JSF 2.0 和 JSTL 使用 c :set tag to store some temporary data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4250205/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com