servlet是怎样工作的?初始化、session、共享变量、多线程

ServletContext

当servlet 容器(如tomcat)启动时,它会部署和加载所有的web应用,当一个web应用加载后,servlet容器会创建 一次ServletContext,并把它放到服务器的内存中。web应用的web.xml会被解析,其中的 , , 标签(或注解@WebServlet @WebFilter @WebListener)都会初始化一次,并保存到服务器的内存中。对于每一个初始化filter,通过FilterConfig可以invoker它的init()方法。

当一个servlet容器关闭后,它会卸载所有的web应用,调用所以初始化的servlet的filter的destroy方法,所有的ServletContext ,Servlet, Fitler,Listener实例都会被销毁。

当一个Servlet配置了或@WebServlet(loadOnStartup)的值大于0,它的init方法在启动时会被调用生成一个新的ServletConfig,(值1是第1个启动,值2是第2个起启动,以此类推)。如果多个servlet配置了相同的值,以它们在web.xml出现的顺序或@WebSerlet类加的顺序。如果没有配置load-on-startup,那么它的init方法直到有http请求第一次调用此servlet时,才会被调用。

HttpServletRequest和HttpServletResponse

servlet容器会作为一个web服务器,监听特定端口的HTTP请求,当一个客户端(如web浏览器)发送HTTP请求时,servlet容器会创建新的HttpServletRequest和HttpServletResponse实体,并发送给Filter链,最后到达Servlet实例。

在Fitler中,doFilter方法会被调用 ,当调用chain.doFilter(request,response)时,会调用下一个filter或serlvet(没有下一个filter时)。

这个request对象提供了所有访问HTTP请求信息的方法,如获取header和body。response对象用于定制响应,当Http response完成后,request和response对象会被回收再利用。

HttpSession

当一个客户端第一次访问webapp或者通过request.getSession第一次获取HttpSession时,servlet容器会创建一个HttpSession对象,保存在服务器内存中,Servlet容器同样会在Http响应的头部通过Set-Cookie设置Cookie,JESSIONID是session的名字,sessionID是值。

根据HTTP cookie的规范,浏览器在cookie有效期间,后续的请求需要把cookie发送回来,Servlet容器会对每一个进来的HTTP请求检查cookie,并绑定内存中的HttpSession。

HttpSession的生命周期定义在web.xml中的,默认是30分钟。过期后,servlet 容器会回收这个session,对于后续的请求创建新的session.

在客户端,session cookie会一直存活到浏览器停止运行前。

 

最后欢迎大家访问我的个人网站:1024s​​​​​​​

你可能感兴趣的:(servlet是怎样工作的?初始化、session、共享变量、多线程)