`
pxlfxl2
  • 浏览: 51068 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

Servlet 3.0新特性——文件上传接口

阅读更多

 Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作。今天做了个小demo,测试了写Servlet 3.0的文件上传功能。 
    1.写文件上传的服务端(Servlet ),将上传文件全都保存到指定配置的目录下面,转向上传文件列表的显示页面。 

package com.neusoft.servlet3.demo;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * Servlet implementation class FileUploadServlet
 */
@WebServlet(
		description = "文件上传",   
		urlPatterns = { "/upload" }
		)
@MultipartConfig(
		location = "E:\\upload",//文件存放路径,指定的目录必须存在,否则会抛异常
		maxFileSize = 8388608,//最大上传文件大小,经测试应该是字节为单位
		fileSizeThreshold = 819200//当数据量大于该值时,内容将被写入文件。(specification中的解释的大概意思,不知道是不是指Buffer size),大小也是已字节单位
		//maxRequestSize =  8*1024*1024*6 //针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。以字节为单位。
)
public class FileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private String fileNameExtractorRegex = "filename=\".+\"";
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileUploadServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		throw new UnsupportedOperationException();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<String> fileNames = new LinkedList<String>();
		request.setCharacterEncoding("UTF-8");
		Collection<Part> parts = request.getParts();
		//遍历所有的表单内容,将表单中的文件写入上传文件目录
		for (Iterator<Part> iterator = parts.iterator(); iterator.hasNext();) {
			Part part = iterator.next();
			//从Part的content-disposition中提取上传文件的文件名
			String fileName = getFileName(part);
			if(fileName!=null){
				fileNames.add(fileName);
				part.write(fileName);
			}
		}
		request.setAttribute("fileNames", fileNames);
		//显示上传的文件列表
		request.getRequestDispatcher("upload_files_list.jsp").forward(request, response);
	}
	/**
	 * 从Part的Header信息中提取上传文件的文件名
	 * @param part
	 * @return  上传文件的文件名,如果如果没有则返回null
	 */
	private String getFileName(Part part){
		//获取header信息中的content-disposition,如果为文件,则可以从其中提取出文件名
		String cotentDesc = part.getHeader("content-disposition");
		String fileName = null;
		Pattern pattern = Pattern.compile(fileNameExtractorRegex);
		Matcher matcher = pattern.matcher(cotentDesc);
		if(matcher.find()){
			fileName = matcher.group();
			fileName = fileName.substring(10, fileName.length()-1);
		}
		return fileName;
	}
}

    

2.上传文件jsp页面(fileupload.jsp)代码片段,enctype必须申明为multipart/form-data,否则Servlet 会抛异常! 

	<form action="upload" method="post" enctype="multipart/form-data">
		<fieldset>
			<label>File1:</label><input type="file" name="file1"/><br/>
			<label>File2:</label><input type="file" name="file2"/><br/>
			<label>File3:</label><input type="file" name="file3"/><br/>
			<label>File4:</label><input type="file" name="file4"/><br/>
			<label>File5:</label><input type="file" name="file5"/>
		</fieldset>
		<input type="submit" name="submit" value="upload"/>
	</form>
 

3.上传文件列表显示页面(upload_files_list.jsp)代码片段。 

	<p>上传了${fn:length(fileNames) }几个文件 </p>
	<c:if test="${not empty fileNames }">
		<ul>
			<c:forEach var="fileName" items="${fileNames }">
				<li>${fileName}</li>
			</c:forEach>
		</ul>
	</c:if>

 

    Servlet 3.0的文件上传功能确实好用,只等Java EE 6普及了,到时候就可以抛弃Commons-FileUpload了!不过Servlet 3.0的文件上传接口也有不足指出,比如不能直接获取上传的文件的文件名,MultipartConfig信息好像也没有提供接口直接获取,我查了好半天没找到,当然没有这些功能也有好处的,那就是带来简单易用接口……当实际有需要的时候再写点扩展的工具类就OK了。 
    Servlet 3.0还提供了很多其他新功能,最吸引人当然就是对异步处理的支持,有空再研究研究…… 

    

    PS:Tomcat 7.0正式版已经发布了,今天使用了下,感觉对jsp的处理不怎么好,100%一样的代码我在Glassfish下完美运行,放到tomcat 7就报jsp解析异常(xml解析异常),太不稳定了,看堆栈信息是从xerces中抛出来的,估计跟xerces解析xml有关,懒得深究,还是等以后发布了4、5更新后再考虑使用吧! 

 

 

 

3
3
分享到:
评论
3 楼 snowolf 2010-07-28  
非常不错!!!!支持!!!收藏!
2 楼 pxlfxl2 2010-07-28  
魔力猫咪 写道
7.0目前还是BETA版本。刚出来的时候本来也以为是正式版,但是页面上明确写着Bate。不过下载文件上没写。

嗯,发布申明确实写的Beta版,下载下来的文件没打上Beta标记,关键是现在还很不稳定。。。还是glassfish 3好点,但glassfish 3暂时还不支持集群
1 楼 魔力猫咪 2010-07-28  
7.0目前还是BETA版本。刚出来的时候本来也以为是正式版,但是页面上明确写着Bate。不过下载文件上没写。

相关推荐

    Servlet3.0 新特性

    Servlet3.0是Java Servlet API的一个重要版本更新,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。以下将详细讲解Servlet3.0的关键特性。 1. **注解驱动的配置**: 在Servlet3.0之前,...

    Servlet3.0新特性解析

    Servlet3.0是Java Servlet API的一个重要版本更新,它引入了许多新特性,极大地提升了Web开发的效率和灵活性。在这个主题中,我们将深入探讨Servlet3.0的三大关键特性:监听器(Listeners)、过滤器(Filters)的新...

    servlet3.0新特性源代码

    * servlet3.0的文件上传 * @date:2012-5-21 *在创建项目的时候首先添加Tomcat7.x的支持,然后把apache-tomcat-7.0.27\conf\web.xml拷贝到项目WEB-INF目录下 *把之前的web.xml覆盖.. 配置留下 &lt;?xml version...

    Servlet3.0新特性

    在这个主题中,我们将深入探讨Servlet3.0的两个核心新特性:文件上传的简化以及Part接口的使用,以及MultiConfig注解在多配置环境中的应用。 首先,让我们关注Servlet3.0对文件上传的支持。在Servlet2.5及以前的...

    Servlet3.0参考手册

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。这份"Servlet3.0参考手册"无疑为开发者提供了全面的API参考和实用指南。 首先,Servlet3.0...

    Servlet3.0特性详解

    Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...

    servlet 3.0新增功能详解

    本文将详细介绍 Servlet 3.0 的关键新特性,包括异步处理、新增的注解支持以及可插性支持等方面。 #### 异步处理支持 异步处理是 Servlet 3.0 中最为显著的新特性之一。这一特性解决了传统 Servlet 在处理长时间...

    servlet3.0.jar下载

    Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个"javax.servlet-api-3.0.1.jar"文件是Servlet 3.0规范的API实现,包含了开发人员编写...

    Servlet3.0新特性解析01

    总结来说,Servlet3.0的新特性带来了更简洁的配置、更高效的异步处理、更灵活的过滤器和监听器注册,以及对文件上传的内置支持。这些改进都极大地推动了Java Web应用的开发效率和性能,使得开发人员能够更加专注于...

    Servlet3.0新特性,Servlet3新特性,Servlet3注解,Servlet3异步处理【蕃薯耀】

    Servlet3.0是Java Servlet API的一个重大更新,它引入了许多新特性和改进,极大地提高了开发效率和应用程序的性能。在本篇文章中,我们将深入探讨Servlet3.0的主要新特性,包括注解、异步处理、容器初始化参数以及...

    Servlet3.0 新特性之模块化实践

    Servlet 3.0是Java EE 6规范的一部分,它引入了一系列重要的新特性,极大地改进了Web应用程序的开发和部署方式。在这个主题中,我们将深入探讨Servlet 3.0的模块化实践,以及如何利用这些特性优化开发流程。 一、...

    Servlet 3.0jar包和source包

    首先,Servlet 3.0作为Servlet API的一个版本,引入了许多新特性以提高开发效率和灵活性: 1. **注解配置**:在Servlet 3.0之前,开发者需要在web.xml文件中手动配置Servlet和过滤器。而Servlet 3.0允许使用注解...

    servlet3.0实现文件上传——demo1.zip

    本工程用于借助Servlet3.0实现文件上传 本工程编码方式:UTF-8 注意: 1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C...

    servlet 3.0 jar 包综合下载

    在Servlet 3.0规范中,引入了许多新特性,旨在提高开发效率、简化编程模型以及增强可扩展性。下面将详细阐述Servlet 3.0的主要知识点。 1. **注解驱动的配置**:Servlet 3.0引入了注解(Annotation)来替代XML配置...

    servlet3.0-demo

    在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,并且采用注解的方式来简化代码。 在Servlet 3.0之前,我们需要在web.xml中配置Servlet,然后通过继承...

    Servlet3.0_新特性

    本文将深入探讨Servlet3.0的新特性,重点解析异步处理支持、新增注解支持以及可插性支持,这些特性极大地提升了Web应用的性能和开发者的便利性。 ### 异步处理支持 异步处理是Servlet3.0最令人瞩目的新特性之一。...

    servlet3.0文件上传 01.zip

    本工程用于借助Servlet3.0实现文件上传 本工程编码方式:UTF-8 注意: 1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C...

    servlet3.0.zip

    Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个压缩包“servlet3.0.zip”包含两个核心的JAR文件:“javax.servlet-javadoc.jar”和...

    java上传文件(servlet3.0)

    一、Servlet 3.0新特性 Servlet 3.0标准放宽了对web.xml的依赖,支持注解式配置,这使得部署应用更为便捷。此外,还引入了异步处理能力,提高了性能。对于文件上传,Servlet 3.0提供了一个名为`Part`的API,用于处理...

Global site tag (gtag.js) - Google Analytics