Servlet 3.0 规范(二)注解驱动和异步请求
Servlet 3.0 规范(二)注解驱动和异步请求
在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件。
一、Servlet 3.0 组件
Servlet 容器的组件大致可以分为以下几类:
Servlet 3.0 组件
  ├── 组件申明注解
  |    ├── @javax.servlet.annotation.WebServlet
  |    ├── @javax.servlet.annotation.WebFilter
  |    ├── @javax.servlet.annotation.WebListener
  |    ├── @javax.servlet.annotation.ServletSecurity
  |    ├── @javax.servlet.annotation.HttpMethodConstraint
  |    └── @javax.servlet.annotation.HttpConstraint
  |
  ├── 配置申明
  |    └── @javax.servlet.annotation.WebInitParam
  |
  ├── 上下文
  |    └── @javax.servlet.AsyncContext
  ├── 事件
  |    └── @javax.servlet.AsyncEvent
  ├── 监听器
  |    └── @javax.servlet.AsyncListener
  |
  ├── Servlet 组件注册
  |    ├── javax.servlet.ServletContext#addServlet()
  |    └── javax.servlet.ServletRegistration
  |
  ├── Filter 组件注册
  |    ├── javax.servlet.ServletContext#addFilter()
  |    └── javax.servlet.FilterRegistration
  |
  ├── 监听器注册
  |    ├── javax.servlet.ServletContext#addListener()
  |    └── javax.servlet.AsyncListener
  |
  └── 自动装配
       ├── javax.servlet.ServletContainerInitializer
       └── @javax.servlet.annotation.HandlesTypes
二、注解驱动
1.1 Servlet 3.0 注解
Servlet 3.0 常用注解: @WebServlet @WebFilter @WebInitParam @WebListener
@WebServlet("/hello")
public class HelloServert extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().write("hello");
    }
}
Tomcat 7.x 以上的版本启动,访问 localhost:8080/hello。Tomcat 对 Servlet 的支持如下:
Tomcat 6.x 实现 Servert 2.5
Tomcat 7.x 实现 Servert 3.0
Tomcat 8.x 实现 Servert 3.1
Tomcat 9.x 实现 Servert 4.0
1.2 ServletContainerInitializer
Servlet 容器启动会扫描当前应用的每一个 jar 包 ServletContainerInitializer 的实现。
通过每个 jar 包下的 META-INFO/services/javax.servlet.ServletContainerInitializer 文件:
com.github.binarylei.MyServletContainerInitializer

@HandlesTypes(HelloServert.class)
public class MyServletContainerInitializer implements ServletContainerInitializer {
    /**
     * @param c                 @HandlesTypes 指定,HelloServert 子类
     * @param ServletContext    注册三大组件(Servlet Filter Listener)
     */
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext ctx)
            throws ServletException {
        // 1. 处理感兴趣的类
        System.out.println(set);
        // 2.1. 注册 Servert
        ServletRegistration.Dynamic servlet = ctx.addServlet("myServlet", HelloServert.class);
        servlet.addMapping("/*");
        // 2.2. 注册 Listener
        ctx.addListener(MyServletContextListener.class);
        // 2.3. 注册 Filter
        FilterRegistration.Dynamic filter = ctx.addFilter("myFileter", MyFilter.class);
        filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),
                true, "/*");
    }
}
在 Servlet 3.0 时支持注解启动,其中 ServletContainerInitializer 和 HandlesTypes 都是 Servlet 3.0 的规范。
ServletContainerInitializer只有一个方法 onStartupHandlesTypes感兴趣的类,启动时会通过 onStartup 传递给 clazzs 参数。HandlesTypes 会找到 HelloServert 所有的子类(不包括 HelloServert 自己)
三、异步请求
@WebServlet(value = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 1. 支持异步处理 asyncSupported = true
        // 2. 开启异步处理模式
        AsyncContext asyncContext = req.startAsync();
        // 3. 子线程处理响应
        asyncContext.start(() -> {
            process();
            // 4. 处理结束
            asyncContext.complete();
            PrintWriter writer = asyncContext.getResponse().getWriter();
            writer.write("async");
        });
    }
    private void process() {
        TimeUnit.SECONDS.sleep(5);
    }
}
每天用心记录一点点。内容也许不重要,但习惯很重要!
Servlet 3.0 规范(二)注解驱动和异步请求的更多相关文章
- 启用Servlet 3.0新特性——注解支持
		
Servlet 3.0版本新增注解支持,可是在实际使用中,添加的注解总是不起作用.经过检查,原来是“web.xml”文件的顶级标签“<web-app/>”中的一个叫做“metadata-c ...
 - 0、Spring 注解驱动开发
		
0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...
 - Spring注解开发系列Ⅸ --- 异步请求
		
一. Servlet中的异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果要处理一些 ...
 - Servlet 2.4 规范之第五篇:请求
		
request对象封装了来自客户端的所有请求信息.在HTTP协议中,客户端发给服务端的所有信息都是通过request对象的请求头和请求体来传送的. SRV.4.1 HTTP协 ...
 - Swift3.0:Get/Post同步和异步请求
		
一.介绍 Get和Post区别: Get是从服务器上获取数据,Post是向服务器发送数据. 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Req ...
 - servlet 3.0 的新特性之三对异步处理的支持
		
一.异步处理 1. 什么是异步处理 原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果! 现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不 ...
 - Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用
		
Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...
 - Java EE - Servlet 3.0 和 Spring MVC
		
Table of Contents 前言 基于 Java 的配置 ServletContainerInitializer 动态配置 DispatcherServlet 和 ContextLoaderL ...
 - servlet 3.0特性说明
		
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...
 
随机推荐
- depth: working copy\infinity\immediates\files\empty
			
depth: working copy\infinity\immediates\files\empty 有时间,需要整理下,svn 合并深度这四项:具体的意思.
 - Error:stray '\243' in program
			
c++ 程序出现 Error:stray '\243' in program 错误 错误情况: 错误原因: 有不标准的 ASCII 字符出现,一般是中英文问题,比如 :or ; , or ,等 ...
 - 22. Generate Parentheses (backTracking)
			
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
 - OpenGL ES 2 for Android - A Quick Start Guide
			
英文原版,语法很简单,带书签,带实例,很好的书,从头到尾讲述OpenGL强烈推荐!~~~ 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com ...
 - Python开发【第三篇】:Python函数
			
set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def ...
 - ES3之变量提升 ( hoisting )
			
JavaScript引擎在预编译时,会将声明(函数声明.变量声明)自动提升至函数或全局代码的顶部.但是赋值不会提升. Because variable declarations (and declar ...
 - 项目总结07:JS图片的上传预览和表单提交(FileReader()方法)
			
JS图片的上传预览和表单提交(FileReader()方法) 一开始没有搞明白下面这块代码的,今天有时间简单整理下 核心点:FileReader()方法 以下是代码(以JSP文件为例) <!DO ...
 - 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭
			
com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. at com.microsoft.sqlserver.jdbc.SQLServerEx ...
 - Practice 10
			
通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. settext是根据数组新建的pets[1]object来的,对其调用抽象方法talk, ...
 - linux命令学习之:wc
			
wc(Word Count)命令用来计算数字.利用wc指令我们可以计算文件的Byte数.字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据. 命令格式 wc ...