您的位置:首页 > 其它

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等服务器的源码实现,楼主还是菜鸟一枚,也正在努力中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: