Bootstrap

学习Servlet( Servlet实现方式2)

目录

前言

继承javax.servlet.GenericServlet类


前言

上一篇博客,介绍了Servlet 的第一种实现方式:实现javax.servlet.Servlet接口。并且提到Servlet的创建有三种实现方式:

  • 实现javax.servlet.Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;

本篇博客介绍第二种实现方式:继承javax.servlet.GenericServlet类

继承javax.servlet.GenericServlet类

步骤

  • 0 创建web项目
  • 1 创建一个Servlet 继承 GenericServlet类

其他的和上一篇的相同,可以参照上一篇博客【学习Servlet( Servlet实现方式1)】

从之前的学习知道:GenericServlet类是一个抽象类,不能被实现。因此需要一个手写一个子类去继承该抽象类。

我们现在看一下GenericServlet类 的源码

双击shift 键 弹出搜索GenericServlet 并且选中“包括非项目条目”

源代码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package javax.servlet;

import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

    public void log(String message) {
        this.getServletContext().log(this.getServletName() + ": " + message);
    }

    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }

    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        return this.config.getServletName();
    }
}

和上一篇博客的区别在于

发现我们之前在实现Servlet 的第一种方式,写的许多操作,如获得初始化参数在这里已经不用写了。它已经写好了。

我们只需要重写service方法

实例

如果我要获得在配置文件中的初始化参数【键值对的形式】key1-value1

注意:不要忘记指定BServlet 的url 

  <servlet>
        <servlet-name>BServlet</servlet-name>
        <servlet-class>fs.BServlet</servlet-class>
        <init-param>
        <param-name>key1</param-name>
        <param-value>value1</param-value>
    </init-param>
    </servlet>
<!--    通过sevlet-name关联se-->
    <servlet-mapping>
        <servlet-name>AServlet</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>BServlet</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>

BServlet中的代码如下

package fs;

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

public class BServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String initParameter = this.getServletConfig().getInitParameter("key1");
        System.out.println(initParameter);

    }
}

启动tomcat服务器,访问BServlet

;