简体   繁体   English

@ViewScoped托管bean在回发期间多次加载

[英]@ViewScoped Managed bean loads many times during postback

I have a calendar, editor, fileUpload and a dataTable primefaces controls on a jsf facelet. 我在jsf facelet上有一个日历,编辑器,fileUpload和一个dataTable primefaces控件。

Code is as follows, 代码如下,

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

    <ui:define name="title">#{lbl.SSTitle}</ui:define>

    <ui:define name="content">
        <h:form>
            <p:panel header="Upload Script">
                <h:outputText value="Welcome #{loginActionBean.login.emp.empName}"/>
                <br />
                <p:calendar value="#{searchScriptActionBean.scheduleDate}" />
                <br />
                <p:fileUpload fileUploadListener="#{searchScriptActionBean.handleFileUpload}"
                              multiple="true" update="filsList" allowTypes="*.txt;*.init" description="Script Files">
                </p:fileUpload>
                <br />
                <p:editor value="#{searchScriptActionBean.htmlText}" />
            </p:panel>
            <p:dataTable id="filsList" value="#{searchScriptActionBean.scriptFiles}" var="file">

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="File Name" />
                    </f:facet>
                    <h:outputText value="#{file.fileName}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Size" />
                    </f:facet>
                    <h:outputText value="#{file.size}" />
                </p:column>

                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Operation" />
                    </f:facet>
                    <h:commandLink value="Remove">
                        <p:collector value="#{file}" removeFrom="#{searchScriptActionBean.scriptFiles}" />
                    </h:commandLink>
                </p:column>

            </p:dataTable>
        </h:form>
    </ui:define>
</ui:composition>

and @ViewScoped Bean as follows, 和@ViewScoped Bean如下,

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ugam.crawler.web.script;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author devendra.mahajan
 */
@Named(value = "searchScriptActionBean")
@ViewScoped
public class SearchScriptActionBean implements Serializable{

    protected String htmlText;
    private Date scheduleDate;
    private List<UploadedFile> scriptFiles = new ArrayList<UploadedFile>();;
    /**
     * Get the value of scheduleDate
     *
     * @return the value of scheduleDate
     */
    public Date getScheduleDate() {
        return scheduleDate;
    }

    /**
     * Set the value of scheduleDate
     *
     * @param scheduleDate new value of scheduleDate
     */
    public void setScheduleDate(Date scheduleDate) {
        this.scheduleDate = scheduleDate;
    }

    /**
     * @return the scriptFiles
     */
    public List<UploadedFile> getScriptFiles() {
        return scriptFiles;
    }

    /**
     * @param scriptFiles the scriptFiles to set
     */
    public void setScriptFiles(List<UploadedFile> scriptFiles) {
        this.scriptFiles = scriptFiles;
    }

    /** Creates a new instance of SearchScriptActionBean */
    public SearchScriptActionBean() {
        System.out.println("In SearchScriptActionBean Constructor");

    }

    public void handleFileUpload(FileUploadEvent event) {
        //add facesmessage to display with growl
        //application code
        UploadedFile file = event.getFile();
        scriptFiles.add(file);


    }


    /**
     * Get the value of htmlText
     *
     * @return the value of htmlText
     */
    public String getHtmlText() {
        return htmlText;
    }

    /**
     * Set the value of htmlText
     *
     * @param htmlText new value of htmlText
     */
    public void setHtmlText(String htmlText) {
        this.htmlText = htmlText;
    }
}

My Problem is SearchScriptActionBean loads many time when the form loads and when a file is uploaded. 我的问题是SearchScriptActionBean在表单加载和上传文件时加载很多次。 I want to retain old values of bean. 我想保留bean的旧值。 ex. 恩。 scriptFiles(List), where uploaded files are added. scriptFiles(List),添加上传的文件。 and filsList (dataTable) is not getting updated. 和filsList(dataTable)没有得到更新。

Look much like issue 1492 . 看起来很像问题1492 Here's a cite of relevance: 这是一个相关的引用:

This is a chicken/egg issue with partial state saving. 这是鸡/蛋问题,部分省钱。 The view is executed to populate the view before delta state is applied, so we see the behavior you've described. 执行视图以在应用增量状态之前填充视图,因此我们会看到您描述的行为。

At this point, I don't see a clear way to resolve this use case. 此时,我没有看到解决此用例的明确方法。

The workaround, if you must use view-scoped bindings would be setting javax.faces.PARTIAL_STATE_SAVING to false. 解决方法是,如果必须使用视图范围的绑定,则将javax.faces.PARTIAL_STATE_SAVING设置为false。

Probably Primefaces is implicitly binding the uploaded file with the view and you need to add the following to the web.xml : 可能Primefaces隐式地将上传的文件与视图绑定,您需要将以下内容添加到web.xml

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

Give it a try and see if that helps. 试一试,看看是否有帮助。 If it works, you may want to consider to turn if off for a specific view only. 如果有效,您可能需要考虑仅为特定视图关闭。 Globally turning off partial state saving will namely noticeably increase memory and/or bandwidth usage, depending on state saving method. 全局关闭部分状态保存将显着增加内存和/或带宽使用,这取决于状态保存方法。 Assuming that the view ID is /upload.xhtml , use this: 假设视图ID是/upload.xhtml ,请使用:

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/upload.xhtml</param-value>
</context-param>

You can specify multiple view IDs by a semicolon. 您可以用分号指定多个视图ID。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM