zoukankan      html  css  js  c++  java
  • 在Servlet的GenericServlet类中为什么有两个init()方法

    想要搞清楚这件事情,必须先了解Servlet容器调用Servlet的过程。调用过程如下

    首次访问该Servlet
    1、调用init(ServletConfig config) 进行初始化,ServletConfig封装了web.xml中<init-param>配置的初始化参数,它由Servlet容器创建,并通过该方法传递给当前serlvet
    2、调用service(ServletRequest req, ServletResponse res)方法处理客户的请求
    3、调用destroy()方法销毁给Servlet实例,当然这里只是为了说明完整流程,实际上destroy()方法不是在调用servlet完成后就销毁。

     

    后续访问该Servlet
    1、调用service(ServletRequest req, ServletResponse res)方法处理客户的请求
    2、调用destroy()方法销毁给Servlet实例,当然这里只是为了说明完整流程,实际上destroy()方法不是在调用servlet完成后就销毁。

    从上面的调用过程来看,Serlvet容器仅关心带参数的init方法init(ServletConfig config)、service(ServletRequest req, ServletResponse res)和destroy(),其他的额外方法都是附加产品,这样也就说明不带参数的init方法不是必须的,那为什么在GenericServlet抽象类中却定义了该方法,意义何在呢?

    我们先看下GenericServlet类中的两个init方法的实现。
    public void init(ServletConfig config)throws ServletException{
    this.config = config;
    this.init(); 
    }
    public void init()throws ServletException{
    }
    从上面的实现来看, init(ServletConfig config)会调用不带参数的init方法进行初始化该Serlvet实例,而不带参数的init方法却什么都不做。
    假设GenericServlet类只实现了init(ServletConfig config)方法,那么代码应该如下
    public void init(ServletConfig config)throws ServletException{
    this.config = config;
    }
    假设某个子类继承了上面只定义一个init方法的GenericServlet类,并且想再初始化时增加一些自己的初始化参数,那必须重写GenericServlet类的init(ServletConfig config)方法,如下:
    public class Test extends GenericServlet{
       public int a = 0;
       public String b;  
       public void init(ServletConfig config)throws ServletException{
         super.init(config);  //或者this.config = config;
         this.a = XXX;
         this.b = XXX; 
       }
        public  void service(ServletRequest req,ServletResponse res) throws ServletException, java.io.IOException{
            ....
        }
    }
    上面的这个实现类是没问题的,我们可以正常使用getServletConfig()方法得到ServletConfig对象进行使用。
    但是假设开发过程中忘记了调用super.init(config);  //或者this.config = config;这个语句,那么问题就大了,getServletConfig()将返回null,无法使用ServletConfig。所以GenericServlet就再定义了一个无参的init( )方法,子类只需继承该方法即可。这样就防止了类似问题发生。

     



  • 相关阅读:
    codeforces570D Tree Requests
    codeforces600E Lomsat gelral
    BZOJ2001 [Hnoi2010]City 城市建设
    BZOJ2565 最长双回文串
    BZOJ4031 [HEOI2015]小Z的房间
    BZOJ2467 [中山市选2010]生成树
    SPOJ104 HIGH
    爆零系列—补题A
    DP一直是自己的弱势 开始练滚动数组——HDOJ4502
    HDOJ4550 卡片游戏 随便销毁内存的代价就是wa//string类的一些用法
  • 原文地址:https://www.cnblogs.com/itmanxgl/p/fbeced7052b9ec29fa5bae652c5ceff4.html
Copyright © 2011-2022 走看看