【Java基础知识】Servlet学习之Servlet运行机制(五)

发布 : Java培训      来源:Java培训干货资料

2021-11-29 19:49:12

一、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配置文件中的参数值,或者@WebServlet注解中的loadOnStartup属性值,决定在哪个时候创建Servlet实例。

如果参数值或loadOnStartup属性值大于等于0,则Servlet容器在应用程序启动时,加载Servlet字节码文件,并调用Servlet的构造器和init()方法创建Servlet实例;否则,在客户第一次访问Servlet时,Servlet容器调用Servlet的构造器和init()方法创建Servlet实例。

在整个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

}

THE END  

声明:本站稿件版权均属中公教育优就业所有,未经许可不得擅自转载。

领取零基础自学IT资源

涉及方向有Java、Web前端、UI设计、软件测试、python等科目,内容包含学习路线、视频、源码等

点击申请领取资料

点击查看资料详情 

收起 


 相关推荐

问题解答专区
返回顶部