Servlet启动运行顺序
-
1、web项目执行属性
-
启动web项目后,web容器首先回去找web.xml文件,读取这个文件。
-
容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文。
-
容器将 转换为键值对,并交给 servletContext(),<context-pram>使用上下文初始化参数
-
容器创建 中的类实例,创建监听器。
-
容器加载filter,创建过滤器, 要注意对应的filter-mapping一定要放在filter的后面。依赖servlet。Servlet过滤器和Servlet十分相似,但具有拦截浏览器请求的功能。创建过滤器链,满足业务需求。
-
拦截器。
-
容器加载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方法。则会抛出一个异常