Servlet初始化与异步支持

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

时间: 2024-10-31 15:38:52

Servlet初始化与异步支持的相关文章

Servlet初始化相关问题,以及Spring容器初始化

一.Servlet初始化 ①Servlet在初始化的时候,是通过init(ServletConfig config) 或 init() 来执行的. ServletConfig 是一个接口,它怎样传递给他一格对象来进行初始化呢?其实,是这个对象是由 servlet 容器来实例化的,由容器产生一格 ServletConfig 的实现类的对象,然后传递给 Servlet ②我们有些时候可能在 Servlet 初始化时给它一些固定的配置参数,那么这些参数是怎样传递到 Servlet 呢?其实,我们在 w

springmvc中配置servlet初始化类

<bean  id="InitStart" lazy-init="false" init-method="InitSystem" class="my.spring.uitl.InitStart"></bean> 配置在springmvc的配置文件中 只要项目启动,就会默认执行这个类的这个方法 相比静态类代码块的好处, 有点在tomcat启动时就会调用如果有错立即报错,静态代码块,调用时才会报错 作用 可

Servlet初始化、运行、销毁全部过程

Servlet的生命周期是由servlet的容器来控制的.分为3个阶段:初始化阶段.运行阶段.销毁阶段. 初始化阶段: 初始化阶段步骤: Ø  Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中. Ø  Servlet容器创建servletConfig对象.servletConfig对象包含了servlet的初始化配置信息.此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联. Ø  Servlet容

javaee学习-servlet初始化参数

1.需要定义ServletConfig对象来接收servlet配置的初始化参数. 2.当servlet配置了初始化参数后,web容器在创建servlet实例对象时, 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet.进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息. 3.注意:获取servlet初始值(需要在init()方法中初始化)//注意,这里必

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

Listener.Filter.Servlet都有一个初始化的过程,对应的方法分别为: contextInitialized(ServletContextEvent arg0); // Listener init(FilterConfig filterConfig); // Filter init(ServletConfig config); // Servlet 那么它们的初始化顺序是什么呢? Listener > Filter > Servlet TestServlet.java: pac

Servlet初始化及处理HTTP请求

上一篇详细介绍了与Servlet相关的几个核心的接口和类,当我们自己写Servlet类时,一般需要继承HttpServlet类,实现init().doGet().doPost()等方法.当我们写好Servlet类时,它在什么时候被初始化(init())?什么时候执行doGet().doPost()等方法?本篇重点介绍这两个问题. 1.Servlet初始化         之前的一篇<web.xml文件配置详解>中已经说过,我们自己写的Servlet类需要配置在<servlet-class

ajax 异步 通信 小例子 servlet与 jsp异步

get  请求参数通过 url那里写进去,然后send(null) html文件和 servlet进行通信 通过ajax 进行通信 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="

java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)

第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: 1 package com.testing.mysql; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 6 public class ConnectMysql { 7 //设置连接的成员变量 8 public Connection

web.xml中servlet初始化参数的设置

<context-param><param-name>param1</param-name><param-value>value1</param-value></context-param><context-param><param-name>param2</param-name><param-value>value2</param-value></context-pa