servlet 之 GenericServlet抽象类详解

GenericSerlvet抽象类源码如下:

  1. package javax.servlet;    
  2.         
  3.     import java.io.IOException;    
  4.     import java.util.Enumeration;    
  5.         
  6.     //抽象类GenericServlet实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable这两个接口     
  7.     public abstract class GenericServlet     
  8.         implements Servlet, ServletConfig, java.io.Serializable    
  9.     {    
  10.         //私有变量,保存 init()传入的ServletConfig对象的引用    
  11.         private transient ServletConfig config;    
  12.             
  13.         //无参的构造方法    
  14.         public GenericServlet() { }    
  15.         /*   
  16.         ------------------------------------   
  17.         以下方法实现了servlet接口中的5个方法   
  18.         实现Servlet接口方法开始   
  19.         ------------------------------------   
  20.         */        
  21.         /**   
  22.         *实现接口Servlet中的带参数的init(ServletConfig Config)方法,将传递的ServletConfig对象的          *       引用保存到私有成员变量中,   
  23.       *  使得GenericServlet对象和一个ServletConfig对象关联.   
  24.       *  同时它也调用了自身的不带参数的init()方法   
  25.         **/           
  26.         public void init(ServletConfig config) throws ServletException {    
  27.           this.config = config;    
  28.           this.init();   //调用了无参的 init()方法    
  29.         }         
  30.         //无参的init()方法    
  31.         public void init() throws ServletException {       
  32.         }    
  33.                 
  34.         //空实现了destroy方法    
  35.         public void destroy() { }        
  36.       
  37.         //实现了接口中的getServletConfig方法,返回ServletConfig对象    
  38.         public ServletConfig getServletConfig()     
  39.         {    
  40.            return config;    
  41.         }        
  42.         
  43.         //该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串    
  44.         public String getServletInfo() {    
  45.            return "";    
  46.         }    
  47.   
  48.         //唯一没有实现的抽象方法service(),仅仅在此声明。交由子类去实现具体的应用     
  49.        //在后来的HttpServlet抽象类中,针对当前基于Http协议的Web开发,HttpServlet抽象类具体实现了这个方法    
  50.        //若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性      
  51.         public abstract void service(ServletRequest req, ServletResponse res)    
  52.      throws ServletException, IOException;        
  53.         /*   
  54.         ------------------------------------   
  55.         实现Servlet接口方法结束   
  56.         ------------------------------------   
  57.         */    
  58.   
  59.       /*   
  60.       ---------------------------------------------   
  61.        *以下四个方法实现了接口ServletConfig中的方法   
  62.        实现ServletConfig接口开始   
  63.       ---------------------------------------------   
  64.        */    
  65.       //该方法实现了接口<ServletConfig>中的getServletContext方法,用于返回servleConfig对象中所包含的servletContext方法    
  66.         public ServletContext getServletContext() {    
  67.            return getServletConfig().getServletContext();    
  68.         }    
  69.         //获取初始化参数    
  70.         public String getInitParameter(String name) {    
  71.          return getServletConfig().getInitParameter(name);    
  72.         }    
  73.         //实现了接口<ServletConfig>中的方法,用于返回在web.xml文件中为servlet所配置的全部的初始化参数的值    
  74.         public Enumeration getInitParameterNames() {    
  75.            return getServletConfig().getInitParameterNames();    
  76.        //获取在web.xml文件中注册的当前的这个servlet名称。没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。    
  77.        //该方法实现了接口<ServleConfig>中的getServletName方法      
  78.         public String getServletName() {    
  79.             return config.getServletName();    
  80.         }    
  81.        /*   
  82.       ---------------------------------------------   
  83.        实现ServletConfig接口结束   
  84.       ---------------------------------------------   
  85.      */     
  86.         public void log(String msg) {    
  87.            getServletContext().log(getServletName() + ": "+ msg);    
  88.         }      
  89.         public void log(String message, Throwable t) {    
  90.            getServletContext().log(getServletName() + ": " + message, t);    
  91.         }    
  92.     }   
  93. GenericServlet类实现了Servlet接口和ServletConfig接口,GenericServlet类的主要身份是Servlet,此外,它还运用装饰设计模式,为自己附加了ServletConfig装饰身份(装饰者设计模式参见《设计模式之装饰者模式》)。在具体实现中,GenericServlet类包装了一个ServletConfig接口的实例,通过该实例来实现ServletConfig接口中的方法
原文地址:https://www.cnblogs.com/shenhaha520/p/8568802.html