今天练习servlet的时候,接近servlet章节的末尾时,发现一个不需要另外添加组件就可以实现文件上传的方法,这也是servlet3.0的新特性。按着书上的代码,敲了一遍,已运行,报错,java.lang.NullPointerException。回过头来检查下代码,没发现有错误的地方。没办法,只要需求百度的帮助了。然后就发现了下面这篇文章。
http://www.nqwang.com/2014/0405/91956.html
在Servlet3.0之前,处理上传文件的操作一直是让开发者头疼的问题,因为Servlet本身没有对此提供直接的支持,需要使用第三方框架来实现,而且使用起来也不够简单。
Servlet3.0提供了对文件上传的支持,通过@MultipartConfig标注和HttpServletRequest的两个新方法getPart()和getParts(),开发者能够很容易实现文件的上传操作。
@MultipartConfig标注主要是为了辅助Servlet3.0中HttpServletRequest提供的对上传文件的支持。该标注写在Servlet类的声明之前,一表示该Servlet希望处理的请求时multipart/form-data类型的。另外,该标注还提供了若干属性用于简化对上传文件的处理。
@MultipartConfig标注属性
fileSizeThershold int型 是(可选) 描述:当前数据量大于该值时,内容将被写入文件。
location String型 是(可选) 描述:存放生成文件的地址
maxFileSize long型 是(可选) 描述:允许上传的文件最大值,默认为-1,表示没有限制
maxRequestSize long型 是(可选) 描述:针对 multipart/form-data 请求的最大数量,默认为-1,表示没有限制
<!--index.html文件部分代码--> <form action="/HelloWorld/UpLoad" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" name="upload" value="上传"> </form>
/*UpLoad.java为上传文件的Servlet类*/ package javaee.servlet; import ………… //设置访问活着调用这个Servlet的路径 @WebServlet("/UpLoad") //说明该Servlet处理的是multipart/form-data类型的请求 @MultipartConfig public class UpLoad extends HttpServlet{ private static final long serialVersionUID = 1L; public UpLoad(){ super(); } protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ this.doPost(request, response); } protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ //说明输入的请求信息采用UTF-8编码方式 request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); //Servlet3.0中新引入的方法,用来处理multipart/form-data类型编码的表单 Part part = request.getPart("file"); //获取HTTP头信息headerInfo=(form-data; name="file" filename="文件名") String headerInfo = part.getHeader("content-disposition"); //从HTTP头信息中获取文件名fileName=(文件名) String fileName = headerInfo.substring(headerInfo.lastIndexOf("=") + 2, headerInfo.length() - 1); //获得存储上传文件的文件夹路径 String fileSavingFolder = this.getServletContext().getRealPath("/UpLoad"); //获得存储上传文件的完整路径(文件夹路径+文件名) //文件夹位置固定,文件夹采用与上传文件的原始名字相同 String fileSavingPath = fileSavingFolder + File.separator + fileName; //如果存储上传文件的文件夹不存在,则创建文件夹 File f = new File(fileSavingFolder + File.separator); if(!f.exists()){ f.mkdirs(); } //将上传的文件内容写入服务器文件中 part.write(fileSavingPath); //输出上传成功信息 out.println("文件上传成功~!"); } }
/DownLoadjava为下载文件的Servlet类*/ package javaee.servlet; import ………… @WebServlet("/DownLoad") public class DownLoad extends HttpServlet{ private static final long serialVersionUID = 1L; public DownLoad(){ super(); } protected void doGet(HttpServletRequest request ,HttpServletResponse response) throws ServletException,IOException{ this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ try{ //服务器相对路径 String filepath = "WEB-INF/web.xml"; //服务器绝对路径 String fullFilePath = getServletContext().getRealPath(filepath); System.out.println(fullFilePath); /*打开文件,创建File类型的文件对象*/ File file = new File(fullFilePath); /*如果文件存在*/ if(file.exists()){ System.out.println("文件存在"); /*获得文件名,并采用UTF-8编码方式进行编码,以解决中文问题*/ String filename = URLEncoder.encode(file.getName(), "UTF-8"); System.out.println(filename); /*重置response对象*/ response.reset(); //设置文件的类型,xml文件采用text/xml类型,详见MIME类型的说明 response.setContentType("text/xml"); //设置HTTP头信息中内容 response.addHeader("Content-Disposition","attachment:filename=\"" + filename + "\"" ); //设置文件的长度 int fileLength = (int)file.length(); System.out.println(fileLength); response.setContentLength(fileLength); /*如果文件长度大于0*/ if(fileLength!=0){ //创建输入流 InputStream inStream = new FileInputStream(file); byte[] buf = new byte[4096]; //创建输出流 ServletOutputStream servletOS = response.getOutputStream(); int readLength; //读取文件内容并写到response的输出流当中 while(((readLength = inStream.read(buf))!=-1)){ servletOS.write(buf, 0, readLength); } //关闭输入流 inStream.close(); //刷新输出缓冲 servletOS.flush(); //关闭输出流 servletOS.close(); } }else { System.out.println("文件不存在~!"); PrintWriter out = response.getWriter(); out.println("文件 \"" + fullFilePath + "\" 不存在"); } }catch(Exception e){ System.out.println(e); } } }
问题确实是没有添加@MultipartConfig,然后添加@MultipartConfig之后,在回过头来细细的看了下这篇文章。
分享到:
相关推荐
通过以上特性,Servlet 3.0简化了文件上传的处理,使得开发者可以更专注于业务逻辑,而不是底层的实现细节。同时,这些改进也使得文件上传操作更加安全,更适应现代Web应用的需求。 如果你想要深入了解Servlet 3.0...
* servlet3.0的文件上传 * @date:2012-5-21 *在创建项目的时候首先添加Tomcat7.x的支持,然后把apache-tomcat-7.0.27\conf\web.xml拷贝到项目WEB-INF目录下 *把之前的web.xml覆盖.. 配置留下 <?xml version...
在这个主题中,我们将深入探讨Servlet3.0的两个核心新特性:文件上传的简化以及Part接口的使用,以及MultiConfig注解在多配置环境中的应用。 首先,让我们关注Servlet3.0对文件上传的支持。在Servlet2.5及以前的...
Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...
总结来说,Servlet3.0的新特性带来了更简洁的配置、更高效的异步处理、更灵活的过滤器和监听器注册,以及对文件上传的内置支持。这些改进都极大地推动了Java Web应用的开发效率和性能,使得开发人员能够更加专注于...
Servlet 3.0是Java EE 6规范的一部分,它引入了一系列重要的新特性,极大地改进了Web应用程序的开发和部署方式。在这个主题中,我们将深入探讨Servlet 3.0的模块化实践,以及如何利用这些特性优化开发流程。 一、...
综上所述,Servlet 3.0简化了Java Web中文件上传的实现,通过`Part` API,我们可以方便地处理Multipart请求,实现安全、高效的文件上传功能。在实际应用中,结合最佳实践和安全策略,可以为用户提供更好的服务。
在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,并且采用注解的方式来简化代码。 在Servlet 3.0之前,我们需要在web.xml中配置Servlet,然后通过继承...
下载的`servlet3.0jar综合`压缩包包含了实现这些特性的关键库,对于进行Java EE 3.0开发的程序员来说是必不可少的工具。在实际开发中,结合相关的框架(如Spring MVC)和其他Java EE组件,可以构建出功能强大、易...
Servlet 3.0是Java服务器页面(JSP)和Servlet技术的一个重要版本更新,它引入了许多新特性,提升了Web应用程序的开发效率和灵活性。在JSR-315(JavaTM Servlet 3.0 API Specification)中,专家小组对这项规范进行...
在这个"Servlet3.0 Demo"项目中,我们可以看到一个典型的使用Servlet3.0特性的示例。以下是关于Servlet3.0的一些关键知识点: 1. **注解配置**: Servlet3.0引入了注解配置,允许开发者无需在web.xml文件中进行...
例如,当一个请求触发了一个耗时的任务(如文件上传或数据库查询)时,Servlet 可以将控制权交给容器,让容器在后台继续执行这些操作,同时释放当前线程去处理其他请求。当后台任务完成时,Servlet 可以恢复执行并...
Servlet 3.0 的新特性包括注解配置、模块化开发、程序异步处理、改进文件上传 API、非阻塞式 IO 读取流和 Websocket 实时通信。这些新特性大大简化了 Web 应用开发,为广大劳苦的程序员减轻了压力,提高了 Web 开发...
- 提供了新的`Part`接口和相关的API,使得处理上传的多部分表单数据(如文件上传)更加方便。 9. **安全增强**: - Servlet 3.0增强了安全相关的API,比如`HttpServletRequest.isUserInRole()`方法现在可以接受多...
Servlet3.0 实现文件上传的方法是通过利用其新特性,包括注解支持和HttpServletRequest对象对文件上传的内置处理,从而简化了以往依赖第三方库如Apache Commons FileUpload的复杂过程。在Servlet 3.0中,我们可以...
7. **MIME多部分解析**:Servlet 3.0引入了`Part`接口,用于处理MIME多部分请求,这在处理上传文件时非常有用。 8. **安全增强**:添加了新的安全相关API,如`HttpServletRequest.isUserInRole()`和`...
10. **MIME类型自动检测**:通过实现Part接口,Servlet 3.0可以自动检测上传文件的MIME类型,使得文件上传处理更加智能。 综上所述,Servlet 3.0规范带来了许多创新特性,极大地提升了Java Web开发的便捷性和效率。...
3. 文件上传支持:规范提供了内置的文件上传功能,使得servlet能够处理来自客户端的文件上传请求,并将文件保存到服务器上。 4. 可插拔的Web组件:servlet 3.0允许开发者通过编程方式注册servlet和filter,这为动态...
这个版本是Servlet规范3.0的早期预览版,为开发者提供了对新特性和改进的初步体验。在本文中,我们将深入探讨Servlet API 3.0的主要特性,以及如何利用它们来提升Web应用的性能和可维护性。 1. **依赖注入 ...
Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"study-servlet3.0"的学习资源中,我们将深入探讨Servlet3.0的核心改进和特性。 1. *...