Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax p:fileUpload为每个文件调用bean构造函数_Ajax_Jsf_File Upload_Primefaces_View Scope - Fatal编程技术网

Ajax p:fileUpload为每个文件调用bean构造函数

Ajax p:fileUpload为每个文件调用bean构造函数,ajax,jsf,file-upload,primefaces,view-scope,Ajax,Jsf,File Upload,Primefaces,View Scope,我正在尝试使用上载文件。以下是观点: <h:form enctype="multipart/form-data"> <p:growl id="messages" showDetail="true" /> <p:fileUpload fileUploadListener="#{viewscopedBean.handleFileUpload}" mode="advanced" dra

我正在尝试使用
上载文件。以下是观点:

  <h:form enctype="multipart/form-data">
     <p:growl id="messages" showDetail="true" />
     <p:fileUpload
                fileUploadListener="#{viewscopedBean.handleFileUpload}"
                mode="advanced" dragDropSupport="true" multiple="true"
                update="messages" />
  </h:form>
当我点击
上传按钮时,progressbar的填充率高达100%(就像它做了什么),但随后页面被重新加载(为每个上传的文件调用构造函数)
handleFileUpload方法从未被调用

没有任何错误或警告,它只是没有做它应该做的。我有JSF2.0和PrimeFaces4,可能有问题吗


这是如何导致的,我如何解决它?

首先,确保类路径上有
commons fileupload
及其编译时依赖项
commons io
。未调用的处理程序表明缺少这些依赖项

4.0
以来,现在有了一个可选的上下文参数,用于指定用于处理文件上载的服务器端引擎:

<context-param>
<param-name>primefaces.UPLOADER</param-name>
<param-value>auto|native|commons</param-value>
</context-param>
下面是支持bean:

package uk;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

    @ManagedBean(name = "tempBean")
    @ViewScoped
    public class TempBean {

        private List<UploadedFile> uploadedFiles; //to remember which files have been uploaded

        public TempBean() {
                super();
                System.out.println("@constructor");
                uploadedFiles = new ArrayList<UploadedFile>();
        }

        public void handleFileUpload(FileUploadEvent event) { 
               System.out.println("! HANDLE FILE UPLOAD !");
               // do something
        }  
        public List<UploadedFile> getUploadedFiles() {
                return uploadedFiles;
        }

        public void setUploadedFiles(List<UploadedFile> uploadedFiles) {
                this.uploadedFiles = uploadedFiles;
        }

    }
package英国;
导入java.util.ArrayList;
导入java.util.List;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入org.primefaces.event.FileUploadEvent;
导入org.primefaces.model.UploadedFile;
@ManagedBean(name=“tempBean”)
@视域
公共类TempBean{
private List uploadedFiles;//记住哪些文件已上载
公共TempBean(){
超级();
System.out.println(“@constructor”);
uploadedFiles=新建ArrayList();
}
公共无效handleFileUpload(FileUploadEvent事件){
System.out.println(“!HANDLE FILE UPLOAD!”);
//做点什么
}  
公共列表getUploadedFiles(){
返回上传的文件;
}
public void setUploadedFiles(列出上载的文件){
this.uploadedFiles=uploadedFiles;
}
}
页面如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<h:body>

    <h:form enctype="multipart/form-data">
     <p:growl id="messages" showDetail="true" />
     <p:fileUpload
                fileUploadListener="#{tempBean.handleFileUpload}"
                mode="advanced" dragDropSupport="true" multiple="true"
                update="messages" />
  </h:form>
</h:body>
</html>

最后,这里是我的POM片段,其中包含Apache Commons的依赖项和版本:

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3</version>
    </dependency>

公地io
公地io
2.2
文件上传
文件上传
1.3

当你上传文件时,你的表格上必须有这样的内容
试试这样,不管你是否会有luckHi,是的,我已经试过了。我会更新我的代码,而你的bean是
viewscopedBean
,你能展示
整个bean的Decelleration
吗?以及你使用的
JSF
的哪个版本吗?看看更新的问题(用我的web xml)这里你有我的beanhi,很好的提示;通过将primefaces.UPLOADER设置为common,解决了ajax的问题。但有一个问题仍然存在:当我上传例如3个文件时,handleFileUpload工作正常,但数组列表只包含一个值(就像其他两个被丢弃一样)。你知道为什么吗?@Niko每个上传的文件都会调用侦听器一次。是的,没错。但是为什么当我上传三个文件时列表只包含一个值(handleupload被调用了三次)?这是一个ajax问题,它会失去状态吗?
package uk;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

    @ManagedBean(name = "tempBean")
    @ViewScoped
    public class TempBean {

        private List<UploadedFile> uploadedFiles; //to remember which files have been uploaded

        public TempBean() {
                super();
                System.out.println("@constructor");
                uploadedFiles = new ArrayList<UploadedFile>();
        }

        public void handleFileUpload(FileUploadEvent event) { 
               System.out.println("! HANDLE FILE UPLOAD !");
               // do something
        }  
        public List<UploadedFile> getUploadedFiles() {
                return uploadedFiles;
        }

        public void setUploadedFiles(List<UploadedFile> uploadedFiles) {
                this.uploadedFiles = uploadedFiles;
        }

    }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<h:body>

    <h:form enctype="multipart/form-data">
     <p:growl id="messages" showDetail="true" />
     <p:fileUpload
                fileUploadListener="#{tempBean.handleFileUpload}"
                mode="advanced" dragDropSupport="true" multiple="true"
                update="messages" />
  </h:form>
</h:body>
</html>
<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3</version>
    </dependency>