我在做一个项目用到spring、hibernate和struts,hibernate里面的jdbc数据库连接是由spring托管的,由于数据量大我想在tomcat启动的时候把大部分数据读出来,就写了个servlet,在servlet的init()方法中做处理;但是好像在那里用到jdbc连接资源时,jdbc连接资源是空的,报了个空指针异常;请问高手怎么解决?谢谢!

解决方案 »

  1.   

    延迟servlet的加载
    修改web.xml文件
      

  2.   

    <servlet>
             <servlet-name>ContextLoaderServlet</servlet-name>
             <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
             <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet>
             <servlet-name>InitAppServlet</servlet-name>
             <servlet-class>com.xxx.servlet.InitAppServlet</servlet-class>
             <load-on-startup>2</load-on-startup>
    </servlet>
      

  3.   

    我还是做不出来,下面是我写好的测试代码:
    父类Dao:
    public class BaseDao<T> extends HibernateDaoSupport {
    private Class cls;

    public BaseDao(Class<T> cls){
    this.cls=cls;
    }

    public List<T> getAllData(){
    return this.getHibernateTemplate().loadAll(cls);  //空指针异常
    }
    }
    子类dao:
    public class StudentDao extends BaseDao<Student> implements IStudentDao {
    public StudentDao() {
    super(Student.class);
    } public List<Student> getAllStudent() {
    return this.getAllData();
    }
    }
    Servlet:
    public class InitDataServlet extends HttpServlet {
    List<Student> list=null;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    this.doPost(request, response);
    } public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.getSession().setAttribute("list", list);
    request.getRequestDispatcher("init.do").forward(request, response);
    } public void init() throws ServletException {
    StudentDao sd=new StudentDao();
    list=sd.getAllData();  //报错,空指针异常
    }
    }
    web.xml配置文件:
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet>
        <servlet-name>InitDataServlet</servlet-name>
        <servlet-class>com.newer.servlet.InitDataServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
      </servlet>  <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>InitDataServlet</servlet-name>
        <url-pattern>/InitDataServlet</url-pattern>
      </servlet-mapping>
      <listener>
         <listener-class>
          org.springframework.web.context.ContextLoaderListener
         </listener-class>
      </listener>
    异常:
    2010-3-5 14:54:33 org.apache.catalina.core.AprLifecycleListener init
    信息: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\MyEclipse 6.5\bin;C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin
    2010-3-5 14:54:33 org.apache.coyote.http11.Http11Protocol init
    信息: Initializing Coyote HTTP/1.1 on http-8828
    2010-3-5 14:54:33 org.apache.catalina.startup.Catalina load
    信息: Initialization processed in 557 ms
    2010-3-5 14:54:33 org.apache.catalina.core.StandardService start
    信息: Starting service Catalina
    2010-3-5 14:54:33 org.apache.catalina.core.StandardEngine start
    信息: Starting Servlet Engine: Apache Tomcat/6.0.14
    2010-3-5 14:54:34 org.apache.catalina.core.ApplicationContext log
    信息: ContextListener: contextInitialized()
    2010-3-5 14:54:34 org.apache.catalina.core.ApplicationContext log
    信息: SessionListener: contextInitialized()
    2010-3-5 14:54:35 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring root WebApplicationContext
    log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
    log4j:WARN Please initialize the log4j system properly.
    2010-3-5 14:54:39 org.apache.catalina.core.ApplicationContext log
    信息: Initializing WebApplicationContext for Struts ActionServlet 'action', module ''
    2010-3-5 14:54:39 org.apache.catalina.core.ApplicationContext log
    严重: StandardWrapper.Throwable
    java.lang.NullPointerException
    at com.newer.dao.BaseDao.getAllData(BaseDao.java:15)
    at com.newer.servlet.InitDataServlet.init(InitDataServlet.java:32)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4045)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4351)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    2010-3-5 14:54:39 org.apache.catalina.core.StandardContext loadOnStartup
    严重: Servlet /testdata threw load() exception
    java.lang.NullPointerException
    at com.newer.dao.BaseDao.getAllData(BaseDao.java:15)
    at com.newer.servlet.InitDataServlet.init(InitDataServlet.java:32)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4045)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4351)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    2010-3-5 14:54:39 org.apache.coyote.http11.Http11Protocol start
    信息: Starting Coyote HTTP/1.1 on http-8828
    2010-3-5 14:54:39 org.apache.jk.common.ChannelSocket init
    信息: JK: ajp13 listening on /0.0.0.0:8009
    2010-3-5 14:54:39 org.apache.jk.server.JkMain start
    信息: Jk running ID=0 time=0/31  config=null
    2010-3-5 14:54:39 org.apache.catalina.startup.Catalina start
    信息: Server startup in 6081 ms
    请高手帮帮忙   先谢谢各位了!
      

  4.   

    daoStudentDao sd=new StudentDao();  不能直接New出来吧?
    你有让spring 做注入吗?先让spring注入一下然后在servlet里面 String[] files = new String[3];
    files[0]="applicationContext.xml";
    files[1]="SeviceConfig.xml";
    files[2]="tx.xml";
    ApplicationContext context = new ClassPathXmlApplicationContext(files);
    Dao ipserver=(DaoImpl)context.getBean("dao");用类似这样的方式去或得dao.
    试试吧
      

  5.   

    请问下:
    Dao ipserver=(DaoImpl)context.getBean("dao");中行代码中
    Dao、dao是指什么?我记得以前看过,但是总没有用这个忘了
    还有那三个xml文件是不是就是项目中那三个spring的xml文件?
    谢谢!
      

  6.   

    Dao是你定义的接口
    dao是你spring文件中一个bean 的属性id
      

  7.   

    嗯  知道了   做出来了 
    我把那里的代码改成了:
    ApplicationContext context=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
    StudentDao sd=(StudentDao)context.getBean("studentDao");
    list=sd.getAllData();
    谢谢各位!
      

  8.   

    对了,既然用了Spring,dao中的bean怎么没有用IOC