一、Servlet运行机制
Servlet是运行在Servlet容器中的服务器端的用来响应用户请求的服务器小程序,它的生命周期由Servlet容器负责管理。
Servlet在Servlet容器中,以单例模式存在,即:在Servlet生命周期中,Servlet容器只创建一个Servlet对象,所有的客户请求都使用这一个Servlet对象来响应。
当用户请求到达时,Servlet容器解析请求,检查内存中是否已存在用户要访问的Servlet对象;若存在,则直接使用该Servlet对象处理用户请求;若不存在,则加载Servlet,创建Servlet对象,并实例化、初始化,然后使用这个Servlet对象处理用户请求。
在Servlet整个生命周期中,只实例化和初始化一次,即:只有一个Servlet实例对象为客户请求提供服务。
Servlet以单例模式运行,即使有多个用户同时访问Servlet时,Servlet容器中也只有一个Servlet实例对象存在。Servlet容器通过Servlet对象调用service()服务方法时,采用多线程的方式使用Servlet对象。即:Servlet容器会为每一个用户请求创建一个线程,由线程调用Servlet的service()方法为用户请求提供服务。
在Servlet容器中,用一个线程池来管理使用Servlet对象的多个线程,线程池在初始化时,会创建一定数量的线程对象放在池子中,当需要时,直接获取线程对象并使用;使用后,线程对象归还线程池;以避免频繁创建线程、销毁线程对象,从而提高Servlet容器的性能。
下图描述了Servlet的请求与响应过程:客户机向WEB服务器发送请求,WEB服务器收到请求之后,转发给Servlet容器,Servlet容器创建HttpServletRequest和HttpServletResponse两个对象,分别封装请求数据和响应数据,并将它们传给线程池中分配的线程,该线程访问Servlet处理用户请求,处理完毕,将结果返回Servlet容器,线程归还线程池;最后,WEB服务器负责将响应结果发送回客户机。
二、Servlet生命周期
在Java中,任何对象都有生命周期。
Servlet生命周期是指Servlet实例创建到Servlet实例销毁的过程。按照功能的不同,大致可以将Servlet的生命周期分为三个阶段:Servlet实例创建与初始化阶段、运行阶段、销毁阶段。
在Servlet生命周期中,每个阶段用不同的方法,完成各自的任务。
初始化阶段:调用Servlet的构造器和init()方法进行实例化和初始化。
运行阶段:调用Servlet的service()方法处理客户请求。
销毁阶段:调用Servlet的destroy()方法结束Servlet的运行。
最后,Servlet对象由Java虚拟机JVM的垃圾回收器进行垃圾回收。
1、初始化阶段
Servlet实例是Servlet容器创建的,并且在整个Servlet生命周期中,只创建一个。
Servlet容器会根据Servlet在web.xml配置文件中的
如果
在整个Servlet生命周期中,Servlet对象只实例化和初始化一次,init()方法只被调用一次。
init()代码示例如下:
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
2、运行阶段
运行阶段是Servlet生命周期中最重要的一个阶段,在这个阶段,Servlet容器会反复调用Servlet的service()方法处理客户请求。
当Servlet容器接收到用户请求后,会为每一个用户请求创建代表请求的ServletRequest对象和代表响应的ServletResponse对象,在调用service()方法处理用户请求时,将它们作为参数传递给Servlet的service()方法。service()方法通过ServletRequest对象,获取客户请求信息;通过ServletResponse对象,生成响应结果。
在整个Servlet生命周期中,对于Servlet的每一次用户访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest对象和ServletResponse对象,即:service()方法在 Servlet的整个生命周期中,会被多次调用。
service()代码示例如下:
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html; charset=utf-8");
arg1.getWriter().println("这是通过实现Servlet接口创建的Servlet程序");
}
3、销毁阶段
当WEB服务器关闭(Servlet容器也就终止了)或WEB应用程序被移出Servlet容器时,Servlet会随着WEB应用程序的关闭而销毁。
Servlet容器调用Servlet的destroy()方法,销毁Servlet对象,释放Servlet对象占用的资源。
在整个Servlet生命周期中,Servlet对象只销毁一次,于是,destroy()方法只被Servlet容器调用一次。
特别地:Servlet对象一旦创建,就一直驻留在内存中等待客户的访问,直到WEB服务器关闭或WEB应用程序被移出Servlet容器时,Servlet对象才会被销毁。
destroy()代码示例如下:
public void destroy() {
// TODO Auto-generated method stub
}