`
jzinfo
  • 浏览: 118173 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

读源码学Servlet(4)关于覆盖GenericServlet的Init()方法

阅读更多


之前提到servlet 生命周期中的三个阶段,第一个阶段中servlet容器会执行init方法来初始化一个servlet.
init方法和destroy这两个方法在servlet生命周期中之执行一次。servlet容器(或者说是servlet引擎)创建了servlet实例对象后立即调用该init方法。
Init方法是在servlet对象被创建后,再由servlet容器调用的方法,其执行位于构造方法之后,在执行init方法时,会传递一个serveltConfig对象。
所以,如果要在初始代码中用到servletConfig对象,则这些初始操作只能在init方法中编写,不能在构造方法中编写.

 

GenericServlet中关于init方法的示意源码:

public void init(ServletConfig config) throws ServletException
{
    this.config=config;
    ......
     
}

 

 

如果在要在自己编写的servlet类中增加一些额外的初始化功能,则必须覆盖GenricServlet类的init(ServletConfig config)方法,如果覆盖后,父类的init(ServletConfig config)方法就不会被调用。GenericServlet类中有些方法依赖init方法执行的结果,例如

getServletName()方法:

public ServletContext getServeltContext()
{
 return config.getServletContext;
}

 

 

这里的config对象的引用就来自Init(ServletConfig config)执行的结果.

所以如果子类需要覆盖了父类的init(ServletConfig config)方法,则首先要调用父类的init(ServletConfig config)方法,也就是先加入 super.init(config) 语句来先执行父类的方法.否则,会产生空指针异常 java.lang.NullPointerException ,因为config对象的引用为空。

 

为了避免这样的情况的产生,GenericServlet的设计人员 在GenericServlet中又定义了一个无参数的init()空方法. 且在init(servletConfig config)方法最后也调用了这个无参的空方法

public void init(ServletConfig config) throws ServletException
{
    this.config=config;
    init();     
}

 

 

所以,我们只需覆盖这个无参的init方法加入自己的初始代码即可,而无需覆盖带参数的父类的init方法.
如果有多个重载的init方法,对以servlet而言,servlet容器始终就之调用servlet接口中的那个方法:init(ServletConfig config) (当然也会执行已经覆盖的无参的init()方法),其他的覆盖的init方法不会执行。

分析 2中关于servlet生命周期的那个例子程序中的一个代码:

 

//覆盖父类的init(ServletConfig config)方法 加入计数
 public void init(ServletConfig config) throws ServletException 
 {
  super.init(config);  //调用父类的init方法
  
  name=config.getServletName();
  initvar++;
  System.out.println(name+">init():Servlet 被初始化了"+initvar+"次"); 
  
 }
 
 
 /* 父类的带参数的init(ServletConfig config)方法最终还是会调用了不带参数的init()方法,
  * 所以也可以在自己的servlet中覆盖不带参数的init()方法来加入自己的统计参数代码
  */ 
  public void init()  //覆盖父类的不带参数的初始化方法
  {
  
  //name=getServleConfig.getServletNmae(); //因为已经实现了servletConfig接口,则直接调用其方法即可
  name=getServletName();  //直接返回
  initvar++;
  System.out.println(name+"init(): servlet被初始化了了 "+initvar+"次");
  }

 

  
  以上的功能是一样的。

分享到:
评论

相关推荐

    serlvet 源码 servlet-src 源文件

    1. **Servlet接口**:所有Servlet都必须实现这个接口,它定义了Servlet的基本方法,如`init()`(初始化Servlet)、`service()`(处理请求)和`destroy()`(销毁Servlet)。 2. **GenericServlet**:这是一个抽象类...

    Servlet&GenericServlet&HttpServlet源码分析.zip_GenericServle_httpser

    1. **Servlet生命周期方法**:init(), service(), destroy(),以及它们如何被Web容器调用。 2. **GenericServlet的service()方法**:如何根据请求类型分派到对应的doXXX()方法。 3. **HttpServlet的doXXX()方法**:...

    servlet-api 源码

    4. 销毁:当Servlet不再使用或Web应用关闭时,容器调用`destroy()`方法,释放资源。 六、请求与响应处理 - HttpServletRequest接口提供了访问请求信息的方法,如请求参数、头信息、路径信息等。 - ...

    servlet源码

    Servlet接口定义了Servlet的基本方法,如`init()`、`service()`、`destroy()`和`getServletInfo()`等。`init()`在Servlet实例化时被调用,用于初始化Servlet;`service()`处理客户端请求并生成响应;`destroy()`在...

    javax.servlet源码

    1. **Servlet接口**:这是所有Servlet类的基类,定义了Servlet的基本方法,如`init()`, `service()`, `destroy()`等。`init()`方法在Servlet实例化后首次调用,用于初始化Servlet;`service()`方法处理客户端的请求...

    servlet 源码

    - **初始化**:Servlet容器调用`init()`方法进行初始化,可以在这里设置初始参数或加载配置。 - **服务**:当接收到请求时,Servlet容器会调用`service()`方法,该方法会根据请求类型分派到`doGet()`或`doPost()`...

    javax-servlet源码包和jar文件

    `jsp.init()`, `jsp.service()`, `jsp.destroy()`分别对应Servlet的初始化、服务和销毁方法,但这些方法在JSP页面中是隐式的。 6. **Servlet配置**: 在`web.xml`部署描述符中,开发者可以配置Servlet和Filter,包括...

    servlet-api源码包

    `init()`, `destroy()` 和 `getServletConfig()` 方法分别是Servlet的初始化、销毁和获取Servlet配置信息的方法。 2. **GenericServlet类** GenericServlet是一个抽象类,实现了Servlet和ServletConfig接口,提供...

    servlet api 源码jar包 Mac版

    - `Servlet`:定义了Servlet的基本行为,如init()、service()、destroy()方法,用于初始化、处理请求和销毁Servlet。 - `HttpServlet`:是Servlet的子类,专门处理HTTP协议的请求,提供了doGet()、doPost()等方法...

    servlet源码包

    1. **Servlet生命周期**:了解Servlet的初始化、服务、销毁过程,以及如何通过`init()`, `service()`, `destroy()`方法控制这些过程。 2. **请求处理流程**:观察`HttpServletRequest`和`HttpServletResponse`如何...

    servlet官方源码

    `GenericServlet`是抽象类,实现了`Servlet`和`ServletConfig`接口,提供了通用的生命周期方法。`HttpServlet`继承自`GenericServlet`,专门为HTTP协议定制,提供了`doGet()`、`doPost()`等方法。 4. **请求处理**...

    Tomcat 8源代码 Servlet源代码

    1. **Servlet接口**:Servlet规范定义了`javax.servlet.Servlet`接口,它包含`init()`, `service()`, `destroy()`等方法,这些方法在Servlet生命周期的不同阶段被调用。 2. **GenericServlet类**:`javax.servlet....

    servlet源码欢迎来取

    4. **Servlet上下文**:ServletContext接口,提供了获取全局信息和与其他Servlet通信的方法。 5. **Servlet的多线程问题**:每个Servlet实例可能被多个请求线程同时访问,理解线程安全问题和如何处理。 6. **...

    Servlet 源码

    当Web服务器接收到对Servlet的请求时,会加载Servlet类,创建Servlet实例,并调用`init()`方法进行初始化。然后,对于每个后续的请求,Servlet容器将调用`service()`方法来处理请求并生成响应。最后,当Servlet不再...

    servlet 源码

    Servlet的核心接口是`javax.servlet.Servlet`,它定义了Servlet的基本方法,如`init()`, `service()`, `destroy()`和`getServletConfig()`。`init()`方法在Servlet被加载时调用,用于初始化Servlet;`service()`...

Global site tag (gtag.js) - Google Analytics