• Servlet生命周期


    Servlet简介

    Servlet(Server Applet是Java Servlet的简称,翻译过来就是服务程序。是由sun公司提供的一门用于开发动态Web资源的技术。简单的讲,Servlet就是运行在服务器上的一个小程序,用来处理服务器接收到的请求。

    比如一般的网页程序,是由我们通过浏览器来访问实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收到请求,并对浏览器的请求做出相应的处理,这就是我们熟悉的B/S模型(浏览器—服务器模型)。而Servlet就是对请求做出处理的组件,运行于支持java的应用服务器中。

    Servlet从狭义上说白了就是个接口,从广义上说就是实现了这个接口的所有的子类。

    附加:我们打开项目目录下的JSP文件查看其源码,可以发现JSP底层也是实现了Servlet接口的,所以JSP它本质上就是一个Servlet。
     

    Servlet 生命周期

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程。整个生命周期包括:实例化、初始化、服务、销毁。

    1. 实例化

    在B/S模式中,当用户通过浏览器输入一个路径,这个路径对应的Servlet被调用时,对应的Servlet就会被Servlet容器实例化,在此Servlet生命周期中,无论被访问多少次,仅被实例化一次。Servlet容器是通过Java反射技术调用Servlet的无参构造方法进行实例化的,所以我们在编写Servlet类的时候不允许提供带参数的构造方法。

    2. 初始化

    在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求前可以完成一些初始化的工作,例如,建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只能被调用一次。init()方法有一个类型为ServletConfig的参数,Servlet容器通过这个参数向Servlet传递配置信息。Servlet使用ServletConfig对象从Web应用程序的配置信息中获取以名-值对形式提供的初始化参数。另外,在Servlet中,还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象,使用该对象,Servlet可以和它的Servlet容器进行通信。无论有多少客户机访问Servlet,都不会重复执行init()。

    3.服务

    service()是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。要注意的是,在service()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象(类型为ServletRequest)和一个用于对客户端进行响应的响应对象(类型为ServletResponse)作为参数传递给service()方法。在service()方法中,Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。

    下面是几种常见的请求方式:

    • 如果客户端发送GET请求,容器调用Servlet的doGet方法处理并响应请求
    •  如果客户端发送POST请求,容器调用Servlet的doPost方法处理并响应请求
    •  或者统一用service()方法处理来响应用户请求

    4. 销毁

    当容器决定销毁Servlet时,先调用Servlet的destroy()方法,通常在关闭web应用之前销毁Servlet。 destroy()方法仅执行一次,在服务器端停止时执行该方法。当容器检测到一个Servlet对象应该从服务中被移除的时候,容器会调用该对象的destroy()方法,以便让Servlet对象可以释放它所使用的资源,保存数据到持久存储设备中,例如,将内存中的数据保存到数据库中,关闭数据库的连接等。当需要释放内存或者容器关闭时,容器就会调用Servlet对象的destroy()方法。一旦Servlet对象的destroy()方法被调用,容器不会再把其他的请求发送给该对象。如果需要该Servlet再次为客户端服务,容器将会重新产生一个Servlet对象来处理客户端的请求。在destroy()方法调用之后,容器会释放这个Servlet对象,在随后的时间内,该对象会被Java的垃圾收集器所回收。

    Servlet生命周期代码实现

    1. import java.io.IOException;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. @WebServlet("/home.do")//所有的请求路径都必须以'/'开头
    8. //注解配置servlet的请求路径与xml中的映射相同
    9. public class HomeServlet extends HttpServlet{
    10. //1实例化对象
    11. //构造方法
    12. public HomeServlet() {
    13. super();
    14. System.out.println("1.HomeServlet对象的创建!");
    15. }
    16. //2初始化
    17. //重写HttpServlet父类的init()方法
    18. //通过实例自动调用init()方法
    19. @Override
    20. public void init() throws ServletException {
    21. // TODO Auto-generated method stub
    22. System.out.println("2.HomeServlet对象进行初始化!");
    23. super.init();
    24. }
    25. //3服务
    26. //通过实例调用HttpServlet父类的service()方法
    27. //service()方法中,会根据请求方式(get或post)的不同
    28. //调用子类重写的doGet()或doPost()
    29. //如果子类没有重写,则响应405
    30. //根据请求方式(get或post)的不同,需调用不同的请求方法
    31. @Override
    32. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    33. // TODO Auto-generated method stub
    34. System.out.println("被请求到了!");
    35. }
    36. //4销毁
    37. @Override
    38. public void destroy() {
    39. // TODO Auto-generated method stub
    40. super.destroy();
    41. System.out.println("4.HomeServlet实例被销毁!");
    42. }
    43. }

    当通过浏览器对HomeServlet发送多次请求时(这里是5次),可以看到控制台上:

             当我们第一次对HomeServlet发送请求时(此时服务器已启动),HomeServlet生命周期正式开始,Servlet容器首先会对该Servlet进行实例化,接着会对其进行初始化,初始化后便会进入服务阶段,通过Servlet的service()方法进行对相对应的请求做出响应。当第二次请求时,不会在进行初始化和实例化,说明该生命周期还没有结束,当重启服务器时,服务器会调用service()方法,对HomeServlet进行销毁,这时HomeServlet生命周期才正式结束。

  • 相关阅读:
    两个整数求和(链表)
    通过webpack创建并打包js库到npm仓库
    H5新Api | requestIdleCallback - requestAnimationFram
    APP上架需要的准备和流程
    如何解决NSIS 2G文件的限制
    【虚拟机】网卡不见了,失效了怎么办
    手写小程序摇树工具(二)——遍历js文件
    [ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形
    新手请进,来看看Java if else分支结构精讲
    哈工大李治军老师操作系统笔记【5】:操作系统的历史(Learning OS Concepts By Coding Them !)
  • 原文地址:https://blog.csdn.net/qq_51956240/article/details/126447660