Servlet3.0新特性

时间:2017-1-4 16:51

——Servlet3.0新特性概述

前提:
    1、MyEclipse1.0或以上版本
    2、发布到Tomcat7.0或以上版本

步骤:
    1、创建JavaEE6.0项目
        在web.xml文件中有如下字样,即JavaEE6.0项目(是否Servlet3.0)

<web-app version="3.0">

新特性:
    1、使用@WbServlet、@WebFilter、@WebListener三个注解来替代web.xml文件中的Servlet、Filter、Listener的配置。

2、Servlet异步处理:
        当Servlet处理比较费时的问题时,会让客户感觉到很卡,当使用异步处理时可以把已经处理好的内容先一步响应给客户端浏览器,然后使用另一个线程来完成费时的操作,也就是把内容一部分一部分显示出来。

3、上传组件:不再使用fileupload等第三方的上传组件,使用Servlet3.0的上传组件会更方便。

——注解替代配置文件

配置Servlet:

1、删除web.xml文件
    2、创建class文件,而不是Servlet文件
    3、在Servlet类上添加:@WebServlet(urlPatterns="/AServlet")

总结:
        注解优点:配置信息少
        注解缺点:不方便修改,如果需要修改注解,则需要修改源码

示例代码:

@WebServlet(urlPatterns="/AServlet",

initParams={

@WebInitParam(name="p1", value="v1"),

@WebInitParam(name="p2", value="v2")},

loadOnStartup=1

)

配置Filter:

@WebFilter(urlPatterns = "/*")

public class AFilter implements Filter { }

配置Listener:

@WebListener

public class AListener implements ServletContextListener {

——异步处理

1、什么是异步处理
    原来在服务器没有结束响应之前,浏览器是看不到相应内容的,只有响应结束时,浏览器才能显示结果。
    现在异步处理的作用,在服务器开始响应后,浏览器就可以看到相应内容了,不需要等待服务器响应结束。

2、实现异步的步骤
    1)得到AsyncContext,它是异步上下文对象
        AsyncContext ac = request.startAsync(request, response);

2)给上下文一个Runnable对象,并启动。(给上下文一个任务,让它完成)
        ac.start(new Runnable(){
            public void run(){

}
        });

3、需要注意
    *   @WebServlet(urlPatterns="/AServlet", asyncSupported=true)
        必须设置支持异步
    *   response.setContentType("text/html;charset=utf-8");
        必须设置响应体类型
    *   IE默认响应体小于512b,不执行显示输出
    *   ac.complete()
        通知Tomcat异步线程已经结束了,Tomcat会即时断开链接,否则Tomcat会以响应超时结束线程。

示例代码:

import javax.servlet.AsyncContext;

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/*

*

*/

@WebServlet(urlPatterns = "/AServlet", asyncSupported = true)

public class AServlet extends HttpServlet {

// 内部类中使用外部、局部变量,必须为final

public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException {

response.setContentType("text/html;charset=utf-8");

/*

* 1、得到异步上下文对象

*/

final AsyncContext ac = request.startAsync(request, response);

/*

* 2、给上下文对象一个Runnable对象,让它执行这个任务

*/

ac.start(new Runnable() {

public void run() {

println("现在开始<br/>", response);

sleep(2 * 1000);

for (char c = ‘A‘; c <= ‘Z‘; c++) {

println(c + "", response);

sleep(100);

}

/*

* 通知Tomcat该线程已经结束,否则服务器会等待超时,自动结束

*/

ac.complete();

}

});

}

public void println(String text, HttpServletResponse response) {

try {

response.getWriter().println(text);
            // 如果流没有正常关闭,会抛出异常

response.getWriter().flush();

} catch (Exception e) {

}

}

public void sleep(long ms) {

try {

Thread.sleep(ms);

} catch (InterruptedException e) {

}

}

}

——上传支持

1、上传对表单的要求:
    *   method="post"
    *   enctype="multipart/form-data",默认值:application/x-www-form-urlencoded
    *   <input type="file" name=" " />

2、上传对Servlet的使用
    *   request.getParameter()
        已过时。
    *   request.getInputStream()
        使用它来获取整个表单的数据。

3、commons-fileupload
    >   创建工厂
    >   解析器
    >   使用解析器来解析request,得到List<FileItem>

——Servlet3.0对上传提供支持

*   表单不变
*   在Servlet中不需要再使用commons-fileupload,而是使用Servlet3.0提供的上传组件接口。

上传的步骤:
    1、使用request.getPart("字段名"),得到Part实例。
    2、Part:
        >   String  getConetntType()
            获取上传文件的MIME类型
        >   String  getName()
            获取表单项的名称,不是文件名称
        >   String  getHeader(String header)
            获取指定头的值
        >   long  getSize()
            获取上传文件的大小
        >   InputStream  getInputStream()
            获取上传文件的内容
        >   void  write(String fileName)
            把上传文件保存到指定路径下

默认Servlet是不支持使用上传组件,需要给Servlet添加一个注解:
        @MultipartConfig

它没有提供获取上传文件名的方法:
        这需要我们自己从Content-Disposition头中截取。

package com.wyc.web.servlet;

import java.io.IOException;

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;

@WebServlet(urlPatterns="/BServlet")

@MultipartConfig

public class BServlet extends HttpServlet{

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

request.setCharacterEncoding("utf-8");

/*

* 1、使用getParameter()方法获取表单参数

*/

String username = request.getParameter("username");

/*

* 2、获取文件表单字段,对应Part对象

*/

Part part = request.getPart("resume");

/*

* 3、从Part中获取需要的数据

*   *  获取上传文件的MIME类型

*   *  获取上传文件的字节数

*   *  获取上传文件字段名称(name)

*   *  获取上传文件的名称

*/

String mime = part.getContentType();

System.out.println(mime);

long size = part.getSize();

System.out.println(size);

String name = part.getName();

System.out.println(name);

String head = part.getHeader("Content-Disposition");

System.out.println(head);

/*
         * 手动截取文件名
         */

String fileName = head.substring(head.indexOf("filename") + 10, head.length() - 1);

System.out.println(fileName);

/*

* 4、保存上传文件

*/

part.write("F:/aa.mp3");

}

}

时间: 2024-09-29 17:32:41

Servlet3.0新特性的相关文章

Java基础加强-(注解,类加载器,servlet3.0新特性)

1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的“name=value”对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特

servlet3.0 新特性——异步处理

Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: 首先,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 接着,调用业务接口的某些方法,以完成业务处理: 最后,根据处理的结果提交响应,Servlet 线程结束. 其中第二步的业务处理通常是最耗时的,这主要体现在数据库操作,以及其它的跨网络调用等,在此过程中,Servlet 线程一直处于阻塞状态,直到业务方法执行完毕.在处理业务的过程中,Servlet 资源一直被占用而得不到释放,对于并发较大

JavaWeb学习之Servlet3.0新特性详解

异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程.在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器.针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet.过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再

[Servlet3.0新特性]注解替代配置文件

需要注意的是,如果使用Servlet 3.0版本的话:首先Tomcat服务器必须使用7.0版本以上的(老版本不提供3.0版本),其次Eclipse创建Web工程时选择3.0版本. Servlet 3.0版本允许使用注解方式来替代web.xml文件中配置Servlet.Filter和Listener的信息,首先回忆一下web.xml文件是如何配置Servlet.Filter和Listener的: <?xml version="1.0" encoding="UTF-8&qu

Servlet3.0新特性(Tomcat7.0版本及以上)

@WebServlet 作用 在Eclipse中创建Servlet后,Eclipse不会自动在web.xml中生成该Servlet对应的mapping信息,而是在Servlet代码中加入注解@WebServlet. @WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet. 使用 //对应旧版本中servlet标签中的内容@WebServlet(displayName = "This is ForwordS

中文乱码问题(使用Servlet3.0新特性实现文件上传——上传文件名中文乱码问题)

问题描述:就是文件传送过来的文件名等是乱码 解决方法:将传送的JSP页面(即含有表单的页面)的页面编码方式改为: <%@ page contentType="text/html; charset=GB2312" language="java" import="java.sql.*" errorPage="" %> <meta http-equiv="Content-Type" conten

无意之间发现的Servlet3.0新特性@WebServlet

今天无意之间看到了一个注解,这个注解就是@WebServlet,@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet.该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)完成了一个使用注解描述的Servlet程序开发. [email protected]注解常用属性: 2.开

java Servlet 3.0新特性例子

迟到的作业,Servlet3.0 已经出来很久了也没去关注,一直守旧于老的技术,今天抽时间学习了一下补个作业. Servlet3.0  特性: 1.Servlet.Filter.Listener无需在web.xml中进行配置,可以通过Annotation进行配置: 2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置. 3.Servlet异步处理,应对复杂业务处理: 4.异步Listener,对于异步处理的创建.完成等进行监听: 5. 文件上传API简化: 备注:tomcat7.0

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名