Servlet启动运行顺序

    1. 1、web项目执行属性

      1. 启动web项目后,web容器首先回去找web.xml文件,读取这个文件。

      2. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文。

      3. 容器将 转换为键值对,并交给 servletContext(),<context-pram>使用上下文初始化参数

      4. 容器创建 中的类实例,创建监听器。

      5. 容器加载filter,创建过滤器, 要注意对应的filter-mapping一定要放在filter的后面。依赖servlet。Servlet过滤器和Servlet十分相似,但具有拦截浏览器请求的功能。创建过滤器链,满足业务需求。

      6. 拦截器。

      7. 容器加载servlet,加载顺序按照 Load-on-startup 来执行,<load-on-startup>1</load-on-startup><servlet>

因此它的完整加载顺序就是 :ServletContext -> context-param -> listener-> filter -> servlet

不过有一点需要注意的是: spring容器的加载要在servlet之后,因此在有些过滤器当中需要提前用到spring bean的时候,就需要改成 Listener 的方式

org.springframework.web.context.ContextLoaderListener

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

容器监听器ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

要求每次访问action都无需加载新的xml文件,利用框架的监听器实现只在服务器启动时加载一次xml配置,用于提高性能。

2.servlet的运行过程:

1.浏览器发出请求,被web容器获取到 
2.Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。 
3.装载并创建该Servlet的一个实例对象,调用Servlet实例对象的init()方法。 
4.创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。 
5.WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

一般情况,servlet是在被请求的时候才去创建的,但是当添加时,就会在初始化的时候创建它,利用这点特性,我们可以初始化创建数据库等等。

使用servlet时,一般都是继承httpServlet,然后分别实现doGet或者doPost方法,但是在这里面要注意的是,这servlet并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话,就有可能引发线程安全问题,

servlet的config对象:

ServletConfig是Servlet的一个配置对象. 每一个servlet都有一个对应的ServletCofnig。
ServletConfig是由web服务器创建的,它通过Servlet的init方法传递到了Sevlet中.

1.可以获取Servlet的名称   getServletName();---web.xml文件中的<servlet-name>的值.
2.可以获取初始化参数,获取application内容。
    getInitParameter(String name);   根据name获取value,(等于this.getServletConfig().getInitParameter(name))
    getIniteParameterNames();  获取所有的name值,它返回的是一个Enumeration.

3.可以获取ServletContext上下文对象,即application对象。

    getServletContext().getInitParameter("param0") = this.getServletConfig().getServletContext().

4.在Servlet中要获取ServletConfig对象,只需要直接调用getServletConfig()就可以。(前三个是ServletConfig方法,后一个是Servlet方法包含,init.service,destory)

5.继承关系

HttpServlet extends GenericServlet,

GenericServlet implements Servlet, ServletConfig, Serializable

Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。

  1、初始化阶段  调用init()方法。(单线程)

  2、响应客户请求阶段。调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法(多线程)

  3、终止阶段  调用destroy()方法

3.异常情况

一旦ServletException抛出,Web服务器不会将客户端请求交给该Servlet实例来处理,而是报告初始化失败异常信息给客户端,该Servlet实例将被从内存中销毁。

如果继承了HttpServlet没有实现任何的doXxx方法或者重新service方法。则会抛出一个异常

 
原文地址:https://www.cnblogs.com/shuchen007/p/9246189.html