从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

    • 服务器软件

    • 环境管理和配置管理-科普篇
    • Servlet入门

      • 什么是Servlet
      • Servlet入门案例
      • Servlet生命周期
        • Servlet中的生命周期方法
        • 深入理解生命周期
      • Servlet中的注解
      • Tomcat集成IDEA
      • Servlet体系结构
      • HTTP协议基础
      • 深入request和response对象
      • request对象基本使用
      • request其他功能
      • Servlet实现登录功能
      • HTTP协议基础-响应
      • Response对象基本使用
      • response对象之重定向
      • response输出字符到浏览器
      • response输出字节数据
      • 验证码案例
      • ServletContext
      • 文件下载案例
      • Cookie笔记
      • Cookie的更多细节
      • Cookie实践:记住上次访问时间
      • JSP入门
      • JSP的内置对象和案例
      • IDEA与JavaWeb的小技巧
      • Session笔记
      • 验证码案例
      • JSP深入学习
      • MVC开发模式
      • EL表达式和JSTL标签
      • JSTL标签库
      • 案例:列表的增删改查
      • Filter学习
      • Filter案例
      • Listener学习
      • Java中的Ajax
      • Java中的JSON
      • Servlet
    • JavaWeb
  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • JavaWeb
  • Servlet入门
2023-04-17
目录

Servlet生命周期

# 5.Servlet生命周期

本文讲讲一个Servlet从开始到结束的过程。   ‍

# Servlet中的生命周期方法

主要分为3个:

  1. 被创建,执行init方法;
  2. 提供服务,执行service方法
  3. 被销毁,执行destroy方法

‍

‍

我们新建一个Servlet来演示:

package com.peterjxl;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo2Circle implements Servlet {

    //初始化方法  在Servlet被创建时,执行。只会执行一次
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.....");
    }

    //获取ServletConfig对象   ServletConfig:Servlet的配置对象
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //提供服务的方法  每一次Servlet被访问时执行
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }

    //获取Servlet的一些信息,版本,作者等等。
    @Override
    public String getServletInfo() {
        return null;
    }

    //销毁方法   在服务器正常关闭时,执行,执行一次。
    @Override
    public void destroy() {
        System.out.println("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

‍

然后在web.xml里增加如下配置:

 <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>com.peterjxl.ServletDemo2Circle</servlet-class>
    </servlet>

    <!--配置Servlet -->
    <servlet-mapping>
        <servlet-name>demo2</servlet-name>  <!-- 访问路径时,使用哪个Servlet-->
        <url-pattern>/demo2</url-pattern>   <!-- 访问哪个路径-->
    </servlet-mapping>
1
2
3
4
5
6
7
8
9
10

‍

‍

重启Tomcat,访问/demo2,可以看到控制台输出如下:

init.....
Hello Servlet!
1
2

‍

然后关闭Tomcat:

destroy.....
1

‍

在第一次访问 http://localhost:8080/hello/demo2 (opens new window) 时,会创建servlet对象,执行init和service方法。

多次访问,则执行多次service方法,并不会执行多次init方法,init在Servlet的生命周期中只执行一次。

‍

‍

# 深入理解生命周期

Servlet什么时候被创建?默认情况下,第一次被访问时,Servlet被创建

‍

但我们可以配置执行Servlet的创建时机。在web.xml文件中的<servlet>​标签下配置<load-on-startup>​标签:

<servlet>
    <servlet-name>demo2</servlet-name>
    <servlet-class>com.peterjxl.ServletDemo2Circle</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
1
2
3
4
5

​<load-on-startup>​标签里的值是一个整数,其值的定义如下:

  • 想要在第一次被访问时创建该Servlet:设置该值为负数
  • 想要在服务器启动时创建该Servlet:设置值为0或正整数默认值是-1.

有时候我们需要在Web服务一启动的时候,就执行一些初始化的方法(例如创建数据库连接池等),此时可以定义一个初始化的Servlet,并在其init方法里编写初始化代码,这样其他Servlet就可以使用初始化好的资源。

‍

‍

其他注意点:

  • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。**多个用户同时访问时,可能存在线程安全问题。**而加锁的话,性能太低。解决方法:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。可以定义局部变量来区别各变量。
  • destroy方法,只执行一次,在Servlet被销毁时执行。服务器被关闭时,Servlet会被销毁。但只有服务器正常关闭时,才会执行destroy。destroy方法在Servlet被销毁之前执行,一般用于释放资源(例如数据库连接池)

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/4/21 16:56:30
Servlet入门案例
Servlet中的注解

← Servlet入门案例 Servlet中的注解→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式