前言:无论是struts1、2还是spring mvc,我们都不能绕开Servlet,我准备用一个专题来深入了解servlet和剖析servlet的运行机制。
首先我们要讲到的是servlet的生命周期,servlet生命周期是在面试中被经常问到的一个内容。所以我们经常会遇到类似的问题,现在在这里做一个标准答案。
1.被创建:执行init方法,只执行一次
1.1Servlet什么时候被创建?
--第一次调用的时候就会被创建;
--可以通过配置改变被创建的时间;
2.提供服务:执行service方法,执行多次
3.被销毁:当Servlet服务器正常关闭时,执行destroy方法,只执行一次
上面遗留了一个问题,那就是Servlet的创建时间可以通过配置,网络上有很多关于创建时间的配置时关于 load-on-startup的,配置如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>webXml</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>S1</servlet-name>
<servlet-class>com.web.servlet.S1</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>S1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
其中的 <load-on-startup>1</load-on-startup>节点,代表的就是加载的顺序。配置了这个节点会导致项目在启动的时候就会初始化servlet。
其次还有另外一个配置也会导致项目加载的时候就会初始化servlet,那就是 <url-pattern>/s1</url-pattern>,将其改成 <url-pattern>/*</url-pattern>会导致servlet被提前加载(tomcat启动的时候)
如果有两个Servlet,一个配置了 <load-on-startup>1</load-on-startup>,另外一个配置了拦截路径规则<url-pattern>/*</url-pattern>时,先创建配置了<load-on-startup>1</load-on-startup>的节点。
网友评论