Servlet生命周期探寻
2015-06-27 23:09
162 查看
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..."); } @Override public void destroy() { System.out.println("TestServlet Destory..."); } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub System.out.println("TestServlet init..."); } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub System.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等服务器的源码实现,楼主还是菜鸟一枚,也正在努力中。
相关文章推荐
- Contains Duplicate
- Unity 自定义字体 Custom Font 原理 二
- 基于 WiFi ( Wireless Fidelity) 的室内定位技术
- Ubuntu12.04下eclipse提示框黑色背景色的修改方法
- CRC32 of Ether FCS with STM32
- java中OutofMemoryError和JVM内存结构
- 字符编码
- 字符编码
- ios 取消键盘响应
- JavaScript语法 (顺序+判断+选择+循环+其他=五种语句)演示
- ucore操作系统实验lab4 -- 内核线程管理
- 题目1152:点菜问题
- Contains Duplicate II
- 用make编译多个.c文件
- Web 开发的 JavaScript 框架资料收集(15款)
- Java文件 File练习-递归删除带内容的目录
- [Java]学习笔记,随笔【四】
- [leetcode] 95.Unique Binary Search Trees II
- 2299 Poj Ultra-QuickSort(归并排序求逆序数)
- leetcode 刷题目,总结,记录,备忘 13