Servlet配置方式+Servlet生命周期

Servlet配置方式

浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式 -- 基于xml的配置方式、基于注解的配置方式。

1.基于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_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Demo</servlet-name>
        <servlet-class>com.nenu.Demo</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo</servlet-name>
        <url-pattern>/Demo</url-pattern>
    </servlet-mapping>
</web-app>

2.基于注解的配置方式

在需要配置的类前面加:

@WebServlet("/Demo1")

例如前面的xml配置文件可以被替换为:

@WebServlet("/Demo1")//这里配置Servlet
public class Demo1 implements Servlet {

}

我们会在xml文件配置不直观,麻烦,而且xml中需要配置所有其他的东西,所以后期Servlet一般都用注解的方式替代。Servlet有很多注解,可以对Servlet更方便的配置。

上述两种配置结果完全一样。

Servlet的生命周期

1.首先我们应该清楚Servlet层级关系:
Servlet(接口)-->GenericServlet(抽象类,与协议无关的Servlet)-->HttpServlet(抽象类,实现了Http协议的Servlet)-->Custom Servlet(自定义的Servlet)
 
2.下面通过Servlet接口来了解Servlet生命周期。

1.概述

1.作为一个对象来讲,一定会有创建、使用和回收的过程~

2.java有专门的垃圾回收机制,会自动的帮助我们回收对象,有不同的算法对对象进行回收。我们首先需要了解基础,后期深入了解垃圾回收机制和java虚拟机内存结构等等。学过C++,C++的对象一定要释放。但Java你只需要创建对象就好了。

  • 声明周期显示到代码里,就是这样,Servlet类里面有五个方法:init、ServletConfig、service、getServletInfo、destory。
  • 其中init是servlet的初始化,service是servlet业务方法、destory释放了servlet对象
  • 其他两个方法与其声明周期无关

2.init、 service和destory方法:

我们在init、service、和destory三个方法设置后台输出输出,如果调用了相应方法就会在后台显示;

从而方便我们判断servlet的声明周期情况:

package com.nenu;

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

@WebServlet("/Demo1")
public class Demo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("执行servlet的初始化");
    }//设置输出

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行servlet业务逻辑");
    }//设置输出

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("servlet的销毁");
    }//设置输出
}

(1)如下是启动项目之后后台的输出:

 说明调用了init方法,然后调用了service

(2)再刷新几次,显示又调用了很多次service:

  • init方法执行一次,servlet对象就存在了,之后的访问都是使用同一个servlet对象。首先检测servlet容器里面有没有目标Demo1的实体类对象。没有的话创建一个,然后调用它的service;第二次再检测,没有则创建,有就直接用。这样可以节约很多内存空间,而且只需要有一个servlet目标对象即可。类似于我们打电话只需要一部手机接打电话,可以无限循环的打电话,而不需要每次打电话都换一台手机。
  • destory方法什么时候执行呢?tomcat一关,开始释放资源,当tomcat服务停掉了,装载servlet的对象就停掉了。
  • 那么对象怎样创建出来的呢,servlet方法是非静态方法,非静态方法的调用必须借助于对象。这里并没有看到new Demo1的对象,我们没看到并不代表不存在。而这一系列的完成都是由tomcat容器完成的。通过反射机制来创建对象。通反射机制拿到构造函数,反射创建对象一般都是调用无参的构造函数。

下面通过实例感受无参构造函数的调用。


3.无参构造函数:

我们可以把无参的构造函数重写一下,添加到代码里:

public Demo1(){
        System.out.println("创建了Servlet对象");
    }

启动后的输出结果:

输出结果印证了:是先构造对象(调用无参构造函数),再调用方法(init、service等)。

而后关闭tomcat,对象销毁↓↓↓

4.总结:

(1)Servlet的生命周期(从创建到销毁):

  1. 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第三步。
  2. 调用init方法完成初始化操作
  3. 调用Servlet方法完成业务逻辑操作
  4. 关闭tomcat时,会调用destory方法,释放当前对象所占用的资源

(2)Servlet声明周期方法

包括无参构造函数、init、service、destory

  1. 无参构造函数只调用一次,创建对象
  2. init只调用一次、初始对象
  3. service调用N次,执行业务方法
  4. destory只调用一次,卸载对象
原文地址:https://www.cnblogs.com/yangf428/p/12522674.html