7 Stimmen

@ViewScoped Managed Bean lädt viele Male beim Postback

Ich habe einen Kalender, Editor, fileUpload und eine dataTable primefaces Kontrollen auf einem jsf facelet.

Der Code lautet wie folgt,

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

und @ViewScoped Bean wie folgt,

/*
 * 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;
    }
}

Mein Problem ist SearchScriptActionBean lädt viele Zeit, wenn das Formular lädt und wenn eine Datei hochgeladen wird. Ich möchte alte Werte der Bean beibehalten. z.B. scriptFiles(List), wo hochgeladene Dateien hinzugefügt werden. und filsList (dataTable) wird nicht aktualisiert.

12voto

BalusC Punkte 1034465

Sieht aus wie Ausgabe 1492 . Hier ist ein Zitat von Bedeutung:

Dies ist ein Henne-Ei-Problem bei der Speicherung von Teilzuständen. Die Ansicht wird ausgeführt, um die Ansicht aufzufüllen antes de Delta-Status angewandt wird, so dass wir das von Ihnen beschriebene Verhalten sehen beschrieben haben.

Zum jetzigen Zeitpunkt sehe ich keine klare Möglichkeit, diesen Anwendungsfall zu lösen.

Die Umgehung, wenn Sie view-scoped Bindings verwenden müssen, wäre die Einstellung javax.faces.PARTIAL_STATE_SAVING auf falsch.

Wahrscheinlich bindet Primefaces die hochgeladene Datei implizit mit der Ansicht und Sie müssen folgendes zur Ansicht hinzufügen web.xml :

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

Probieren Sie es aus und sehen Sie, ob das hilft. Wenn es funktioniert, sollten Sie in Erwägung ziehen, die Funktion nur für eine bestimmte Ansicht zu deaktivieren. Ein globales Ausschalten der teilweisen Zustandsspeicherung wird nämlich die Speicher- und/oder Bandbreitennutzung merklich erhöhen, je nach Methode der Zustandsspeicherung. Angenommen, die ID der Ansicht ist /upload.xhtml verwenden Sie dies:

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

Sie können mehrere View-IDs durch ein Semikolon angeben.

0 Stimmen

Ich bin nicht mit viewscoped in meiner app, aber verwies auf diese Stackoverflow Frage in primefaces Forum URL, forum.primefaces.org/viewtopic.php?f=3&t=29524 . wow, eine BalusC-Antwort? Wie immer rettet BalusC den Tag!!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X