2010-07-15 10 views
7

Ho un calendario, un editor, un fileUpload e un DataTable primari controlli su un facs jsf.@ViewScoped Il bean gestito viene caricato molte volte durante il postback

codice è il seguente,

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

e @ViewScoped Bean come segue,

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

Il mio problema è carichi SearchScriptActionBean molti momento in cui il modulo viene caricato e quando un file viene caricato. Voglio conservare i vecchi valori del fagiolo. ex. scriptFile (Elenco), dove vengono aggiunti i file caricati. e filsList (dataTable) non viene aggiornato.

risposta

12

Sembra molto simile a issue 1492. Ecco una citazione di pertinenza:

Questo è un problema di pollo/uova con parziale risparmio di stato. La vista viene eseguita su popola la vista prima dello si applica lo stato delta, quindi viene visualizzato il comportamento che è stato descritto in .

A questo punto, non vedo un modo chiaro per risolvere questo caso d'uso.

Per ovviare al problema, se è necessario utilizzare i binding view-scope, impostare javax.faces.PARTIAL_STATE_SAVING su falso.

Probabilmente primefaces è implicitamente vincolante il file caricato con la vista ed è necessario aggiungere il seguente alla web.xml:

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

fare un tentativo e vedere se questo aiuta. Se funziona, potresti prendere in considerazione l'opzione di disattivarlo solo per una vista specifica. Disattivare globalmente il salvataggio parziale dello stato aumenterà sensibilmente l'utilizzo di memoria e/o larghezza di banda, a seconda del metodo di salvataggio dello stato. Supponendo che l'ID vista è /upload.xhtml, utilizzare questo:

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

È possibile specificare più ID vista da un punto e virgola.

+0

Questo ha funzionato per me! Grazie ! – jruillier

+0

non sto usando viewcoped nella mia app, ma ho fatto riferimento a questa domanda di stackoverflow nell'URL del forum Primefaces, http://forum.primefaces.org/viewtopic.php?f=3&t=29524. wow, una risposta BalusC? Come sempre, BalusC salva la giornata !!! – Howard