关于servlet的init方法说明

servelt几个主要类的关系如下:

关于servlet的init方法说明_第1张图片

这里说明下为什么我们继承HttpServlet重写doGet()和doPost()后,用户访问时就会调用我们写的方法。实际上用户发送http请求后,由GenericServlet类的抽象方法service()来决定调用那种方法。由上图知HttpServlet继承了GenericServlet并实现了抽象方法service(),而service()方法中,实际上就是一个调度程序,选择性的调度doPost()/doPut()/doDelete()等方法。现在我们创建servlet继承了HttpServlet,然后重写了doPost()/doGet()方法,所以当service()方法选择调用doPost()时会调用我们重写后的方法。

 

对于init()方法,由GenericServlet类可以看到存在重载。由源码可以看到,init()方法什么都没做,是空的。但在init(conifg)方法中对其进行了调用。上图类关系中,有一点非常重要,大家看到GenericServlet实现了ServletConfig接口,而且ServletConfig是GenericServlet的一个成员变量,然后GenericServlet中对ServletConfig接口中方法的实现,都是通过这个成员变量来完成的。那么这个成员变量的值是怎么来的呢?在init(config)中代码如下:

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


这个参数的值,我想应该是tomcat容器赋值的,至于容器在何处调用的,就不深究了。注意得到的这个config值非常重要,正如前面所说,GenericServlet中对ServletConfig接口中方法的实现,都是通过这个成员变量来完成的。

如果我们重写init(config)方法,一定要调用super.init(config);不然使用this.getServeltContext(),this.getServletConfig()方法时,得到的都是null。这里提供了无参数的init()方法,所以建议一般应该重写init()方法,通过this.getServeltConfig()获取ServletConfig对象。

ps:以上是个人学习时的理解,如果有不对之处请指出,大家共同探讨,共同进步。

 

 

 

 

你可能感兴趣的:(jsp+servlet)