Servlet的生命周期

一、什么是Servlet?

        Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

        狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议Web服务器。

二、Servlet的实现过程

        1.由客户端向服务器发送一个请求

        2.再由服务器将请求信息发送到Servlet

        3.Servlet生成响应的内容发送给服务器

        4.最后由服务器将响应内容发送给客户端

三、Servlet的生命周期

        在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX()方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。

        整个生命周期包括:实例化、初始化、服务、销毁。

3.1加载和实例化

        Servlet 容器负责加载和实例化 Servlet。当容器启动或首次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。加载成功后,容器会通过反射对 Servlet 进行实例化,而反射的本质是通过调用它的构造方法(无参)。

3.2初始化

        在Servlet实例化之后,容器会通过重写HttpServlet父类的init()方法或者通过实例自动调用init()方法去初始化这个对象。而初始化的目的是为了让Servlet实例在处理请求之前完成一些初始化的工作,例如:建立数据库的连接、获取配置信息等。

        在整个Servlet的生命周期内,init()方法只能被调用一次。初始化期间,Servlet 实例可以通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。

3.3服务

        Servlet容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。在执行 service() 方法前,init() 方法必须已成功执行。

        在 service() 方法中,Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。        

        在 Servlet 的整个生命周期内,对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象。即 service() 方法在 Servlet 的整个生命周期中会被调用多次。

3.4销毁

        当 Servlet 容器关闭、重启时,就表示Servlet的生命周期结束,容器就会调用 destory() 方法,释放该实例使用的资源,随后该实例就会被 Java 的垃圾收集器所回收。

四、Servlet生命周期的执行流程

五、实例展示 

package com.zwd.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/home.do")
public class HomeServlet extends HttpServlet{
	
	// 1.实例化
	// 构造方法
	public HomeServlet() {
		System.out.println("1.HomeServlet实例被创建");
	}
	
	// 2.初始化
	// 重写HttpServlet父类的init()方法
	// 通过实例自动调用init()方法
	@Override
	public void init() throws ServletException {
		System.out.println("2.HomeServlet实例初始化");
	}
	
	// 3.服务
	// 通过实例调用HttpServlet父类的service()方法
	// service()方法中,会根据请求方式的不同(get或post方法)
	// 调用子类重写的doGet()或doPost()
	// 如果子类没有重写,则响应405
	
	// 根据请求方式的不同,需要调用不同的请求方法
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("HomeServlet被请求到了!");
		String method = req.getMethod();
		System.out.println("请求方式:" + method);
		
		System.out.println(req.getRemoteHost());
	}
	
	// 4.销毁
	@Override
	public void destroy() {
		System.out.println("4.HomeServlet实例被销毁");
	}
	
}

 在进行多次请求之后,关闭服务器:

         可以看到,每当服务器启动的时候,会发起对home.do的请求时,代表一个Servlet生命周期的开始,然后完成实例化、初始化和doGet()方法的调用,在当其进行第二次访问时,就不会再进行实例化和初始化,而当服务器关闭时,就会调用destory(),完成对HomeServlet实例的销毁。如果再次开启服务器对home.do发起请求,就会创建并实例化一个新的HomeServlet实例对象,开始一个新Servlet的生命周期。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值