我前几天已经发布了关于p:fileupload
的{{3}}。在深入研究这个问题后,我意识到我的主要问题似乎有不同的起源,因此我提出了一个新的问题。
我正在为移动设备开发一个网络应用程序(JSF2.2),用户可以多次上传文件。我想使用Primefaces的p:fileupload
组件来完成这项似乎不起作用的工作。我发现问题似乎与enctype="multipart/form-data"
的{{1}}属性有关。每当我在表单中使用此属性时,commandButton不会调用其<h:form>
属性中指定的bean方法(使用action=""
时都不会)。当我删除actionListener=""
属性时,除了文件上传之外,一切都正常。
出于测试和调试目的,我创建了一个enctype="multipart/form-data"
页面
目前看来如下:
uploadTest.xhtml
为了从可能的错误列表中排除Primefaces,我创建了另一个测试页面,我只使用了<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<f:view renderKitId="PRIMEFACES_MOBILE" />
<h:head>
</h:head>
<h:body>
<h:form id="dasistmeineform" enctype="multipart/form-data">
<p:fileUpload value="#{uploadBean.uploadedFile}" mode="simple"/>
<p:commandButton action="#{uploadBean.upload}" ajax="false" value="upload" />
</h:form>
</h:body>
</html>
和<h:inputFile>
而没有使用primefaces组件。这给了我相同的结果。
这是我的UploadBean.java:
<h:commandButton>
我个人的猜测是,这个问题与应用程序的设置方式或应用程序中JSF的实现方式有关。为了解决这个问题,我跟随了@ {{{{question。此外,我还介绍了其他一些问题排查指南,包括JSF set up guide和how to troubleshoot p:fileupload。到目前为止,遗憾的是没有任何帮助。
我在Netbeans控制台中没有出错,也没有在Chrome的开发者控制台中出错。按下上传按钮后,我可以使用开发人员工具查看HTTP请求。响应有代码200所以一切都应该在HTTP端正常工作,对吗?
Web应用程序使用以下组件:
JSF 2.2.13(Mojarra)
Spring Webflow
Spring MVC
Primefaces 5.3
Omnifaces 1.3
Bootsfaces 0.9.1
直接通过Netbeans在Jetty 8.1.5服务器上部署和测试应用程序。
要检查我是否已下载所有必需的依赖项,我将包含我的pom.xml的相关方(我使用maven):
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ManagedBean;
import org.primefaces.model.UploadedFile;
@ManagedBean
@RequestSoped
public class UploadBean {
private UploadedFile uploadedFile;
public UploadedFile getUploadedFile() {
return uploadedFile;
}
public void setUploadedFile(UploadedFile uploadedFile) {
this.uploadedFile = uploadedFile;
}
public void upload() {
if (this.getUploadedFile() != null) {
System.out.println("Hurray!");
}
}
}
我添加了 <dependencies>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.13</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<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>
</dependencies>
和commons-io
来测试commons-fileupload
是否可以使用旧的(在Servlet 3.0之前)方式,但它没有。
这是我的web.xml :(请注意,我在p:fileupload
没有成功的context-param
和filter
条目的情况下进行了测试,但没有成功:
p:fileupload
请注意,我必须用空格('/ *')分隔'/ *',这样我的其余代码就不会被格式化为注释。 (如果有更聪明的方法,请不要犹豫告诉我)
Spring的MVC Dispatcher Servlet会不会干扰Servlet 3.0的上传功能?
我是否使用其他组件破坏了Servlet 3.0文件上传的标准行为?
我的项目是否设置正确?
非常感谢你。即使是一点点提示也会受到高度赞赏。