Servlet 生命周期实现形式
- 实例和初始化机会
- 就绪 / 调用 / 服务阶段
- 销毁机会
案例实操
Servlet 的生命周期
Servlet 没有 main() 办法,不能独立运行,它的运行齐全由 Servlet 引擎来管制和调度。所谓生命周期,指的是 servlet 容器何时创立 servlet 实例、何时调用其办法进行申请的解决、并何时销毁其实例的整个过程。(此处探讨默认的生命周期)
- 实例和初始化机会
当申请达到容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创立实例并进行初始化。
- 就绪 / 调用 / 服务阶段
有申请达到容器,容器调用 servlet 对象的 service() 办法,解决申请的办法在整个生命周期中能够被屡次调用;
HttpServlet 的 service() 办法,会根据申请形式来调用 doGet() 或者 doPost() 办法。然而,这两个 do 办法默认状况下,会抛出异样,须要子类去 override。
- 销毁机会
当容器敞开时(应用程序进行时),会将程序中的 Servlet 实例进行销毁。
上述的生命周期能够通过 Servlet 中的生命周期办法来察看。在 Servlet 中有三个生命周期办法,不禁用户手动调用,而是在特定的机会由容器主动调用,察看这三个生命周期办法即可察看到 Servlet 的生命周期。
init 办法,在 Servlet 实例创立之后执行(证实该 Servlet 有实例创立了)
public void init(ServletConfig config) throws ServletException {
System.out.println(“ 有实例创立了 ”);
}
service 办法,每次有申请达到某个 Servlet 办法时执行,用来解决申请(证实该 Servlet 进行服务了)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(“ 服务调用了 ”);
}
destroy 办法,Servlet 实例销毁时执行(证实该 Servlet 的实例被销毁了)
public void destroy() {
System.out.println(“ 有实例被销毁了 ”);
}
Servlet 的生命周期,简略的概括就分为四步:servlet 类加载→实例化→服务→销毁。上面咱们形容一下 Tomcat 与 Servlet 是如何工作的,看看上面的时序图:
1、Web Client 向 Servlet 容器(Tomcat)收回 Http 申请
2、Servlet 容器接管 Web Client 的申请
3、Servlet 容器创立一个 HttpRequest 对象,将 Web Client 申请的信息封装到这个对象中
4、Servlet 容器创立一个 HttpResponse 对象
5、Servlet 容器调用 HttpServlet 对象的 service 办法,把 HttpRequest 对象与 HttpResponse 对象作为参数,传给 HttpServlet 对象
6、HttpServlet 调用 HttpRequest 对象的无关办法,获取 Http 申请信息
7、HttpServlet 调用 HttpResponse 对象的无关办法,生成响应数据
8、Servlet 容器把 HttpServlet 的响应后果传给 Web Client
扩大
Servlet 的配置
Servlet 除了配置根本的访问信息,还能够配置初始化参数,自启动等,并且 一个 Servlet 能够配置多个拜访门路,还能够应用通配符“*”。
根本配置
<servlet>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<servlet-class>com.xxx.web.HelloWeb</servlet-class><!– servlet 对应的资源门路 –>
</servlet>
<servlet-mapping>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<url-pattern>/helloweb</url-pattern><!– 给浏览器看的,对外拜访门路 –>
<url-pattern>/*</url-pattern>
</servlet-mapping>
初始化参数
<servlet>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<servlet-class>com.xxx.web.HelloWeb</servlet-class><!– servlet 对应的资源门路 –>
<!– 初始化参数 –>
<init-param>
<param-name>param1</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<url-pattern>/helloweb</url-pattern><!– 给浏览器看的,对外拜访门路 –>
<url-pattern>/*</url-pattern>
</servlet-mapping>
自启动
<servlet>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<servlet-class>com.xxx.web.HelloWeb</servlet-class><!– servlet 对应的资源门路 –>
<!– 初始化参数 –>
<init-param>
<param-name>param1</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
<!– 自启动 –>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>helloweb</servlet-name><!– 给服务器看的 –>
<url-pattern>/helloweb</url-pattern><!– 给浏览器看的,对外拜访门路 –>
<url-pattern>/*</url-pattern>
</servlet-mapping>
servlet-name:Servlet 对象的名称
servlet-class:创立 Servlet 对象所要调用的类
param-name:参数名称
param-value:参数值
load-on-startup:Servlet 容器启动时加载 Servlet 对象的程序
servlet-mapping/servlet-name:要与 servlet 中的 servlet-name 配置的内容对应
url-pattern:客户拜访的 Servlet 的绝对 URL 门路
阐明:url-pattern 能够配多个(一个 servlet 能够通过多个 url-pattern 拜访 )当多个 servlet 配置成了同一个 url-pattern,报错 java.lang.reflect.InvocationTargetExceptionion;通配符“*”只能放在最后面或最初面,不能放两头且不能独自存在(以 / 宰割的,不能和单词组成整体)。 越准确越优先。惯例配置即可。