回调方法:被系统调用的方法;
工具方法:调用系统提供的方法;
Servlet是一个被容器调用的组件类,它的运行过程是由Servlet容器控制和调度的。 Servlet接口中定义的所有方法都是回调方法,这些方法定义了Servlet容器与Servlet程序之间通信的协议约定,专门供Servlet容器调用。如: Servlet接口中的service方法是一个回调方法,它处于一种被动等待状态,等待Servlet容器在适当时机(客户端发出的请求)来调用并接受容器传递来的参数信息,以及生成并返回给容器去使用的数据和状态信息。
GenericServlet和HttpServlet(提供了处理HTTP协议的基本框架)类中的回调方法是供容器调用的方法,可以在子类中进行覆盖,而不能在程序代码中直接调用。它们中除了包含有回调方法外,也包含有一些供Servlet编程人员调用的工具方法,程序员可以在程序代码中调用这些工具方法来完成某种任务。
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)语句的麻烦。
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方法是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方法在Web容器卸载Servlet之前被调用,显然,该方法在Servlet的生命周期中也仅执行一次。可以通过覆盖destroy方法来完成与init方法相反的功能,释放被该Servlet打开的资源,例如,关闭数据库连接和IO流。GenericServlet类实现的destroy方法已经满足通常的需要了,子类Servlet一般不必覆盖这个方法。
getServletConfig():
此方法用于返回Servlet引擎通过init方法传递进来的那个ServletConfig对象的引用。
getServletInfo():
该方法用于返回Servlet的描述信息,Servlet引擎要获得某个Servlet的描述信息时将调用这个方法,如果有必要,可以对这个方法进行覆盖,以便返回Servlet的作者、版本、版权等有关信息。
doGet :用于处理GET请求
doPost:用于处理POST请求
doHead:用于处理Head请求
doPut:用于处理PUT请求
doDelete:用于处理DELETE请求
doOptions:用于处理OPTIONS请求
doTrace:用于处理TRACE请求
HttpServlet中的doXxx方法分别用于对客户端的相应请求方式进行处理,对某种多几种请求方式处理,只须覆盖相应的doXxx方法,而不需要覆盖service方法,在一般情况下Servlet只须处理GET和POST请求方式。