2013-01-10 20 views
4

我已將<p:fileUpload />組件插入到我的JSF 2.1.5應用程序中。我正在使用PrimeFaces 3.4.1。該組件由一個@ViewScoped bean支持。我有我這樣的形式:當使用PrettyFaces調用FileUploadListener時重建的ViewScoped bean

<?xml version='1.0' encoding='UTF-8' ?> 
<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="NavIndex" name="NavIndex" 
      value="#{navegableMassiveUserAdd._QueueIndex}" /> 
     <f:event type="preRenderView" 
      listener="#{navegableMassiveUserAdd.initialize}" /> 
    </f:metadata> 
</ui:define> 

<ui:define name="general_content"> 
    <h:form> 

     <p:fileUpload 
      fileUploadListener="#{navegableMassiveUserAdd.listener}" 
      mode="advanced" allowTypes="/(\.|\/)(xls|csv)$/" 
      label="#{msg.SELECT}" multiple="false" /> 

     <p:commandButton id="cancelButton" 
      action="#{navegableMassiveUserAdd.actionCancelAdd}" 
      value="#{msg.CANCELAR}" ajax="false" style="margin: 9px 0px 5px;" /> 
    </h:form> 
</ui:define> 

這是我的主模板:

<?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" /> 
    <ui:insert name="general_logged_user"> 
     <div align="right"> 
      <span style="color: #B22222; padding: 3px;"> <h:outputText 
        value="#{loggedBean._Login}" /> 
      </span> <span style="color: #FFA54F; padding: 3px;"> <h:outputText 
        value="Auth Method: #{loggedBean._Usuario._CUser._AuthenticationMethod}" /> 
      </span> 
     </div> 
    </ui:insert> 
    <f:view locale="#{localeBean.locale}"> 
     <ui:insert name="general_settings"> 
      <f:loadBundle basename="resources.system.bundles.Messages" var="msg" /> 
      <p:ajaxStatus style="width:0px;height:0px;" id="ajaxStatusPanel" 
       styleClass="spinner_ajax_loading"> 

       <f:facet name="start"> 
        <h:graphicImage value="/resources/images/loading.gif" /> 
       </f:facet> 

       <f:facet name="complete"> 
        <h:outputText value="" /> 
       </f:facet> 
      </p:ajaxStatus> 
      <p:growl id="messages" autoUpdate="true" /> 
     </ui:insert> 

     <f:event type="preRenderView" 
      listener="#{navigationManagerSystem.initialize}" /> 


     <h:panelGroup> 
      <ui:insert name="general_header"> 
       <ui:include src="/components/header.xhtml" /> 
      </ui:insert> 
      <h:panelGroup id="menuNavegacionPanel"> 

       <h:form> 
        <h:panelGroup id="navigationPanel" 
         rendered="#{navigationManagerSystem._ShowNavegacion}"> 
         <h:panelGroup 
          rendered="#{!navigationManager._DisableNavigationButtons}"> 
          <p:toolbar> 
           <p:toolbarGroup> 
            <ui:repeat value="#{navigationManagerSystem._Navegables}" 
             var="item"> 
             <p:button value="#{item._Title}" 
              outcome="#{item._NavigationResult}"> 
              <f:param name="NavIndex" value="#{item._QueueIndex}" /> 
             </p:button> 
            </ui:repeat> 
            <p:button disabled="true" 
             value="#{navigationManagerSystem._Navegable._Title}" /> 
           </p:toolbarGroup> 
          </p:toolbar> 
         </h:panelGroup> 

        </h:panelGroup> 
       </h:form> 
      </h:panelGroup> 
      <ui:insert name="general_content"> 
       <ui:include src="/system/content.xhtml" /> 
      </ui:insert> 

     </h:panelGroup> 
     <ui:insert name="general_footer"> 

      <ui:include src="/components/general_footer.xhtml" /> 

     </ui:insert> 
    </f:view> 

</h:body> 

就這樣,當我上傳我的文件,豆是被重建和listener方法不被調用。我已將過濾器放入我的web.xml。另外,如果我更改表單並將其設置爲enctype="multipart/form-data",正如我在文檔中所閱讀的那樣,我無法避免該問題,並且再次重建bean,在這種情況下,即使單擊取消按鈕時也是如此。這是我的豆代碼,其中SystemNavegable是一個抽象類:

@SuppressWarnings("serial") 
@ManagedBean 
@ViewScoped 
public class NavegableMassiveUserAdd extends SystemNavegable { 

/** 
* Field logger. 
*/ 
protected final Log logger = LogFactory.getLog(this.getClass()); 

/** 
* Constructor for NavegableMassiveUserAdd. 
*/ 
public NavegableMassiveUserAdd() { 
    super(); 
    this.set_Title(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU, 
      BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS, "Añadir usuarios")); 
    this.set_TitleDescription(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU, 
      BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS_DESCRIPTION, "Añadir usuarios")); 
    this.set_NavigationResult(NavigationResults.MASSIVE_USER_ADD); 
    this._Behaviour = NavegableBehaviour.ADD; 
} 
/** 
* Method actionCancelAdd. 
* 
* @return 
*/ 
public String actionCancelAdd() { 
    return this._NavigationManagerSystem.cancelNavegable(); 
} 

/** 
* Escuchador del evento Upload. 
* 
* 
* 
* @param event 
*   FileUploadEvent 
* @throws IOException 
* @throws java.io.IOException 
*/ 
public void listener(FileUploadEvent event) throws IOException { 
    UploadedFile uploadItem = event.getFile(); 
    //More code 
    } 

什麼建議嗎?提前致謝。

編輯

更多的測試做,我發現文件上傳監聽方法永遠達不到,沒關係我給予支持bean其適用範圍。我有以下的依賴關係包括:

<dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
    </dependency> 

我猜想問題可能有另一個過濾器與一個我的上傳組件,as is told here衝突。無論問題是什麼,當文件上傳時,我的bean的初始化方法會再次被調用,並且FacesContext.getCurrentInstance().isPostback()帶有false。

+0

我看到你使用一些模板(general_template.xhtml)。你可以把它的代碼? – partlov

+0

你有。 –

+0

你爲什麼說enctype是錯的?無論發生什麼都不會產生ajax調用。 –

回答

3

經過多次頭腦風暴,我發現這是一個過濾器問題。由於上傳的過濾器與PrettyFaces過濾器發生衝突,我只好把它添加到我的的web.xml

<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

非常感謝@Reinaldo德卡瓦略,這種響應

https://stackoverflow.com/a/9086137/1199132

相關問題