Java 为什么这个简单的文件上传不起作用?JSF

Java 为什么这个简单的文件上传不起作用?JSF,java,jsf,Java,Jsf,为什么这个代码不起作用?每当我上传文件时,我总是得到size()=0 xhtml文件:- <?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"> <html xmlns="http://www.w3.o

为什么这个代码不起作用?每当我上传文件时,我总是得到size()=0

xhtml文件:-

<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Abc</title>

    </h:head>
    <h:body>
        <center>

            <form method="post" enctype="multipart/form-data" id="form" action="/upload/uploadFile">
                    <input type="file"/>    <br/>
                    <input type="Submit" value="upload"/>
            </form>

        </center>
    </h:body>
</html>

Abc

这是我的servlet:-

package servlets;

import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


@WebServlet(name="uploadFile", urlPatterns={"/uploadFile"})
public class uploadFile extends HttpServlet {


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, FileUploadException {
        System.out.println("executed!");
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        System.out.println(items.size());
         for (FileItem item : items) {
                if (!item.isFormField()) {
                    System.out.println("Name: " + item.getName());
                    System.out.println("Size: " + item.getSize());
                    System.out.println("Type: " + item.getContentType());
                }
            }
    } 


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }
    } 


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }
    }


    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
包servlet;
导入java.io.IOException;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.FileUploadException;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet(name=“uploadFile”,urlPatterns={”/uploadFile})
公共类上载文件扩展HttpServlet{
受保护的void processRequest(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException、FileUploadException{
System.out.println(“已执行!”);
列表项=新建ServletFileUpload(新建DiskFileItemFactory()).parseRequest(请求);
System.out.println(items.size());
用于(文件项:项){
如果(!item.isFormField()){
System.out.println(“Name:+item.getName());
System.out.println(“Size:+item.getSize());
System.out.println(“类型:”+item.getContentType());
}
}
} 
@凌驾
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
试一试{
processRequest(请求、响应);
}catch(FileUploadException-ex){
例如printStackTrace();
}
} 
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
试一试{
processRequest(请求、响应);
}catch(FileUploadException-ex){
例如printStackTrace();
}
}
@凌驾
公共字符串getServletInfo(){
返回“简短描述”;
}
}
更新:

1) 如果我只是将name=“something”添加到
input type=“file”
,那么它可以正常工作。这背后有什么逻辑

2) 如果我使用h:form而不是form,那么它就不起作用(甚至我的actionListener方法也不会被执行)。这背后有什么原因?我读到h:form不是为处理多部分/表单数据请求而设计的。这是真的吗

1) 如果我只是将name=“something”添加到input type=“file”,那么它就可以正常工作了

需要名称来区分提交的值与其他值-否则,您将如何在请求中标识参数

2) 如果我使用h:form而不是form,那么它就不起作用(甚至我的actionListener方法也不会被执行)。这背后有什么原因?我读到h:form不是为处理多部分/表单数据请求而设计的。这是真的吗


您正在尝试混合使用JSF控件和普通HTML元素。如果不使用JSF servlet,就不要期望执行JSF生命周期。JSF表单可以支持文件上载-许多JSF组件库都提供此类控件。

我看到您使用的是servlet 3.0。它在方法背后采用了Commons FileUpload你可以阅读你应该如何使用它

由于JSF 2更多地创建自定义组件,而ToaAHAK还没有准备好JSF 2(通常你会选择<代码> t:Ipple FielUpad < /Cord>)有一个JSF文件上传组件,你也可以考虑自己创建一个自定义文件上传组件。



也就是说,HTML
元素自1998年以来已被弃用。您希望在包含块元素上使用CSS样式的
边距:0 auto;

太好了!回答BalusC。信息量非常大。从下一次开始,我会注意不要使用此线程,它可能会扩大您的范围[[1]: