当<h:form>包含enctype =“multipart / form-data”

时间:2016-09-08 12:33:53

标签: spring file-upload primefaces jsf-2.2 enctype

我前几天已经发布了关于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 guidehow 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-paramfilter条目的情况下进行了测试,但没有成功:

- &GT;
p:fileupload

请注意,我必须用空格('/ *')分隔'/ *',这样我的其余代码就不会被格式化为注释。 (如果有更聪明的方法,请不要犹豫告诉我)

Spring的MVC Dispatcher Servlet会不会干扰Servlet 3.0的上传功能?

我是否使用其他组件破坏了Servlet 3.0文件上传的标准行为?

我的项目是否设置正确?

非常感谢你。即使是一点点提示也会受到高度赞赏。

0 个答案:

没有答案