gpt4 book ai didi

java - View Scoped Bean preRenderView 方法被多次调用

转载 作者:行者123 更新时间:2023-12-02 08:44:35 26 4
gpt4 key购买 nike

我的 Mojarra 2.1.6 Web 应用程序有问题,我正在使用 @ViewScoped 开发它托管 bean,每个 bean 都附加到一个 xhtml 页面。此页面正在接收一些 View 参数,并以这种方式初始化 bean 后:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
<f:metadata>
<f:viewParam id="user" name="user"
value="#{navegableUserData._ParamUser}" />

<f:viewParam id="NavIndex" name="NavIndex"
value="#{navegableUserData._QueueIndex}" />
<f:event type="preRenderView"
listener="#{navegableUserData.initialize}" />
</f:metadata>
<h:message for="user" />
</ui:define>

<ui:define name="general_content">
<p:outputPanel autoUpdate="false" id="Datos_Loged" name="Datos_Loged"
layout="block">
<h:form id="SystemUserForm">
<ui:include
src="/system/manage_user/content/edit_user/system_user_data/system_user.xhtml">
<ui:param name="manager" value="#{navegableUserData}" />
</ui:include>
</h:form>
</p:outputPanel>
</ui:define>

如您所见,我将页面嵌套到一个通用模板中,如下所示:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">


<h:head>
<meta http-equiv="Pragma" CONTENT="no-cache"></meta>
<meta http-equiv="cache-control" content="no-cache"></meta>
<meta http-equiv="Expires" CONTENT="-1"></meta>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-15" />
<h:outputStylesheet library="css" name="prime_styles.css" />
<h:outputScript library="js" name="prime_translations.js" />
</h:head>

<h:body>
<ui:insert name="metadata" />
<o:importConstants
type="com.company.system.view.beans.NavigationResults" />

<!-- More stuff -->

当我发出 ajax 请求(例如 Primefaces 表过滤)时,就会出现问题。虽然我的支持 bean 没有再次创建, <f:event type="preRenderView" listener="#{navegableUserData.initialize}" /> 再次被调用。

我正在根据 View 参数加载数据,并且仅在第一次呈现页面时才需要执行该方法。我一直非常小心地使用 <c:xxx>标签并认为这不是问题,因为我仅在通用模板中使用它们,并且我的 View bean 属性未附加到它们。另外,我的所有页面都存在这个问题,所以我认为这不是特定支持 bean 的问题。

最佳答案

如果仅在 ajax 请求期间发生这种情况,请尝试以下操作:

public void initialize() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// -----------
// -----------
}
}

与 BalusC 建议相关:

关于java - View Scoped Bean preRenderView 方法被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14153895/

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