View Scoped Bean preRenderView method being called multiple times

老子叫甜甜 提交于 2019-12-24 01:53:16

问题


I have a problem with my Mojarra 2.1.6 web-application, I'm developing it using @ViewScoped managed beans and each bean is attached to an xhtml page. This page is receiving some view params and after initializing the bean in that way:

<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>

As you can see, I have my pages nested into a general template which looks like that:

<?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 -->

Problem comes when I make an ajax request such as a Primefaces table filtering. Although my backing bean is not being created again, <f:event type="preRenderView" listener="#{navegableUserData.initialize}" /> is being called again.

I'm doing a data loading based into view params and need that method to execute only when the page is rendered first time. I have been very careful using <c:xxx> tags and think that's not the problem because I used them only in general template and my view beans properties are not attached to them. Also I have this problem with all my pages, so I think it is not an issue of an specific backing bean.


回答1:


If this occur only during ajax request, try the following:

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

Related as BalusC suggested:

  • What can f:metadata and f:viewParam be used for?



回答2:


Just for completeness, apart from the method @jonhy mentions, there's a cleaner choice if using JSF 2.2: Using f:viewAction instead of f:event.

<f:viewAction action="#{navegableUserData.initialize}" />

With that, it's not necessary to wrap your server code with if (!FacesContext.getCurrentInstance().isPostback()), since basically the method itself doesn't get called, because by default this actions are not executed on postbacks.

You alternatively can set them to be, which would be the same behavior as using the original f:event:

<f:viewAction action="#{navegableUserData.initialize}" onPostback="true" />

See also:

  • New JavaServer Faces 2.2 Feature: The viewAction Component


来源:https://stackoverflow.com/questions/14153895/view-scoped-bean-prerenderview-method-being-called-multiple-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!