GenericServlet抽象类 (Tomcat与Java web开发技术详解)

GenericServlet 抽象类为Servlet 接口提供了通用实现,它与任何网络应用层协议无关。GenericServlet 除了实现Servlet 接口还实现了ServletConfigSerializable 接口。

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 msg) {
        this.getServletContext().log(this.getServletName() + ": " + msg);
    }

    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();
    }
}

init方法

GenericServlet 类的源代码可以看出,GenericServlet 实现了 Servlet 接口中的init(ServletConfig config) 初始化方法,GenericServlet 类有一个ServletConfig 类型的私有实例变量config ,当Servlet 容器调用GenericServletinit(ServletConfig config) 方法时,该方法使得私有实例变量config 引用由容器传入的ServletConfig 对象,使得GenericServlet对象与一个ServletConfig 对象关联。

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

GenericServlet 还定义了一个不带参数的init() 方法,init(ServletConfig config) 方法会调用该方法。对于GenericServlet类的子类,如果希望覆盖父类的初始化行为那么就由如下两种方法。

  • 覆盖父类不带参数的init() 方法
  • 覆盖父类带参数的init(ServletConfig config),但是如果希望当前Servlet对象和ServletConfig对象相关联,应该现在该方法中调用super.init(config) 方法

service()方法

GenericServlet 类没有实现Servlet 接口中的service() 方法。service() 方法是GenericServlet 类中唯一的抽象方法,GenericServlet 类的子类必须实现该方法,从而为特定的客户请求提供具体的服务。


destroy()方法

GenericServlet 类尽管实现了Servlet 接口的destroy() 方法,但实际上什么也没有做。GenericServlet 类的具体子类可以覆盖该方法,从而为待销毁的当前Servlet对象释放占用的各种资源(关闭文件输入流和输出流,关闭数据库连接等,实际项目中很少有放在这个方法中去处理的)。


ServletConfig 接口

此外,GenericServlet 类实现了ServletConfig 接口中的所有的方法,因此GenericServlet类的子类可以直接调用getServletContext()getInitParameter()getInitParameterNams() 等方法。


Tips

GenericServlet 类实现了Servlet 接口和ServletConfig 接口。GenericServlet 类的主要身份是Servlet,此外它使用装饰者模式为自己附加了ServletConfig 装饰身份。在具体实现类中GenericServlet 类包装了一个ServletConfig 接口的实例,通过该实例来实现ServletConfig 接口中的方法。


这里写图片描述

猜你喜欢

转载自blog.csdn.net/lucky9322/article/details/79618349