Servlet生命周期

目录

一、概述

(1)seriver的实现流程

(2)Servlet执行流程

(3)小结

 介绍完Servlet执行流程,那么问题来了

1.Servlet由谁创建?Servlet方法由谁调用?

2.服务器怎么知道Servlet中一定有service方法?

 二、生命周期

(1)实例化

(2)初始化 

(3)服务

(4)销毁

(5)小结


一、概述

         Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。

使用Servlet就可以实现,根据不同的登录用户(访问参数不同)在页面上动态显示不同内容。Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

1627234972853

(1)seriver的实现流程

下面我们来实现一个高效而简单的Servlet:

// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 设置响应类型:
        resp.setContentType("text/html");
        // 获取输出流:
        PrintWriter pw = resp.getWriter();
        // 写入响应:
        pw.write("<h1>Hello, world!</h1>");
        // 最后不要忘记flush强制输出:
        pw.flush();
    }
}

      一个Servlet总是继承自HttpServlet,然后覆写doGet()或doPost()方法。注意到doGet()方法传入了HttpServletRequest和HttpServletResponse两个对象,分别代表HTTP请求和响应。我们使用Servlet API时,并不直接与底层TCP交互,也不需要解析HTTP协议,因为HttpServletRequest和HttpServletResponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取PrintWriter,写入响应即可。

(2)Servlet执行流程

  

       浏览器发出http://localhost:8080/s/demo.do请求,从请求中可以解析出三部分内容,分别是localhost:8080、s、demo.do

  1. 根据localhost:8080可以找到要访问的Tomcat Web服务器

  2. 根据s可以找到部署在Tomcat服务器上的s项目

  3. 根据demo.do可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配

       找到ServletDemo这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法(注:Tomcat并没有main方法,如何实例化对象?—通过java反射的原理

(3)小结

 介绍完Servlet执行流程,那么问题来了。

1.Servlet由谁创建?Servlet方法由谁调用?

Servlet由web服务器创建,Servlet方法由web服务器调用(我们使用的web服务器常指tomcat)

2.服务器怎么知道Servlet中一定有service方法?

因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

 二、生命周期

生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程。

     在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX()方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:实例化、初始化、服务、销毁

(1)实例化

       实例化:根据Servlet请求的路径(例如:home.do),查找该Servlet的实例。如果实例不存在,则通过调用构造方法,完成Servlet实例的创建。 (  默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象)实例化一次

@WebServlet("/demo.do")
public class ServletDemo extends HttpServlet {

	public ServletDemo() {
		System.out.println("1.ServletDemo实例化被创建");
	}

}

(2)初始化 

    该子类在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

	@Override
	public void init() throws ServletException {
		System.out.println("1.ServletDemo实例被初始化");
	}

(3)服务

     通过该Servlet的实例,调用service()方法,如果子类没有重写该方法,则调用HttpServlet父类的service()方法,在父类的该方法中进行请求方式的判断,如果是GET请求,则调用doGet()方法;如果是POST请求,则调用doPost()方法;
如果子类重写doXXX()方法,则调用子类重写后的doXXX()方法;
如果子类没有重写doXXX()方法,则调用父类的doXXX()方法,在父类的方法实现中,返回一个405状态码的错误页面。

service方法在Servlet被访问的时候调用,每访问1次就调用1次

(4)销毁

     当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

	
	@Override
	public void destroy() {
		System.out.println("4.ServletDemo实例被销毁");
	}

那么在什么时候被销毁?

(1)关闭服务器(Stop)

(2)重启服务器

(5)小结

Servlet对象在什么时候被创建的?
    默认是第一次访问的时候被创建

Servlet生命周期中涉及到的三个方法,这三个方法是什么?什么时候被调用?调用几次?
涉及到三个方法,分别是 init()、service()、destroy()

init方法在Servlet对象被创建的时候执行,只执行1次

service方法在Servlet被访问的时候调用,每访问1次就调用1次

destroy方法在Servlet对象被销毁的时候调用,只执行1次
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值