Servlet技术浅析(一)之GenericServlet抽象类

简介:

servlet最常用的几个对象:

1、请求对象(ServletRequest和HttpServletRequest):Servlet从该对象中,获取来自客户端的请求信息。

2、响应对象(ServletResponse和HttpServletResponse):Servlet通过该对象来生成响应结果。

3、Servlet配置对象(ServletConfig):当容器初始化一个Servlet对象时,会向Servlet提供一个ServletConfig对象,Servlet通过该对象来获取初始化参数信息及ServletContext对象。

4、Servlet上下文对象(ServletContext):Servlet通过该对象来访问容器为当前Web应用提供的各种资源。

一、Servlet API:

1、Servlet API主要由两个java包组成:javax.servlet和javax.servlet.http;

1)在javax.servlet包中定义了Servlet接口和相关的通用接口和类;

2)在javax.setvlet.http包中主要定义了与http协议相关的HttpServlet类、HttpServletRequest接口和HttpServletResponse接口。

下图显示了Servlet API 中主要的接口和类的类框图;


2.1、Servlet接口
Servlet API的核心是javax.servlet.Servlet接口,所有的Servlet类都必须实现这一接口。在Servlet接口中定义了5个方法,其中3个由Servlet容易调用,容器会在Servlet生命周期的不同阶段调用特定的方法。
1)init(ServletConfig config)方法 :负责初始化Servlet对象。容器在创建好Servlet对象后,就会调用该方法。
2)service(ServletRequest req , ServletResponse res)方法:负责响应客户的请求,为客户提供相应的服务。当容器接收到客户端要求方法特定Servlet对象的请求时,就会调用该Servlet对象的service()方法。
3)destroy()方法:负责释放Servlet对象占用的资源。当Servlet对象结束生命周期时,容器会调用此方法。

Servlet接口还定义了两个返回Servlet相关信息的方法。JavaWeb应用中的程序代码可以访问Servlet的这两个方法,从而获得Servlet的配置信息及其他相关信息。
1)getServletConfig(): 返回一个ServletConfig对象,在该对象中包含了Servlet的初始化参数信息。
2)getServletInfo():返回一个字符串,在该字符串中包含了Servlet的创建者、版本和版权等信息。

在Servlet API 中,javax.servlet.GenericServlet抽象类实现了Servlet接口,而javax.servlet.http.HttpServlet抽象类是GenericServlet类的子类。当用户开发自己的Servlet类时,可以选择扩展GenericServlet或HttpServlet类。下图展示了Servlet接口及其实现类的类框图


二、下面详细介绍各个类
1、GenericServlet抽象类为Servlet接口提供了通用实现,他与任何网络应用层协议无关。GenericServlet类除了实现Servlet接口,还实现了ServletConfig接口和Serializable接口。
先看javax.servlet.servlet接口源码:
  package javax.servlet;   //Tomcat源码版本:6.0.20  
    import java.io.IOException;  
      
    public interface Servlet {     

    //负责初始化Servlet对象。容器一旦创建好Servlet对象后,就调用此方法来初始化Servlet对象    
       public void init(ServletConfig config) throws ServletException;      

     //方法负责响应客户的请求,提供服务。当容器接收到客户端要求访问特定的servlet请求时,就会调用Servlet的service方法    
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;      
      /* 
        *Destroy()方法负责释放Servlet 对象占用的资源,当servlet对象结束生命周期时,servlet容器调用此方法来销毁servlet对象. 
      **/  
        public void destroy();  
        /* 
        说明:Init(),service(),destroy() 这三个方法是Servlet生命周期中的最重要的三个方法。 
        **/     
        /* 
        *返回一个字符串,在该字符串中包含servlet的创建者,版本和版权等信息 
        **/  
        public String getServletInfo();    
          
        /* 
       GetServletConfig: 返回一个ServletConfig对象,该对象中包含了Servlet初始化参数信息  
       **/      
        public ServletConfig getServletConfig();    
    }  

GenericSerlvet抽象类源码如下:

package javax.servlet;  
      
    import java.io.IOException;  
    import java.util.Enumeration;  
      
    //抽象类GenericServlet实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable这两个接口   
    public abstract class GenericServlet   
        implements Servlet, ServletConfig, java.io.Serializable  
    {  
        //私有变量,保存 init()传入的ServletConfig对象的引用  
        private transient ServletConfig config;  
          
        //无参的构造方法  
        public GenericServlet() { }  
        /* 
        ------------------------------------ 
        以下方法实现了servlet接口中的5个方法 
        实现Servlet接口方法开始 
        ------------------------------------ 
        */      
        /** 
        *实现接口Servlet中的带参数的init(ServletConfig Config)方法,将传递的ServletConfig对象的       	 *       引用保存到私有成员变量中, 
      *  使得GenericServlet对象和一个ServletConfig对象关联. 
      *  同时它也调用了自身的不带参数的init()方法 
        **/         
        public void init(ServletConfig config) throws ServletException {  
          this.config = config;  
          this.init();   //调用了无参的 init()方法  
        }       
        //无参的init()方法  
        public void init() throws ServletException {     
        }  
              
        //空实现了destroy方法  
        public void destroy() { }      
    
        //实现了接口中的getServletConfig方法,返回ServletConfig对象  
        public ServletConfig getServletConfig()   
        {  
           return config;  
        }      
      
        //该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串  
        public String getServletInfo() {  
           return "";  
        }  

        //唯一没有实现的抽象方法service(),仅仅在此声明。交由子类去实现具体的应用   
       //在后来的HttpServlet抽象类中,针对当前基于Http协议的Web开发,HttpServlet抽象类具体实现了这个方法  
       //若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性    
        public abstract void service(ServletRequest req, ServletResponse res)  
     throws ServletException, IOException;      
        /* 
        ------------------------------------ 
        实现Servlet接口方法结束 
        ------------------------------------ 
        */  

      /* 
      --------------------------------------------- 
       *以下四个方法实现了接口ServletConfig中的方法 
       实现ServletConfig接口开始 
      --------------------------------------------- 
       */  
      //该方法实现了接口<ServletConfig>中的getServletContext方法,用于返回servleConfig对象中所包含的servletContext方法  
        public ServletContext getServletContext() {  
           return getServletConfig().getServletContext();  
        }  
        //获取初始化参数  
        public String getInitParameter(String name) {  
         return getServletConfig().getInitParameter(name);  
        }  
        //实现了接口<ServletConfig>中的方法,用于返回在web.xml文件中为servlet所配置的全部的初始化参数的值  
        public Enumeration getInitParameterNames() {  
           return getServletConfig().getInitParameterNames();  
       //获取在web.xml文件中注册的当前的这个servlet名称。没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。  
       //该方法实现了接口<ServleConfig>中的getServletName方法    
        public String getServletName() {  
            return config.getServletName();  
        }  
       /* 
      --------------------------------------------- 
       实现ServletConfig接口结束 
      --------------------------------------------- 
     */   
        public void log(String msg) {  
           getServletContext().log(getServletName() + ": "+ msg);  
        }    
        public void log(String message, Throwable t) {  
           getServletContext().log(getServletName() + ": " + message, t);  
        }  
    }  

补充:
GenericServlet类实现了Servlet接口和ServletConfig接口,GenericServlet类的主要身份是Servlet,此外,它还运用装饰设计模式,为自己附加了ServletConfig装饰身份(装饰者设计模式参见《 设计模式之装饰者模式》)。在具体实现中,GenericServlet类包装了一个ServletConfig接口的实例,通过该实例来实现ServletConfig接口中的方法。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值