首页 > 技术文章 > javax.servlet.GenericServlet源码分析

linglongfang 2020-03-26 16:05 原文

javax.servlet.GenericServlet是servlet接口的一个实现类(抽象),主要是定义一个广义上的servlet所必须的内容。如果是要使用在web上,那么通过http协议传输的,应该通过继承他的子类javax.servlet.http.HttpServlet类。

GenericServlet 使编写 servlet 变得更容易。它提供生命周期方法 initdestroy 的简单版本,以及 ServletConfig 接口中的方法的简单版本。

getServletContext
getInitParameter
getInitParameterNames
getServletName

GenericServlet 还实现 log 方法,用于写入日志(运用javax.servlet.ServletContext中的方法)

javax.servlet.ServletContext主要是用于定义Servlet和Servlet容器之间通信使用的一组方法。

package javax.servlet;

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

public abstract class GenericServlet implements Servlet, ServletConfig,
        java.io.Serializable {
    
    //用于序列化
    private static final long serialVersionUID = 1L;
    //transient序列化时忽略这个成员的值.
    private transient ServletConfig config;

    /*
        此构造方法啥也不做,因为Servlet的所有初始化任务都是由init方法完成的。
    */
    public GenericServlet() {
        // NOOP
    }

    /*
        重写java.servlet.Servlet接口中的destroy方法。
    此方法主要是由Servlet容器调用,用于将Servlet从服务中取出,这个Servelet的生命周期终止。
    */
    @Override
    public void destroy() {
        // NOOP by default
    }

    /*
    
此方法用于获取ServletConfig对象中的初始化参数,通过参数名称获取参数值 */ @Override public String getInitParameter(String name) { return getServletConfig().getInitParameter(name); } /* 重写javax.servlet.ServletConfig接口的方法
    此方法用于获取ServletConfig对象中的所有参数的名字以String的形式返回在java.util.Enumeration这个枚举接口中。 如果Servlet没有初始化参数返回一个空的Enumeration对象(不是null)。
*/ @Override public Enumeration<String> getInitParameterNames() { return getServletConfig().getInitParameterNames(); } /* 重写java.servlet.Servlet接口中的方法。 此方法主要用于返回ServletConfig对象,这个对象包含Servlet的配置和初始化操作,这里主要是为了给init(ServletConfig config)这个方法使用的。 */ @Override public ServletConfig getServletConfig() { return config; } /* 重写java.servlet.ServletConfig接口中的方法 此方法主要用于获取ServletContext对象 */ @Override public ServletContext getServletContext() { return getServletConfig().getServletContext(); } /* 重写java.servlet.Servlet接口中的方法。 此方法主要用于返回servlet信息的,如作者,版权,版本,默认返回空字符串。 可以重写此方法,用于返回更有意义的信息。 */ @Override public String getServletInfo() { return ""; } /** 重写java.servlet.Servlet接口中的方法。 将Servlet容器给的ServletConfig对象,赋值给成员config 并调用init()方法初始化servlet。 */ @Override public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } /* 主要被用于方便重写,不用调用super.init(config)方法,本身没有任何实现 */ public void init() throws ServletException { // NOOP by default } /* 将要输入的信息,输入到servlet的日志文件中,前缀是servlet的名字 */ public void log(String msg) { getServletContext().log(getServletName() + ": " + msg); } /* 将给定的异常信息和堆栈追踪写入servlet的日志文件中,前缀是servlet的名字 */ public void log(String message, Throwable t) { getServletContext().log(getServletName() + ": " + message, t); } /* 重写javax.servlet.Servlet接口中的方法.抽象方法 此方法主要是由Servelt容器调用,用于处理来自于客户端的请求 */ @Override public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /* 重写javax.servlet.ServletContext接口中的方法. */ @Override public String getServletName() { return config.getServletName(); } }

 

推荐阅读