关于Servlet接口的一些坑
项目场景:
还有半年就要实现了,大一一路混过来到现在啥都不会,现在醒悟了,决定开始认真学代码了,最近开始学习Javaweb,今天在学习的过程中碰到了一个小问题
问题描述:
我声明了一个类去实现Servlet接口,想要测试Context对象的存值取值的方法,于是我在service里通过获取ServletConfig对象再去获取ServletContext对象,然后调用context对象的setAttbute方法进行存值,代码如下:
package com.hsf.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo4 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext servletContext = getServletConfig().getServletContext();
System.out.println(servletContext);
servletContext.setAttribute("name","金木研");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
当我启动项目进行访问的时候发生了如下异常:
原因分析:
根据异常提示,我锁定了获取ServletContext对象的那一行代码:
** ServletContext servletContext = getServletConfig().getServletContext();**根据提示,这里的值为空,很明显,我们并没有获取到ServletConfig对象,这是为什么呢,于是带着这个疑问我进行了源码查看,然后发现getServletConfig()方法是Servlet接口里的方法,我当前的类实现了Servlet接口,所以重写了getServletConfig()方法,(完整的代码在上面),代码附上,这里可以看到,该方法的返回值为null,所已,我们获取不到Config对象,导致出现了空指针(NullPoint)的异常,知道了问题,就好解决了!()
public ServletConfig getServletConfig() {
return null;
}
解决方案:
如果我们需要获取上下文对象,需要对getServletConfig()方法做一点修改,在Servlet接口的init方法里,会传入一个ServletConfig对象,我们只需要设置一个ServletConfig类型的全局变量,在init进行初始化即可
package com.hsf.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo4 implements Servlet {
//创建一个ServletConfig对象
ServletConfig servletConfig;
public void init(ServletConfig servletConfig) throws ServletException {
//初始化
this.servletConfig = servletConfig;
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext servletContext = servletConfig.getServletContext();
servletContext.setAttribute("name","金木研");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
这样,问题就解决了!!!啊,舒服了!!!
本文地址:https://blog.csdn.net/qq_47953855/article/details/110289517