2010-07-15 12 views
7

Ich habe einen Kalender, Editor, FileUpload und eine DataTable-Oberflächendirektoren auf einem JSF-Facelet.@ViewScoped Managed Bean lädt viele Male während des Postbacks

-Code ist 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 SearchScriptActionBean lädt viele Zeit, wenn das Formular geladen wird und wenn eine Datei hochgeladen ist. Ich möchte alte Bohnenwerte beibehalten. Ex. scriptFiles (Liste), in die hochgeladene Dateien hinzugefügt werden. und filsList (dataTable) wird nicht aktualisiert.

Antwort

12

Sieht ähnlich aus wie issue 1492. Hier ist eine Angabe von Relevanz:

Dies ist ein Huhn/Ei Problem mit teilweiser Staatsersparnis. Die Ansicht wird ausgeführt, um die Ansicht aufzufüllen, bevor Deltastatus angewendet wird, so dass wir das Verhalten sehen, das Sie beschrieben haben.

An dieser Stelle sehe ich keinen klaren Weg, diesen Anwendungsfall zu lösen.

Die Problemumgehung, wenn Sie view-scoped Bindungen verwenden müssen, würde javax.faces.PARTIAL_STATE_SAVING auf false setzen.

Wahrscheinlich Primefaces verbindlich implizit die hochgeladene Datei mit dem Blick, und Sie müssen die folgenden auf die web.xml hinzuzufügen:

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

Probieren Sie es aus und sehen, ob das hilft. Wenn es funktioniert, sollten Sie in Betracht ziehen, nur für eine bestimmte Ansicht auszuschalten. Das globale Ausschalten des Speicherns von partiellen Zuständen wird nämlich die Speicher- und/oder Bandbreitennutzung, abhängig von der Zustandsspeichermethode, merklich erhöhen. Unter der Annahme, dass die Ansicht ID ist /upload.xhtml, verwenden Sie diese:

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

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

+0

Das funktionierte für mich! Vielen Dank ! – jruillier

+0

ich benutze nicht viewscoped in meiner app, aber verwiesen diese stackoverflow frage in primefaces forum URL, http://forum.primefaces.org/viewtopic.php?f=3&t=29524. Wow, eine BalusC Antwort? Wie immer spart BalusC den Tag !!! – Howard