小弟刚刚开始学SSH,是用的Struts2+Hibernate+Spring,运行的时候发现getHibernateTemplate()得到的模板类始终是nUll值,郁闷好几天了,一直在我网上试各种方法,迄今任为解决,恳请各位指教咯!
[size=large][b]applicationContext.xml:([/b]事务处理这儿没贴出来)[/size]
[code="java"]
<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<!-- 定义数据源 -->
class="org.apache.commons.dbcp.BasicDataSource">
value="com.mysql.jdbc.Driver">
<!-- 定义Hibernate的sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- Hibernate 的sessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 数据库方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<!-- 显示Hibernate持久化操作所生成的SQL语句 -->
<prop key="hibernate.show_sql">true</prop>
<!-- 将SQL脚本进行格式化后再输出 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 列出全部的映射文件 -->
<property name="mappingResources">
<list>
<value>com/jjufriend/student/model/Student.hbm.xml</value></list>
</property></bean>
<!-- 配置dao组件 -->
<bean id="studentDao"
class="com.jjufriend.student.dao.impl.StudentDaoHibernate">
<!-- 依赖注入DAO组件所必需的SessionFactory引用 -->
<property name="sessionFactory" ref="sessionFactory">
</property>
</bean>
<!-- 配置业务逻辑组件 -->
<bean id="mgr"
class="com.jjufriend.student.service.impl.StudentManagerImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>
[/code]
[size=large]studentDao.java:[/size]
[code="java"]package com.jjufriend.student.dao;
import java.util.List;
import com.jjufriend.student.model.Student;
public interface StudentDao {
Student get(Integer id);
Integer save(Student student);
void update(Student student);
void delete(Student student);
void delete(Integer id);
List<Student> findAll();
Student findStudentByNameAndPass(String username,String password);
Student findByName(String username);
}[/code]
[size=large]StudentDaoHibernate.java:[/size]
[code="java"]package com.jjufriend.student.dao.impl;
import java.io.Serializable;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.jjufriend.student.dao.StudentDao;
import com.jjufriend.student.model.Student;
public class StudentDaoHibernate extends HibernateDaoSupport implements
StudentDao,Serializable {
private SessionFactory sessionFactory;
HibernateTemplate ht = this.getHibernateTemplate() ;
public void delete(Student student) {
// TODO Auto-generated method stub
getHibernateTemplate().delete(student);
}
public void delete(Integer id) {
// TODO Auto-generated method stub
getHibernateTemplate().delete(get(id));
}
public List<Student> findAll() {
// TODO Auto-generated method stub
return (List<Student>)getHibernateTemplate().find("from Student");
}
public Student findByName(String username) {
List stu = getHibernateTemplate().find("from Student st where st.username = ?",username);
if(stu != null && stu.size() >= 1){
return (Student)stu.get(0);
}
return null;
}
public Student findStudentByNameAndPass(String username, String password) {
// TODO Auto-generated method stub
List students = null;
try{
// HibernateTemplate temple = this.getHibernateTemplate();
System.out.println("模板类是否为NULL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ht);
// 取出所有 students = temple.find("from student");
students = ht.find("from student st where st.username = " + username + " and st.password = " + password);
}catch(Exception e){
System.out.println("查找过程中出现异常..............");
e.printStackTrace();
}
if(students != null && students.size() >= 1){
return (Student)students.get(0);
}
return null;
}
public Student get(Integer id) {
return (Student)getHibernateTemplate().get(Student.class, id);
}
public Integer save(Student student) {
return (Integer)getHibernateTemplate().save(student);
}
public void update(Student student) {
// TODO Auto-generated method stub
getHibernateTemplate().update(student);
}
}
[/code]
[size=large]StudentManager.java:[/size]
[code="java"]package com.jjufriend.student.service;
import com.jjufriend.student.model.Student;
public interface StudentManager {
int addStudent(Student student) throws Exception;
int loginValid(Student student) throws Exception;
boolean validateName(String username) throws Exception;
}
[/code]
[size=large]StudentManagerImpl.java:[/size]
[code="java"]package com.jjufriend.student.service.impl;
import com.jjufriend.student.dao.StudentDao;
import com.jjufriend.student.dao.impl.StudentDaoHibernate;
import com.jjufriend.student.model.Student;
import com.jjufriend.student.service.StudentManager;
public class StudentManagerImpl implements StudentManager {
/*2009-11-12 22:44修改 出去new StudentDaoHibernate() */
private StudentDao studentDao = new StudentDaoHibernate() ;
// private ApplicationContext cxt =
// new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");
// studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");
public void setStudentDao(StudentDao studentDao){
this.studentDao = studentDao ;
}
public int addStudent(Student student) throws Exception {
// TODO Auto-generated method stub
try{
studentDao.save(student);
return student.getId();
}catch(Exception e){
e.printStackTrace();
throw new Exception("新增用户时出现异常");
}
}
public int loginValid(Student student) throws Exception {
try{
System.out.println(studentDao);
System.out.println("是否取到页面提交的数据:Name="+student.getUsername());
Student stu = studentDao.findStudentByNameAndPass(student.getUsername(), student.getPassword());
if(stu != null ){
return stu.getId();
}
}catch(Exception e){
System.out.println("验证用户登录时出现异常");
e.printStackTrace();
}
// TODO Auto-generated method stub
return -1;
}
public boolean validateName(String username) throws Exception {
// TODO Auto-generated method stub
try{
if (studentDao.findByName(username) != null){
return true ;
}
}catch(Exception e){
System.out.println("验证用户名是否用效时出错");
e.printStackTrace();
}
return false ;
}
}
[/code]
问题的关键是通过方法getHibernateTemplate()不能正确得到HibernateTemplate对象,始终的空值,网上有很多解决的办法,差不多我都试过了,
下面这种方法是说不能直接new StudentDao对象,用下面这种方法取得,可以启动服务器老是不停地跳动,一直不停,直到报错。
[code="java"]
// private ApplicationContext cxt =
// new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");
// private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao");[/code]
还有些方法是直接从applicationContext.xml中的bean取得HibernateTemplate对象,始终都搞不定,望大家指教了。
[size=medium](顶格的System.out.println()语句均是测试用的语句)[/size]
[b]问题补充:[/b]
谢谢大家的热心帮助!!
确实其中出了不少问题,主要是最近网上看到解决这个方法的帖子很多,尝试过很多方法,都有点儿改晕了。
一楼的方法我尝试了,还是不行,[code="java"]
private ApplicationContext cxt = this.getApplicationContext();
private StudentDao studentDao = (StudentDaoHibernate)cxt.getBean("studentDao"); [/code]
其中那个this.getApplicationContext(); 方法根本不存在啊,无法取得配置文件。
之前类似的方法我也用过就是用[code="java"] private ApplicationContext cxt =
new FileSystemXmlApplicationContext("../webapps/JJUFriend/WEB-INF/applicationContext.xml");
private StudentDao studentDao =(StudentDaoHibernate)cxt.getBean("studentDao"); [/code]取得,但是当启动服务器后,后台一直跑个不停,仿佛是个死循环似的。浏览器中通过http://localhost:8080访问都无效!
StudentDaoHibernate.java中的private SessionFactory sessionFactory;已经去掉
数据库方言也该过来了