zoukankan      html  css  js  c++  java
  • getServletContext()空指针异常的原因 和 Servlet的init方法

    问题:
    写servlet时当在doGet/doPost方法中要获取ServletContext对象时,(比如:
    ServletContext context=getServletContext();
    out.print(context.getServerInfo());
    )时而会出现下面的异常提示,有时可以有时又不行,找了半天问题总不得要领。
    java.lang.NullPointerException
    javax.servlet.GenericServlet.getServletContext(GenericServlet.java:159)
    servletdemo.FirstServlet.process(FirstServlet.java:51)


    原来我重写了init(ServletConfig),但第一行没有调用super.init(config);就是这导致了错误!父类的init(ServletConfig)有处理获取ServletContext对象的引用,在doGet()等方法中才能够通过getServletContext()方法获取到SeverletContext对象!!
    public void init(ServletConfig config) throws ServletException{
    super.init(config);
    。。。。
    }

    //-------------------------------------------------------------------------------------------------------------

     init方法是在Servlet实例化之后执行的,并且只执行一次。
    .先说init(ServletConfig)中参数ServletConfig,代表的是配置信息。即在web.xml中配置的信息,比如:

        <servlet>
            <servlet-name>RDSDispatchServlet</servlet-name>
    <display-name>RDSDispatchServlet</display-name>
            <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
    <init-param>
    <param-name>useAppserverSecurity</param-name>
    <param-value>true</param-value>
    </init-param>        
            <load-on-startup>10</load-on-startup>
        </servlet>
       在程序中可以用this.getServletConfig()方法得到ServletConfig的实例,然后用ServletConfig的相应方法 可以得到ServletConfig的名字(getServletName)和配置参数的名字(getInitParameter("name"))或者 名字枚举(getInitParameterNames()),并且通过参数名字得到相应的参数值。具体方法参见API。

    二.再说说init方法,从源码中我们不难发现:Servlet接口里面只有init(ServletConfig),这是供tomcat调用的。GenericServlet类里面有成员变量ServletConfig,init(ServletConfig)方法和init()方法:

                            private transient ServletConfig config;

                            public void init(ServletConfig config) throws ServletException{
                                this.config=config;
                                this.init();
                            }

                            public void init() throws ServletException{

                            }
    现在一切都很明了了,当容器(tomcat)帮忙调用init(ServletConfig config)并且给传过来一个参数config,这个方法把参数对象的引用指向类的成员变量this.config,并且调用类的 this.init()方法。如果我们在写Servlet类时只要重写init(ServletConfig config)就可以了,但是init()不就成了多余的了吗?实际上init()方法是为了防止程序员在写Servlet类重写 init(ServletConfig config)时忘记写super.init(ServletConfig config),这样就容易造成出现空指针异常。而这就要求我们最好不要重写init(ServletConfig config)。
  • 相关阅读:
    Ubuntu 下Apache安装和配置
    MariaDB二进制包简单安装部署
    Ubuntu下MongoDB的安装和使用
    Linux文件类型及目录配置
    centos7下挂载U盘和移动硬盘
    详解 比特(位,bit),字节(Byte),字符的区别 *(转)
    Socket使用及简单实例
    缓存
    字体小图标记录
    大流量下的兜底容灾方案
  • 原文地址:https://www.cnblogs.com/chenny3/p/10226196.html
Copyright © 2011-2022 走看看