返回文章列表文章索引阅读全文
STARBLOG / 阅读手记
Java

JavaWeb开发---Servlet的生命周期实验

前言 Servlet是运行在服务器端的程序,它的运行状态由Servlet容器(简称容器)来维护。 通常,在容器收到客户对Servlet的请求时,容器会判断这个Servlet是否为第一次被访问,如果是第一次被访问,则会创建一个Servlet实例同时调用该实例的init()方法,进行初始化。 每个Servlet只会被创建一个实例,同时也只会被初始化一次。然后将这个实例一直保存在内存中,对所有的请求进行

曦远 (DealiAxy)约 16 分钟
目录9 个章节

前言

Servlet是运行在服务器端的程序,它的运行状态由Servlet容器(简称容器)来维护。

通常,在容器收到客户对Servlet的请求时,容器会判断这个Servlet是否为第一次被访问,如果是第一次被访问,则会创建一个Servlet实例同时调用该实例的init()方法,进行初始化。

每个Servlet只会被创建一个实例,同时也只会被初始化一次。然后将这个实例一直保存在内存中,对所有的请求进行处理。默认的服务功能是调用与HTTP请求方法相应的do功能。同时,HttpServlet.service()方法会检查请求方法是否调用了适当的处理方法。

最后,当服务器关闭时,容器将会调用Servlet的destroy()方法清除Servlet实例。

我们下面用实验看一下这个过程:

编写测试用jsp

首先,我们写一个很简单的JSP程序,我们通过JSP页面来调用Servlet方法。我们在Tomcat安装目录下的webapps文件夹下新建一个ServletLife文件夹,进入该文件夹,写一个index.jsp文件,代码如下:

index.jsp

<%@ page contentType="text/html;charset=GBK" language="java" %>
<html>
  <head>
    <title>Show servlet life cycle</title>
  </head>
  <body>
    <center>
      <form action="ShowLifeCycle" name=form">
        <input type="submit" value="SUBMIT"></form>
    </center>
  </body>
</html>

这是一段很简单的JSP程序,只为说明问题,整个程序只有一个提交表单的submit。

  • 代码第8行指定表单提交给ShowLifeCycle
  • 代码第9行创建一个“提交”

然后我们在我们创建的/ServletLife目录下新建一个WEB-INF文件夹,进入WEB-INF文件夹,再创建一个classes文件夹。

编写Servlet程序

Servlet.java 代码

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;

public class Servlet extends HttpServlet {
    private ServletConfig config;
    private static int counter = 0;

    public Servlet() {
        super();
        System.out.println("=== " + ++counter + " instances ===");
    }

    //初始化servlet
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.config = config;
        System.out.println("=== invoke init() ===" + new Date().toString());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("=== invoke doPost ===" + new Date().toString());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("=== invoke doGet() ===" + new Date().toString());
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        System.out.println("=== invoke service ===");
    }

    @Override
    public void destroy() {
        System.out.println("=== invoke destroy() ===" + new Date().toString());
    }
}

代码说明

  • 11行,定义一个类变量,用来记录一共创建了几个实例。
  • 13~16行,显式地写出构造函数,是为了打印出一共创建了多少个实例。
  • 18~24行,初始化函数。每次调用显示”=== invoke init() ===”以及当前时间。
  • 26~28行,在doPost()方法中打印”=== invoke doPost ===”以及当前时间。
  • 30~32行,在doGet()方法中打印”=== invoke doGet ===”以及当前时间。
  • 34~38行,这里我们重写service()方法,只是为了在调用此方法的时候打印出””’ invoke service ===”以及当前时间。
  • 40~43行,在调用destroy()方法时,打印”=== invoke destroy() ===”以及当前时间。

将该java文件编译后的Servlet.class放到/WEB-INF/classes文件夹下。

编写web.xml配置

然后在/WEB-INF文件夹下创建一个配置文件web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
            <servlet-name>LifeCycle</servlet-name>
            <servlet-class>Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifeCycle</servlet-name>
        <url-pattern>/ShowLifeCycle</url-pattern>
    </servlet-mapping>
</web-app>

这个文件主要来配置Servlet的。

运行Tomcat

接下来运行Tomcat,查看控制台日志,里面会有一行刚刚打印的文字:

13-Jan-2018 10:26:21.214 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 108 ms

说明Tomcat服务器正常启动。

然后我们在浏览器地址栏输入以下网址:

http://localhost:8080/ServletOne/

页面上只有一个submit按钮

分析日志测试

点击该按钮,此时Servlet被请求,查看控制台输出,此时内容如下:

=== 1 instances ===
=== invoke init() ===Sat Jan 13 10:26:30 CST 2018
=== invoke doGet() ===Sat Jan 13 10:26:30 CST 2018
=== invoke service ===
  • 第2行,当第一次收到该Servlet请求时,会调用该Servlet的实例方法,并创建1个实例。”=== 1 instances ===”;
  • -第3行,创建该实例后,调用Servlet的init()方法进行初始化操作;
  • 第4行,通过doGet()方法处理请求响应;
  • 第5行,在service()方法最后一行打印出”=== invoke service ===”,实际上,doGet()方法是由service()方法调用的。

接下来我们重新创建一个Servlet请求,打开浏览器,重复以上过程,找到localhost/8080/ServletLife/index.jsp页面,点击submit,然后重新打开刚才的文本文档,内容如下:

=== 1 instances ===
=== invoke init() ===Sat Jan 13 10:26:30 CST 2018
=== invoke doGet() ===Sat Jan 13 10:26:30 CST 2018
=== invoke service ===
13-Jan-2018 10:26:31.202 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager]
13-Jan-2018 10:26:31.272 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager] has finished in [70] ms
=== invoke doGet() ===Sat Jan 13 10:33:10 CST 2018
=== invoke service ===

新增加了6、7两行。再次请求Servlet,并没有新建一个Servlet实例,也没有init过程,直接使用上次创建的实例来处理请求响应,doGet()方法被调用。

然后我们关闭Tomcat服务器。查看控制台日志,内容如下:

=== 1 instances ===
=== invoke init() ===Sat Jan 13 10:26:30 CST 2018
=== invoke doGet() ===Sat Jan 13 10:26:30 CST 2018
=== invoke service ===
13-Jan-2018 10:26:31.202 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager]
13-Jan-2018 10:26:31.272 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager] has finished in [70] ms
=== invoke doGet() ===Sat Jan 13 10:33:10 CST 2018
=== invoke service ===
=== invoke destroy() ===Sat Jan 13 10:33:20 CST 2018

可以看到destroy()方法被调用,清除Servlet实例。

总结

Servlet的生命周期

  • 浏览器向Servlet提交请求,Servlet实例化
  • Servlet执行init方法,持续相应HTTP请求
  • 浏览器/页面 关闭,Servlet实例析构

_EOF_

JavaWeb开发---Servlet的生命周期实验

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

2020年第一次用上Struts2框架做Web开发的体验

SliiyStruts2 又名 sb-struts2,因为struts真的太难用了(也许在很多年前是很好用的,但是现在看来,被其他框架秒成渣) 前言 想不到我还是得和这struts框架打交道啊,从一开始学web的时候就十分抵制这类古老,使用反人类的框架,不过为了帮女朋友做个学校的作业,还是得搞一下,然而,半小时就写好的业务代码,因为我不熟悉这个框架和Java的这套体系,调试了半天才成功run起来…

2022-06-17 · Java · 约 1 分钟

Spring-Boot:创建第一个应用

简介 Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作。在本教程中,将学习如何使用 Spring Boot 的 starter、特性和可执行 JAR 文件结构,快速创建能直接运行的基于 Spring 的应用程序。 本文使用IDEA作为开发工具,Gradle作为构建工具,创建一个简单的SpringBoot应用,暂时不涉及数据库的配置。 使用IDEA创建

2022-05-27 · Java · 约 1 分钟

JavaWeb开发---使用IDEA创建Servlet程序

前言 最近做项目需要,从之前熟悉的PHP和Python转到了JavaWeb,所以就有了这个笔记。资源图片都是来自网上的资源,根据自己的实际操作应用,做了总结归纳。 所需工具 JDK Tomcat IDEA 创建工程 设置工程名字: 创建完成后工程结构如下: 上面的图片是在网络上复制的,好像我用的IDEA 2017.3.2没有这个Create web.xml的选项,我也不知道为啥,难道是IDEA越更

2021-12-18 · Java · 约 1 分钟

Java开发:JDK安装和环境配置

前言 环境配置是开发中最基础的部分,不过最近有很多新入坑的同学,都在问怎么安装JDK和配置环境,索性写一篇。 这里要注意一下,在Windows平台和Linux平台下做开发是不同的,Windows平台开发Java需要自己手动配置JDK的环境变量,而大多数Linux都是不需要的,安装了OpenJDK就可以了(可能很多发行版都自带了OpenJDK),这点是比较方便的。 下载Java JDK Window

2023-02-08 · Java · 约 1 分钟

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…