zoukankan      html  css  js  c++  java
  • 9.14JavaWeb之Servlet生命周期

    9.14JavaWeb之Servlet生命周期

    什么是Servlet生命周期

    Servlet生命周期是指: Servlet 从创建到销毁的过程

    主要阶段:

    1. 初始化阶段--->init()

    2. 运行时阶段--->service()

    3. 销毁阶段--->destory()

    Servlet接口定义了三个方法:init()、service()、destory(),分别在Servlet生命周期的不同阶段被Servlet容器调用

    初始化阶段--->init()

    特点:

    只有完成了初始化,Servlet 才能处理来自客户端的请求

    Servlet初始化阶段步骤:

    • 加载和实例化 Servlet--->new一个对象;

    • 调用 init() 方法进行初始化。

    加载和实例化Servlet

    过程:

    • Servlet 容器负责加载和实例化 Servlet。

    • 容器启动或首次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。

    • 加载成功后,容器会通过反射对 Servlet 进行实例化--->加载失败会在前端界面上报错。

    注意:

    **Servlet 容器是通过 Java 的反射 API 来创建 Servlet 实例的,需要调用 Servlet 的默认构造方法(default constructor,即不带参数的构造方法),所以在编写 Servlet 类时,不能只提供一个带参数的构造方法。**
    调用init()方法进行初始化

    特点:

    1. 由Servlet容器调用init()方法对初始化Servlet实例

    2. 在 Servlet 的整个生命周期内,init() 方法只能被调用一次。

    3. Servlet 实例通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。

    目的:

    让 Servlet 实例在处理请求之前完成一些初始化工作,例如建立数据库连接,获取配置信息等。

    运行时阶段

    过程:

    1. Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象

    2. 将它们以参数的形式传入 service() 方法内

    3. 调用该方法对请求进行处理

    注意:

    执行 service() 方法前,init() 方法必须已成功执行。

    Service方法调用的特点:

    1. ServletRequest对象获取客户端的相关信息和请求信息

    2. 处理请求对象的请求信息

    3. ServletResponse对象将响应信息进行包装,返回给客户端

    4. 响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。

    需要注意的特点:

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

    销毁阶段

    对象销毁过程:

    当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调用 destory() 方法,释放该实例使用的资源,例如:关闭数据库连接,关闭文件的输入流和输出流等,随后该实例被 Java 的垃圾收集器所回收。

    Servlet生命周期执行流程

    注意:

    当初始化完成后,Servlet 容器会将该实例保存在内存中--->当实例过多的时候会对内存造成压力

    根据Servlet请求执行流程图创建一个实例Demo

    需求:

    • 初始化

    • 运行时--->Service--->get和post方法

    • 销毁对象--->destory方法

    package ServletPractice;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;

    /**
    * 使用注解控制
    * 完成Servlet容器的初始化、实例化、运行时方法调用、对象销毁等过程
    * @since JDk 1.8
    * @date 2021/09/14
    * @author Lucifer
    */
    @WebServlet("/MyServlet")
    public class MyServletDemoNo5 extends HttpServlet {
       //定义一些属性方便再浏览器观察
       private final static long serialVersionUID = 1L;
       private int initCount = 0;
       private int httpCount = 0;
       private int destroyCounty = 0;

       //初始化方法
       @Override
       public void init() throws ServletException {
           //计数器增加,并且向控制台输出
           initCount++;
           super.init();
           System.out.println("init方法调用次数:" + initCount);
      }

       //创建运行时的get和post方法
       @Override
       public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //http次数增加
           httpCount++;
           //向控制台输出
           System.out.println("Get方法调用次数:" + httpCount);
           //设置字符集
           response.setContentType("text/html;charset=UTF-8");
           //创建PrintWriter的引用向控制台写内容
           PrintWriter writer = response.getWriter();
           //向页面输出
           writer.write("初始化次数:" + initCount + "<br/>" + "处理请求次数:" + httpCount + "<br/>" + "销毁次数:" + destroyCounty);
           writer.close();
      }

       //post
       @Override
       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      }

       //创建destory方法
       @Override
       public void destroy(){
           destroyCounty++;
           System.out.println("**********************************destroy方法:" + destroyCounty + "*******************************");
      }
    }

     

    It's a lonely road!!!
  • 相关阅读:
    valgrind使用手册
    [转]windows server 2008 多用户远程登录设置
    ios控件学习 IB实现
    把java变成exe
    python 函数 值传递
    java 经验
    python list 去除重复
    xcode 4.2 基础
    mac 使用
    object c 基础语法
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15269307.html
Copyright © 2011-2022 走看看