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>