为什么Servlet程序的init(ServletConfig config)中需要调用父类的init方法
说明:本文代码测试于:idea2018; tomcat 9.0
当我们通过IDEA自动生成init(ServletConfig config)
方法时,默认创建一句调用父类init()
方法的语句
@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);}
但是调用父类的构造方法super.init(config);
是必须的吗?如果我们将其删掉会怎样呢?
@WebServlet(name = "HelloServlet", urlPatterns = "/hello",initParams = {@WebInitParam(name = "hello2021", value = "123")}
)
public class HelloServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("hahaha");}// 为简化问题,不考虑 doPost() 方法protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取当前 Servlet 的 config 对象ServletConfig config = getServletConfig();// 输出当前 Servlet 程序的别名System.out.println(config.getServletName());}
}
浏览器访问HelloServlet
项目,报错:
HTTP Status 500 – Internal Server Error
Type 异常报告描述 服务器遇到一个意外的情况,阻止它完成请求。Exceptionjava.lang.NullPointerExceptionchapter1.HelloServlet.doGet(HelloServlet.java:33)javax.servlet.http.HttpServlet.service(HttpServlet.java:634)javax.servlet.http.HttpServlet.service(HttpServlet.java:741)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note 主要问题的全部 stack 信息可以在 server logs 里查看
分析报错信息可知,报错的原因是:java.lang.NullPointerException
,报错语句是:System.out.println(config.getServletName());
报错信息中提到
HelloServlet.java:33
,实际上就是该语句:System.out.println(config.getServletName());
缩小范围,可知是该语句引起的报错:config.getServletName()
,结合报错类型是空指针异常,所以可以推断config
的值为空。而config
是由getServletConfig()
方法返回的,查看getServletConfig()
源代码
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {private transient ServletConfig config;public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public ServletConfig getServletConfig() {return this.config;}
}
简单说明一下,在
自定义的Servlet项目
中(本文即是HelloServlet
),init(ServletConfig config)
的父类方法是GenericServlet
类中的构造方法,覆盖的getServletConfig()
方法同样也是GenericServlet
中的。读者可以直接查看源码验证。
综上可知,super.init(config);
的作用是将config传入GenericServlet
,初始化超类中的ServletConfig
属性,以便能通过getServletConfig()
方法在子类中获得config
对象
根据
Servlet
程序的继承结构可知,自定义的Servlet程序的直接父类是HttpServlet
,HttpServlet
的父类是GenericServlet
,而自定义的Servlet程序直接可以覆盖GenericServlet
中的方法的原因是HttpServlet
没对某些方法进行重写。
参考文章:
- servlet中的init方法中为什么总要有个super.init
- 尚硅谷最新版JavaWeb全套教程
为什么Servlet程序的init(ServletConfig config)中需要调用父类的init方法相关推荐
- python中子类调用父类的初始化方法
http://bestchenwu.iteye.com/blog/1044848 http://www.crazyant.net/1303.html 一直不太理解python的初始化方法,今天找了下资 ...
- C#中子类调用父类的实现方法
本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用.具体方法如下: public class Person {public Person(){Console.WriteLine(&q ...
- python子类如何调用父类方法_python中子类调用父类函数的方法示例
前言 本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数.下面话不多说了,来一起看看详 ...
- 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...
错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ...
- 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
线程的常用方法--currentThread方法 Thread.currentThread()方法可以获得当前线程 Java 中的任何一段代码都是执行在某个线程当中的. 执行当前代码的线程就是当前线程 ...
- 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例
前言: 今天为大家带来的内容是零基础入门:python中子类继承父类的__init__方法实例!具有不错的参考意义,希望在此能够帮助到各位!(喜欢的话记得点赞转发关注不迷路哦) 使用Python写过面 ...
- c++中子类调用父类方法的方法
在c++中子类调用父类方法的方法和java所用的方式不一样, java使用super指针就可以调用,c++中虽然也有this指针,但是不能用super去调用父类方法. c++用的方法为:fatherC ...
- mysql idataparameter_asp.net中IDataParameter调用存储过程的实现方法
本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: public string ...
- python程序运行时间计时软件_python中的计时器timeit的使用方法
这篇文章主要介绍了关于python中的计时器timeit的使用方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 本文介绍了python中的计时器timeit的使用方法,分享给大家,具 ...
最新文章
- Gmapping从开始到放弃—写一个TF 广播
- 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
- 深入浅出解释FFT(四)——fft分析信号频率和相位
- C 猴子选大王(亚瑟夫环)
- 听歌是怀念过去 - 潇洒的走
- jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
- oracle高资源消耗sql,Oracle中定位重要(消耗资源多)的SQL
- Ubuntu下解决文件名mp3标签和文本文件内容的乱码问题
- mybatis动态列名
- 阿里人告诉你毕业3年,为何技术能力相差越来越大?
- WPF换肤之三:WPF中的WndProc
- Kotlin习惯用语和编码风格[转自Kotlin中文文档]
- java fn replace_JSTL fn:replace()函数替换 换行符
- JDBC Driver介绍
- python双人对决小游戏
- 基于知识图谱的智能问答机器人
- 计算Fisher信息之Part(二)
- Matlab文件列表实现自然排序的方法排序
- MatLab函数:pol2cart()
- 谷歌不支持调用摄像头麦克风_谷歌大手一挥,第三方相机或已无立锥之地
热门文章
- cmd中net start mysql发生系统错误5
- 通信原理最佳接收-最佳接收准则
- 创建mat二值图 matlab,OpenCV学习之路(二)——Mat对象
- java tic tac toe_请问我这个tic tac toe的游戏代码的问题在哪里
- netcore更新dll要停止_使 .NET Core 应用程序容器化
- python安装完后无法打开运行_安装Python完成后无法正确运行
- matlab产生时间数组以月为单位_Matlab中处理日期与时间的函数
- java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...
- Qt中的QLineEdit、QTextEdit、QPlainTextEdit
- 自适应lasso_线性回归模型优化算法(Lasso)