我在做一个项目用到spring、hibernate和struts,hibernate里面的jdbc数据库连接是由spring托管的,由于数据量大我想在tomcat启动的时候把大部分数据读出来,就写了个servlet,在servlet的init()方法中做处理;但是好像在那里用到jdbc连接资源时,jdbc连接资源是空的,报了个空指针异常;请问高手怎么解决?谢谢!
调试欢乐多
修改web.xml文件
<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>
父类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
请高手帮帮忙 先谢谢各位了!
你有让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.
试试吧
Dao ipserver=(DaoImpl)context.getBean("dao");中行代码中
Dao、dao是指什么?我记得以前看过,但是总没有用这个忘了
还有那三个xml文件是不是就是项目中那三个spring的xml文件?
谢谢!
dao是你spring文件中一个bean 的属性id
我把那里的代码改成了:
ApplicationContext context=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
StudentDao sd=(StudentDao)context.getBean("studentDao");
list=sd.getAllData();
谢谢各位!