Shared libraries(共享库) / runtimes pluggability(运行时插件能力)

1、Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现
2、提供ServletContainerInitializer的实现类;
必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer
文件的内容就是ServletContainerInitializer实现类的全类名;

总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面
META-INF/services/javax.servlet.ServletContainerInitializer
指定的实现类,启动并运行这个实现类的方法;传入感兴趣的类型;
ServletContainerInitializer;
@HandlesTypes;

/容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类,子接口等)传递过来;
//传入感兴趣的类型;

@HandlesTypes(value={HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {/**
* 应用启动的时候,会运行onStartup方法;
*
* Set<Class<?>> arg0:感兴趣的类型的所有子类型;
* ServletContext arg1:代表当前Web应用的ServletContext;一个Web应用一个ServletContext;
*
* 1)、使用ServletContext注册Web组件(Servlet、Filter、Listener)
* 2)、使用编码的方式,在项目启动的时候给ServletContext里面添加组件;
* 必须在项目启动的时候来添加;
* 1)、ServletContainerInitializer得到的ServletContext;
* 2)、ServletContextListener得到的ServletContext;
*/
@Override
public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException {
// TODO Auto-generated method stub
System.out.println("感兴趣的类型:");
for (Class<?> claz : arg0) {
System.out.println(claz);
}//注册组件 ServletRegistration
ServletRegistration.Dynamic servlet = sc.addServlet("userServlet", new UserServlet());
//配置servlet的映射信息
servlet.addMapping("/user");//注册Listener
sc.addListener(UserListener.class);//注册Filter FilterRegistration
FilterRegistration.Dynamic filter = sc.addFilter("userFilter", UserFilter.class);
//配置Filter的映射信息
filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");}}

2.Servlet处理异步请求
1> 标注支持异步方式 asyncSupported=true
2> AsyncContext HttpRequest.startAsync();
3> asyncContext.start({线程{asyncContext.complete(); req.getAsyncContext().getResponse().getWriter().write()}});

@WebServlet(value="/async",asyncSupported=true)
public class HelloAsyncServlet extends HttpServlet {@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("主线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());AsyncContext startAsync = req.startAsync();startAsync.start(new Runnable() {
@Override
public void run() {
try {
System.out.println("副线程开始。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());
service();
startAsync.complete();AsyncContext asyncContext = req.getAsyncContext();
//4、获取响应
ServletResponse response = asyncContext.getResponse();
response.getWriter().write("hello async...");
System.out.println("副线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());
} catch (Exception e) {
}
}
});
System.out.println("主线程结束。。。"+Thread.currentThread()+"==>"+System.currentTimeMillis());
}public void service() throws Exception{
System.out.println(Thread.currentThread()+" service handler");
Thread.sleep(10000);
}
}

转载于:https://www.cnblogs.com/htkj/p/10100434.html

Servlet初始化与异步支持相关推荐

  1. JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持

    JAVA Web Servlet中的异步处理 (2) – Servlet3.1中的Non-blocking IO支持 在servlet 3.1中,新增了non-blocking IO支持. 在serv ...

  2. JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持

    JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...

  3. Servlet 3的异步Servlet功能

    在深入了解什么是异步Servlet之前,让我们尝试了解为什么需要它. 假设我们有一个Servlet,处理时间很长,如下所示. LongRunningServlet.java package com.j ...

  4. servlet 3.0异步_Servlet 3.0异步处理可将服务器吞吐量提高十倍

    servlet 3.0异步 Servlet是Java中处理服务器端逻辑的主要组件,新的3.0规范引入了一些非常有趣的功能,其中异步处理是最重要的功能之一. 可以利用异步处理来开发高度可伸缩的Web应用 ...

  5. 在Grails 2.0中使用Servlet 3.0异步功能

    上周,我与某人谈论了Grails 2中对Servlet 3.0异步功能的新支持,并意识到我对可用功能并不了解. 所以我想我会尝试一下并分享一些例子. 该文档对这个主题有些了解,因此首先介绍一些背景信息 ...

  6. Servlet 3.0异步处理可将服务器吞吐量提高十倍

    Servlet是Java中处理服务器端逻辑的主要组件,新的3.0规范引入了一些非常有趣的功能,其中异步处理是最重要的功能之一. 可以利用异步处理来开发高度可伸缩的Web应用程序. 使用此功能可以有效地 ...

  7. 浅谈Listener、Filter、Servlet初始化顺序

    2019独角兽企业重金招聘Python工程师标准>>> Listener.Filter.Servlet都有一个初始化的过程,对应的方法分别为: contextInitialized( ...

  8. servlet 变量 及servlet 初始化 和销毁 ThreadLocal

    servlet static变量是全局变量, 所有连接到服务器的用户共享一个变量,如 初始化时 static int num=1; 用户登录一次 num++;  张三 登录后 num++,此时num= ...

  9. Django 3.1 发布,异步支持增强

    Django 3.1 已经发布.此版本亮点包括: 进一步支持异步视图与异步中间件. 要开始使用异步视图,需要声明一个视图 :async def async def my_view(request):a ...

最新文章

  1. CentOS 7使用systemctl如何补全服务名称
  2. 行为模式之Template Method模式
  3. java语言适合编写什么_01--Java语言概述与开发环境 最适合入门的Java教程
  4. ios模拟器装ipa包_在iOS开发的时候如何在模拟器中安装APP
  5. 在react-router中进行代码拆分
  6. 玩转 Tomcat 配置必备的 10 个小技巧!
  7. 机器学习入门——图解支持向量机
  8. 读《Unity 5.x 游戏开发指南》
  9. c语言频谱图,c-实时绘制频谱图?
  10. Python学习笔记4---类和对象
  11. 如何解决上班下午3:00发困的事情
  12. 【附源码】计算机毕业设计SSM汽车维修服务系统
  13. 非正式协议和正式协议的区别
  14. 利用python制作小游戏
  15. 引用thymeleaf模板,js中大于小于等符号转义异常问题
  16. 未来土地利用模拟FLUS模型
  17. Android高级工程师面试实战,您会挂么?
  18. Python Enclosing作用域、闭包、装饰器话聊(转)
  19. 微服务——REST(Representational State Transfer,表述性状态转移)
  20. 五、测试用例和设计方法

热门文章

  1. CentOS 7 网页加载速度慢的解决办法
  2. JavaScript机器学习之线性回归
  3. [20150601]模拟ora-00600[2608]错误.txt
  4. tpopela/vips_java
  5. svn 源码版本控制使用体会
  6. 如何使对话框中接收到WM_CHAR消息(Windows编程)
  7. 大型网站技术架构(八)网站的安全架构
  8. 如何使用Junit进行单元测试
  9. 219. Contains Duplicate II
  10. 修改mysql表结构语句