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

来源:互联网 发布:wow台服数据库 编辑:程序博客网 时间:2024/06/16 04:05

简介:

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接口中的方法。


0 0