首页 > 学院 > 开发设计 > 正文

在Servlet的GenericServlet类中为什么有两个init()方法

2019-11-14 21:36:52
字体:
来源:转载
供稿:网友
在Servlet的GenericServlet类中为什么有两个init()方法

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

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

后续访问该Servlet1、调用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)方法,如下:publicclassTestextendsGenericServlet{ 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(ServletRequestreq,ServletResponseres)throws ServletException,java.io.IOException{ .... }}上面的这个实现类是没问题的,我们可以正常使用getServletConfig()方法得到ServletConfig对象进行使用。但是假设开发过程中忘记了调用super.init(config); //或者this.config = config;这个语句,那么问题就大了,getServletConfig()将返回null,无法使用ServletConfig。所以GenericServlet就再定义了一个无参的init( )方法,子类只需继承该方法即可。这样就防止了类似问题发生。

来自为知笔记(Wiz)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表