redeployTomcat,在浏览器重新访问DBServlet,会发现出现了500错误,这表明服务器内部运行出现错误
文章插图
查看控制台输出,发现doPost方法竟然输出了null
文章插图
在DBServlet中的init方法加上语句
super.init(config);
文章插图
redeployTomcat,重新访问浏览器,会发现访问DBServlet成功,后台输出变正常了
文章插图
问题二:这是为什么呢?
我们先来梳理ServletConfigconfig的使用流程
- 当DBServlet对象初始化时,Tomcat会同时创建一个ServletConfig对象
- 如果DBServlet init()方法中调用了super.init(config);
- 就会调用父类GenericServlet的init方法:
public void init(ServletConfig config) throws ServletException { this.config = config; this.init();}
这时就会把Tomcat创建的ServletConfig对象赋给GenericServlet的属性config
- 因此如果要重写init()方法,记住如果你想在其他方法通过getServletConfig()获取ServletConfig,则一定要记住调用super.init(config);
如果没有把tomcat创建的ServletConfig,赋值给GenericServlet的属性config 。那么GenericServlet的属性config的值就为null,而doPost或者doGet方法通过getServletConfig()拿到的就是GenericServlet的属性config,因此就会输出null 。
侧面证实了方法中获取的servletConfig是同一个对象(问题一)因此上面的例子中,浏览器访问DBServlet,发现出现了500错误的原因是,doPost方法中获取了为null的ServletConfig对象中的属性
文章插图
13.ServletContext13.1为什么需要ServletContext
先来看一个需求:如果我们希望统计某个web应用的所有Servlet被访问的次数,怎么办?方案一:使用DB
文章插图
【day15-Servlet04】方案二:使用ServletContext
文章插图
13.2ServletContext基本介绍
- ServletContext是一个接口,它表示Servlet上下文对象
- 一个web工程中,只有一个ServletContext对象实例
- ServletContext对象是在web工程启动的时候创建的,在web工程停止的时候销毁
- 可以通过ServletConfig.getServletContext方法获得对ServletContext对象的应用,也可以通过this.getServletContext()来获得其对象的引用
- 由于一个web应用中的所有Servlet共享一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现多个Servlet间的通信 。ServletContext对象通常也被称为域对象 。
文章插图
- 获取web.xml文件中配置的上下文参数context-param [信息和整个web应用相关,而不是属于某个Servlet]
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
比如D:\IDEA-workspace\servlet\out\artifacts\servlet_war_exploded
- 向Map一样存取数据,多个Servlet共享数据