欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSP开发Servlet重写init()方法实例详解

程序员文章站 2023-10-20 13:02:45
jsp开发servlet重写init()方法实例详解 写一个servlet时,有时需要我们重写该servlet的初始化方法,然后,究竟是重写init(servletcon...

jsp开发servlet重写init()方法实例详解

写一个servlet时,有时需要我们重写该servlet的初始化方法,然后,究竟是重写init(servletconfig config),还是重写init(),这是个问题。要明了这一点,首先要知道servlet的几个类和接口的联系:

servletconfig接口:其中有getservletname();getservletcontext();getinitparameter(string name);getinitparameternames()四个方法。 
servlet接口:其中有init(servletconfig config)方法 
  |--->genericservlet抽象类:其中有private transient servletconfig config;属性 
        |--->httpservlet类 

     通过查看源码,发现httpservlet中没有init方法.而在genericservlet抽象类中则实现了servlet#init(servletconfig config)方法,不仅如此,还更添加了一个新的不带参数的init()方法。而且在带参数中的init方法中调用了不带参数的init方法。

    应该知道,在servlet初始化的时候,会自动调用init(servletconfig config),container会自动收集一些该servlet的配置信息,生成一个servletconfig的实例,通过调用该实例的四个getxxx方法(即servletconfig接口中的四个方法),我们可以得到该servlet的这些配置信息。

    而该实例我们如何获取呢?是通过servlet#getservletconfig()得到的,该方法同样在genericservlet中实现,具体如下:

public void init(servletconfig config) throws servletexception { 
  this.config = config; 
  this.init(); 
} 
public servletconfig getservletconfig() { 
  return config; 
} 
  

   我认为init()的出现,是为了解决一个问题,那就是有些人最开始时候,重写init(servletconfig config)方法,但却总是忘记去调用“super.init(config);”。试想,如果真的出现这种情况,那么,就会造成一种结果,容器收集的servlet的配置信息,不能初始化给genericservlet的config属性,以至于当调用getservletconfig()的时候,会得不到有用的config实例,而只能得到一个null。这样也就无法获取该servlet的配置信息了。

    而无参数的init()方法在genericservlet中的出现,解决了这种或许人为造成的获取不到servletconfig对象的尴尬。可以看到含参init方法调用了无参init,这就让我们可以在处理servlet初始化参数的时候,只需要重写无参的init()方法就行了。初始化config对象的操作仍然在container调用init(servletconfig config)时候完成,然后调用你重写了的init()方法,完成其他初始化操作。

    综合来看,是重写含参还是不含参的init方法,并没有严格的规定,只是如果重写含参init方法,需要先调用父类的含参init方法罢了。两种调用如下:

public void init(servletconfig config) throws servletexception { 
    super.init(config); 
    //...code... 
} 
public void init() throws servletexception { 
    //...code... 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!