未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java web 开发

    • Web笔记(一) Web 简介与开发环境搭建
    • Web笔记(二)Tomcat 使用总结
    • Web笔记(三)Servlet 的类与接口API
    • Web笔记(四)Servlet 程序开发
    • Web笔记(五)Servlet 的生命周期
    • Java web 开发
    • Java web 开发
    程序猿阿朗
    2018-09-06

    Web笔记(五)Servlet 的生命周期

    Servlet的声明周期是由servlet的容器(web服务器)来控制的,通过简单的概括可以分为4步:

    Servlet类加载 → 实例化Servlet → Servlet提供服务 → 销毁Servlet。

    1. Serlvet 类加载,该阶段仅仅执行一次。
    2. 实例化Servlet ,该阶段仅执行一次、
    3. Servlet 调用 service() 方法来处理客户端的请求,客户端请求一次执行一次,具体的执行次数取决于客户端的请求次数。
    4. Servlet 通过调用 destroy() 方法销毁Servlet,只在web服务器停止服务时执行一次。

    # 开发

    通过一个简单的例子来演示Servlet 的生命周期,编写 LiftServlet.java。

    package net.codingme.servlet;
    
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 
     * Desc:Servlet生命周期测试
     * 
     * @author niumoo on 2017年7月24日 上午11:04:40
     */
    //@WebServlet("/LiftServlet")
    public class LiftServlet extends HttpServlet {
    
    	// 不能被覆盖,这里是web服务器的servlet初始化
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    		System.out.println("Web服务器初始化Servlet : init(ServletConfi confit)");
    		super.init(config);
    	}
    
    	// 可以添加特定的初始化代码
    	@Override
    	public void init() throws ServletException {
    		System.out.println("初始化init()");
    		super.init();
    	}
    
    	// 不能被覆盖
    	@Override
    	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    		System.out.println("调用服务:service(ServletRequest arg0, ServletResponse arg1)");
    		super.service(arg0, arg1);
    	}
    
    	// service会检查请求类型,用来判断调用什么方法,不要覆盖
    	@Override
    	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
    		System.out.println("调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)");
    		super.service(arg0, arg1);
    	}
    
    	/**
    	 * get方法
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("GET方法:doGet()");
    		resp.getWriter().println("servlet get");
    	}
    
    	// 当web服务器正常停止时调用次销毁方法
    	@Override
    	public void destroy() {
    		System.out.println("销毁:destroy()");
    		super.destroy();
    	}
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66

    # 配置

    配置web.xml

    <!-- Servlet生命周期 -->
    <servlet>
    	<servlet-name>liftServlet</servlet-name>
    	<servlet-class>net.codingme.servlet.LiftServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    	<servlet-name>liftServlet</servlet-name>
    	<url-pattern>/liftServlet</url-pattern>
    </servlet-mapping>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    代码中配置了LiftServlet 的访问路径为/liftServlet。

    # 访问

    访问路径:http://localhost:8080/servlet-LifeCycle/liftServlet

    访问两次链接 ,观察控制台输出:

    信息: Starting ProtocolHandler ["http-nio-8080"]
    八月 06, 2017 11:32:09 上午 org.apache.coyote.AbstractProtocol start
    信息: Starting ProtocolHandler ["ajp-nio-8009"]
    八月 06, 2017 11:32:09 上午 org.apache.catalina.startup.Catalina start
    信息: Server startup in 2705 ms
    Web服务器初始化Servlet : init(ServletConfi confit)
    初始化init()
    调用服务:service(ServletRequest arg0, ServletResponse arg1)
    调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)
    GET方法:doGet()
    调用服务:service(ServletRequest arg0, ServletResponse arg1)
    调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)
    GET方法:doGet()
    八月 06, 2017 11:32:42 上午 org.apache.catalina.core.StandardServer await
    信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
    八月 06, 2017 11:32:42 上午 org.apache.coyote.AbstractProtocol pause
    信息: Pausing ProtocolHandler ["http-nio-8080"]
    八月 06, 2017 11:32:42 上午 org.apache.coyote.AbstractProtocol pause
    信息: Pausing ProtocolHandler ["ajp-nio-8009"]
    八月 06, 2017 11:32:43 上午 org.apache.catalina.core.StandardService stopInternal
    信息: Stopping service [Catalina]
    八月 06, 2017 11:32:43 上午 org.apache.catalina.core.ApplicationContext log
    信息: SessionListener: contextDestroyed()
    八月 06, 2017 11:32:43 上午 org.apache.catalina.core.ApplicationContext log
    信息: ContextListener: contextDestroyed()
    销毁:destroy()
    八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol stop
    信息: Stopping ProtocolHandler ["http-nio-8080"]
    八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol stop
    信息: Stopping ProtocolHandler ["ajp-nio-8009"]
    八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol destroy
    信息: Destroying ProtocolHandler ["http-nio-8080"]
    八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol destroy
    信息: Destroying ProtocolHandler ["ajp-nio-8009"]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34

    # 总结

    1. servlet初始化:运行一次,调用init(ServletConfig config)创建ServletConfig对象。调用init() 创建servlet对象并将两者关联。可以将代码放入init()方法完成特定的初始化工作。

    2. servlet服务:每次请求运行, 接收到请求通过service(ServletRequest arg0, ServletResponse arg1)方法进行处理,然后把请求对象封装成HttpServletRequest,响应对象封装成HttpServletResponse调用service(HttpServletRequest arg0, HttpServletResponse arg1)处理。在这个方法里会根据请求方式调用doGet或者doPost方法进行处理。

    3. servlet销毁:运行一次,销毁Servlet 对象,销毁与之关联的ServletConfig对象,

    可以看到,在第一次访问时调用初始化代码,再次访问只调用服务代码,正常停止Tomcat,调用销毁代码。

    GitHub:Servlet 生命周期 (opens new window)

    订阅

    文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

    文章作者: 程序猿阿朗
    文章链接:https://www.wdbyte.com/2018/09/develop/web/web/base-05/
    版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
    #Servlet#Java EE
    上次更新: 2022/12/05, 08:18:32
    Web笔记(四)Servlet 程序开发

    ← Web笔记(四)Servlet 程序开发

    最近更新
    01
    如何搭建一个自己的音乐服务器
    12-04
    02
    JUnit 5 单元测试教程
    11-17
    03
    使用 StringUtils.split 的坑
    11-02
    更多文章>

    提示:评论前请刷新页面,否则评论的可能不是当前文章。

    Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式