在Servlet的GenericServlet类中为什么有两个init()方法
来源:互联网 发布:网络直播的定义 编辑:程序博客网 时间:2024/04/28 03:35
想要搞清楚这件事情,必须先了解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完成后就销毁。
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完成后就销毁。
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{
}
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;
}
假设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) throwsServletException, java.io.IOException{
....
}
}
上面的这个实现类是没问题的,我们可以正常使用getServletConfig()方法得到ServletConfig对象进行使用。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) throwsServletException, java.io.IOException{
....
}
}
但是假设开发过程中忘记了调用super.init(config); //或者this.config = config;这个语句,那么问题就大了,getServletConfig()将返回null,无法使用ServletConfig。所以GenericServlet就再定义了一个无参的init( )方法,子类只需继承该方法即可。这样就防止了类似问题发生
0 0
- 在Servlet的GenericServlet类中为什么有两个init()方法
- java.Servlet.GenericServlet中有两个init方法
- GenericServlet为什么有两个init方法
- Servlet为什么有两个init()方法
- GenericServlet的init方法---init()--
- servlet中两个init方法的区别
- GenericServlet和HttpServlet(继承前者)的两个init()方法
- java.Servlet.GenericServlet中的init方法
- generricServlet中为什么有两个init()
- 关于servlet的两个init()方法
- Servlet的实现类-GenericServlet
- 性能提升---在servlet的init()方法中缓存数据
- GenericServlet 中 添加自定义的init();方法的目的 及意义???
- Servlet中的两个init()方法
- servlet中的两个init方法
- Servlet的init()方法在什么时候执行
- Servlet的init()方法在什么时候执行
- servlet中init方法
- snownlp 中文语法分析
- 1005. Spell It Right (20)
- leecode 解题总结:117. Populating Next Right Pointers in Each Node II
- android 将图片压缩到指定的大小
- (Mysql 六)事务
- 在Servlet的GenericServlet类中为什么有两个init()方法
- Android开发——SD卡_扫描SD卡中视频、音频文件
- android修改静态ip(支持3.x,4.x,5.x)
- 1006 Sign In and Sign Out (25)
- C++析构函数
- java读写txt文件
- Composer: The openssl extension is missing, which means that secure HTTPS transfers are impossible.
- RCTViewManger
- 1007. Maximum Subsequence Sum (25)