GenericServlet类config值为null的解决方法
报错
java.lang.NullPointerException
com.atguigu.servlet.HelloServlet2.doGet(HelloServlet2.java:25)
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)
源代码
public class HelloServlet2 extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("666");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的 doGet方法");
ServletConfig servletConfig = getServletConfig();
System.out.println("初始化参数的username的值是: "+servletConfig.getInitParameter("username"));
System.out.println("初始化参数的url的值是: "+servletConfig.getInitParameter("url"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的 doPost方法");
}
}
web.xml配置文件
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root2</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test2</param-value>
</init-param>
</servlet>
错误分析
getServletConfig()方法是继承与GenericServlet类的,返回一个ServletConfig引用
public ServletConfig getServletConfig() {
return this.config;
}
private transient ServletConfig config;
而config的值来自于GenericServlet类的init方法
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
由此可见,GenericServlet类的getServletConfig方法的返回值在源自于此,若子类的方法覆盖了该方法,而又未调用该方法,getServletConfig()返回值自然为null,自然报错。
修改程序
因此,我们只需要在子类中调用父类的init方法即可。
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println(666);
}
结果输出