servelt几个主要类的关系如下:
这里说明下为什么我们继承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)中代码如下: