回到顶部
您的当前位置: 编程语言> JAVA> JAVA基础> WEB开发
Servlet技术-GenericServlet与HttpServlet类
2014-04-21 15:23:41
标签: 原创 Servlet 开发 GenericServlet类 HttpServlet类

区分回调方法与工具方法

    回调方法:被系统调用的方法;

    工具方法:调用系统提供的方法;

    Servlet是一个被容器调用的组件类,它的运行过程是由Servlet容器控制和调度的。 Servlet接口中定义的所有方法都是回调方法,这些方法定义了Servlet容器与Servlet程序之间通信的协议约定,专门供Servlet容器调用。如: Servlet接口中的service方法是一个回调方法,它处于一种被动等待状态,等待Servlet容器在适当时机(客户端发出的请求)来调用并接受容器传递来的参数信息,以及生成并返回给容器去使用的数据和状态信息。

    GenericServlet和HttpServlet(提供了处理HTTP协议的基本框架)类中的回调方法是供容器调用的方法,可以在子类中进行覆盖,而不能在程序代码中直接调用。它们中除了包含有回调方法外,也包含有一些供Servlet编程人员调用的工具方法,程序员可以在程序代码中调用这些工具方法来完成某种任务。

Init()方法

    Init方法在Servlet的生命周期中仅执行一次, Servlet引擎创建Servlet实例对象后立即调用该方法, Servlet开发人员可以在这个方法中完成与构造方法类似的初始化功能。 Servlet引擎在调用init方法时,会传递一个包含Servlet的配置和运行环境信息的ServletConfig对象, Servlet接口中定义的init方法的语法格式为:

Public void init(ServletConfig config)throws ServletException

    可见,如果初始化代码中要使用到ServletConfig对象,那么,这些初始化代码就只能在Servlet的init方法中编写,而不能在构造方法中编写,如果init方法抛出异常, Servlet引擎将卸载Servlet。

    在GenericServlet中还定义了一个无参数的init方法,格式如下:

Public void init( )throws ServletException

    GenericServlet中的这个无参数init()方法体中没有编写任何程序语句,是一个空函数,但在它实现的init(ServletConfig config)方法中调用了这个无参数的init()方法,所以对于继承GerericServlet类的Servlet程序,也可以覆盖这个无参数的init()方法来编写初始化代码,并且覆盖这个无参数的init()方法有一个好处,它省去了覆盖init(config)方法时总要编写super.init(config)语句的麻烦。

覆盖无参init()方法的好处

    GenericServlet类中的有关方法的示意代码如下:

Public class GenericServlet{
    private ServletConfig config=null;
    public void init(ServletConfig config)throws ServletException{
        this.config=config ;
        init();
    }
    public ServletConfig getServletConfig(){
        return config;
    }
    public ServletContext getServletContext(){
        return config.getServletContext();
    }
    public void init() throws ServletException{}
    .....
}

    可见GenericServlet中的一些方法依赖config对象。

    GenericServlet子孙类,要增加额外的初始化功能,只要它覆盖无参的init()方法,而不必覆盖有参的init(config)方法,这样Servlet容器在初始化由GenericServlet派生出的子类Servlet程序时,调用的仍然是GenericServlet的有参数的init(config)方法,但是由于该方法最后调用了无参数的init()方法,根据面向对象的多态性,这里调用的无参数的init()方法是实际子孙类中的哪个init()方法。

Service()方法

    Service方法是Servlet的核心方法,在GenericServlet类中没有对这个方法进行实现,HttpServlet类实现了这个方法。

Public void service(ServletRequest req,ServletResponse res)throws ServletException,java.io.IOException{
    HttpServletRequest request=(HttpServletRequest)req;
    HttpServletResponse response=(HttpServletResponse)res;
    service(request,response);//这里调用的是那个重载的service方法
    ………
}

Public void service(HttpServletRequest resquest,HttpServletResponse response)throws ServletException,java.io.IOException{
    …….
    request.HttpServletRequest中定义的方法();
    response.HttpServletResponse中定义的方法();
    …….
}
destroy()方法

    destroy方法在Web容器卸载Servlet之前被调用,显然,该方法在Servlet的生命周期中也仅执行一次。可以通过覆盖destroy方法来完成与init方法相反的功能,释放被该Servlet打开的资源,例如,关闭数据库连接和IO流。GenericServlet类实现的destroy方法已经满足通常的需要了,子类Servlet一般不必覆盖这个方法。

getServletConfig与getServletInfo方法

    getServletConfig():

    此方法用于返回Servlet引擎通过init方法传递进来的那个ServletConfig对象的引用。

    getServletInfo():

    该方法用于返回Servlet的描述信息,Servlet引擎要获得某个Servlet的描述信息时将调用这个方法,如果有必要,可以对这个方法进行覆盖,以便返回Servlet的作者、版本、版权等有关信息。

HttpServlet类中的doXxx方法

    doGet :用于处理GET请求

    doPost:用于处理POST请求

    doHead:用于处理Head请求

    doPut:用于处理PUT请求

    doDelete:用于处理DELETE请求

    doOptions:用于处理OPTIONS请求

    doTrace:用于处理TRACE请求

    HttpServlet中的doXxx方法分别用于对客户端的相应请求方式进行处理,对某种多几种请求方式处理,只须覆盖相应的doXxx方法,而不需要覆盖service方法,在一般情况下Servlet只须处理GET和POST请求方式。