Servlet 和 GenericServlet 底层分析

Servlet接口中有5个方法:

  • init()方法:通常是完成初始化操作的。在xxxServlet对象被第一次创建出来后执行一次,可编写数据库连接池等操作
  • service()方法:处理用户请求的核心方法。只要用户发送一次请求,service方法就执行一次
  • destroy()方法:销毁xxxServlet对象的内存。tomcat服务器销毁xxxServlet对象前会调用一次,可编写销毁前的操作,如进行资源关闭、资源保存等
  • getServletInfo()方法
  • getServletConfig()方法

Servlet生命周期 :

  • 默认情况下启动服务器的时候xxxServlet对象没有被实例化;
  •  用户第一次请求的时候xxxServlet被实例化(相当于xxxServlet的无参构造方法被执行,一般不建议编写构造方法,容易让无参构造方法消失,导致xxxServlet无法被实例化,出现500错误(HTTP协议的错误状态码));
  • xxxServlet对象被创建出来后,tomcat服务器马上调用 init() 方法和 service() 方法;
  • 第二次请求或者第三次请求时,xxxServlet对象并没用重新被创建,还是使用之前的xxxServlet对象调用 service() 方法
  • 关闭服务器调用 destroy() 方法

只要创建一个类继承Servlet接口都需要导入这5个方法,但有些方法不会被使用到,为了代码的可观看性可以编写适配器类。GenericServlet就是一个适配器。

 GenericServlet:

 GenericServlet 继承 Servlet接口(例如这里自己重新编写的GenericServlet类作为参考):

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

/*
* 编写一个Servlet,起名:GenericServlet
* 以后所有的Servlet类都不直接继承Servlet接口了
* 直接继承GenericServlet类
* GenericServlet 就是一个适配器  抽象类中定义抽象方法(abstract)
* init 方法依旧会调用,tomact服务器调用的,
* 其中ServletConfig servletConfig也是由tomcat创建传给init方法
* */

public abstract class GenericServlet implements Servlet {

    private ServletConfig config;//成员变量
    // 使得init中的ServletConfig创建的对象能够被其他方法使用,使用 getServletConfig() 方法

    @Override
    public final void init(ServletConfig config) throws ServletException{

         //servletConfig 变量是一个局部变量
        //如果加上final 子类没有办法重写init方法 ,
        //可再创建一个init方法,重写这个init()方法,调用重写的init方法

        this.config = config;
        this.init();//调用重写的init()方法
    }

    //这个init方法,供子类重写
    public void init(){ 
    
    }

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

    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;

    @Override
    public void destroy() {

    }

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

}

 再编写一个xxxServlet类继承GenericServlet这个适配器类

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

//通过 GenericServlet适配器 继承Servlet
//原来的Servlet接口中的 init() 方法依旧会调用,tomact服务器调用的
public class xxxServlet extends GenericServlet{
    
    //GenericServlet中重写的 init() 方法
    @Override
    public void init() {
        System.out.println("xxxServlet's init() method execute!");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("正在处理xxxServlet.....");
        //在xxxServlet字类中使用ServletConfig对象
        ServletConfig config = this.getServletConfig();
        System.out.println("service方法是否可以获取到ServletConfig对象:"+config);
    }
}

当我们运行启动服务器 第一次运行xxxServlet时 控制台会输出:

再次刷新页面控制台会输出:

 可以看出,init()方法只调用了一次,请求多上次service()方法便会调用多少次。

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_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <servlet>
        <!--起的名字-->
        <servlet-name>xxxservlet</servlet-name>
         <!--xxxServlet方法的路径-->
        <servlet-class>com.xl.servlet.two.xxxServlet</servlet-class>
    </servlet>
    <servlet-mapping>
         <!--与上面的名字相同-->
        <servlet-name>xxxservlet</servlet-name>
         <!--url-->
        <url-pattern>/xxx</url-pattern>
    </servlet-mapping>
</web-app>

 详情观看:12-改造GenericServlet_哔哩哔哩_bilibili

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值