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 应用的开发 ...
随机推荐
- echarts 树图
1 事件:事件绑定,事件命名统一挂载到require('echarts/config').EVENT(非模块化为echarts.config.EVENT)命名空间下,建议使用此命名空间作为事件名引用, ...
- CentOS7下解决yum install mysql-server没有可用包
# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm -- http://repo.mysql.com/mysq ...
- cdnbest如何检查https证书是否有效
注意: 用此方法检查ssl证书是否有效,此帐号下必须有有效的cdn节点,因为这个证书是要通过底层的cdn节点来检测的 1. 在站点设置中如下图点打开添加ssl证书 2.加完证书后点检查,打勾就表示证书 ...
- MVC003之调用BLL层方法(BLL层调用了WebService)
项目又BLL类库,在类库中引用了webservice.在web层调用BLL的方法时 错误如下: 在 ServiceModel 客户端配置部分中,找不到引用协定“OAService.IntranetSe ...
- Python 面向对象基础(类、实例、方法、属性封装)
python是面向对象语言,一切皆对象. 面向过程: 变量和函数. “散落” 在文件的各个位置,甚至是不同文件中.看不出变量与函数的相关性,非常不利于维护,设计模式不清晰. 经常导致程序员,忘记某个变 ...
- 【转】修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 11:23:37 [Apache] Problem detected! 11:23:37 [Apache] ...
- jenkins搭建自动化部署平台(svn+tomcat重启)
原文链接:http://blog.csdn.net/zjs40/article/details/51818322 jenkins 自动化部署和集成代码的平台 可以将Git svn 上的代码 check ...
- Angular之模版引用变量
A template reference variable is often a reference to a DOM element within a template. It can also b ...
- 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理
前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...
- nodejs异步读数据库
以下代码不完美,但讲明了使用方法. 回调: function selectUser(callback) { var sql = "SELECT * FROM user"; conn ...