Servlet生命周期探寻
来源:互联网 发布:vb.net get set 编辑:程序博客网 时间:2024/06/06 04:23
Servlet的生命周期:
首先创建一个原生的Servlet,实现Servlet接口的TestServlet,共有5个方法void init(ServletConfig sc),void destory(),ServletConfig getServletConfig(),String getServletInfo()
,void service(ServletRequest servletRequest,ServletResponse response),为了方便测试,我们添加一个Servlet空参构造器,来查看Servlet什么时候被构造。其中真正在调用Servlet是被调用的是构造器,init(),service(),当服务器被关闭前调用destory方法。我们可以测试一下
package com.servlet.test;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class TestServlet implements Servlet{public TestServlet() {System.out.println("TestServlet Constructor...");}@Overridepublic void destroy() {System.out.println("TestServlet Destory...");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubreturn null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubreturn null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stub System.out.println("TestServlet init...");}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("TestServlet Service...");}}其中web.xml如下配置:
<servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.servlet.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>在第一次发送请求时会有如下结果
TestServlet Constructor...
TestServlet init...
TestServlet Service...
然后没发送一次请求会调用一次Service方法,不会待用构造器,从这里可以看出Servlet在服务器端可能是单例的。
如果配置文件做如下修改
<servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.servlet.test.TestServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>则会在启动服务器的时候调动构造器,init方法
在发送请求时才会调用Service()方法。
在关闭服务器前调用destory方法。
所以可得知创建Servlet对象的时机:
- Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。
- 在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。
- Servlet Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。
另外说一句题外话,Servlet容器是通过web.xml中的全类名反射创建实例的,如果在TestServlet中的空参构造修改有有参数的构造器,在第一次初始化Servlet是会发生InstantiationException异常,实例化异常。如要要进一步理解Servlet如何被创建则需要查看Tomcat等服务器的源码实现,楼主还是菜鸟一枚,也正在努力中。
- Servlet生命周期探寻
- servlet生命周期
- Servlet 生命周期
- Servlet生命周期
- servlet生命周期
- Servlet生命周期
- Servlet生命周期
- Servlet生命周期
- servlet生命周期
- servlet生命周期!
- Servlet生命周期
- Servlet生命周期
- Servlet生命周期
- servlet生命周期
- Servlet生命周期
- Servlet生命周期
- servlet生命周期
- servlet生命周期
- 机器视觉学习系列四:身份证识别
- Ubuntu12.04下eclipse提示框黑色背景色的修改方法
- Unity 自定义字体 Custom Font 原理 二
- ASP.NET 5 简介
- 【Android Studio初探】快捷键大全与常用设置
- Servlet生命周期探寻
- 继承
- Java文件 File练习-建立一个java文件列表文件
- android:ellipsize的使用
- python的类变量和成员变量用法
- 新手学JAVA(八)----走进JDBC
- Dynamic Partial Reconfiguration 2 DPR Modular Generation
- 常用的设计模式
- 原创实用代码(二)