一.搭建基于SSH的程序框架
二.整合Spring和Hibernate
三.使用声明式事务
四.整合Spring与Struts2
五.使用注解实现SSH继承
一.搭建基于SSH的程序框架
开发SSH需要的jar包
二.整合Spring和Hibernate
使用SSH实现用户登录
1.添加3个框架所需的JAR文件2.在Spring中配置数据源对象和会话工程
3.实现并配置DAO
4.实现并配置Service
5.为业务层添加事务管理
6.实现并配置Action
7.创建JSP测试页面(登录页面)
在Spring中配置数据源和会话工厂
方法一:定义独立的Hibernate配置文件,由Spring导入并创建会话工厂Bean
方法二:在Spring配置文件中进行集中配置
先配置数据源,再以此为基础配置会话工厂Bean
持久化类的映射文件可以逐个配置,也可以按目录导入。
方式一:
有hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory name="">
<!-- 数据库连接
jdbc驱动程序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 连接数据库的URL
serverTimezone=GMT 可以解决报错The server time zone value '?й???????' is unrecognized or represents more than one time zone. You mu
-->
<property name="connection.url">jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8</property>
<!-- 用户名 -->
<property name="connection.username">root</property>
<!-- 密码 -->
<property name="connection.password">123456</property>
<!-- 指定连接的语言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="cache.query_cache_factory">true</property>
<mapping resource="cn/houserent/entity/HouseUser.hbm.xml"/>
</session-factory>
</hibernate-configuration>
applicationContext.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>
classpath:hibernate.cfg.xml
</value>
</property>
</bean>
测试
@Test
public void testSpringSessionFactory(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
Transaction tx = sessionFactory.openSession().beginTransaction();
List<HouseUser> hu = sessionFactory.openSession().createQuery("from HouseUser").list();
for(HouseUser user : hu){
System.out.println(user.getUsername());
}
tx.commit();
}
方法二
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- 方法二:在Spring配置文件中进行集中配置
先配置数据源,再以此为基础配置会话工厂Bean
持久化类的映射文件可以逐个配置,也可以按目录导入。
-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8"/>
<!-- 用户名 -->
<property name="username" value="root"/>
<!-- 密码 -->
<property name="password" value="123456"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/><!--指明数据源-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="show_sql">true</prop>
<prop key="format_sql">true</prop>
<prop key="javax.persistence.validation.mode">none</prop><!-- 持久化配置 -->
</props>
</property>
<property name="mappingResources">
<list>
<value>cn/houserent/entity/HouseUser.hbm.xml</value>
</list>
</property>
</bean>
</beans>
DAO类继承HibernateDaoSupport
使用getHibernateTemplate()方法获取HibernateTemplate实例完成持久化操作。
DAO
package cn.houserent.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.houserent.entity.HouseUser;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Override
public HouseUser findUser(String name, String password) {
// TODO Auto-generated method stub
List<HouseUser> users = this.getHibernateTemplate().find("from HouseUser u where u.username=? and u.password=?",name,password);
if(users.size() >0){
return users.get(0);
}else{
return null;
}
}
}
applicationContext.xml
<!-- 省略sessionFactory-->
<!-- Dao -->
<bean id="userDao" class="cn.houserent.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/><!-- 给他设置sessionFactory参数,才能够拿到HibernateDaoSupport -->
</bean>
测试
@Test
public void testUserDao(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
HouseUser user = userDao.findUser("2", "1");
if(user != null){
System.out.println("用户存在");
}else{
System.out.println("用户不存在");
}
}
使用Spring模板能简化编码过程,并且不再直接依赖Hibernate
@Override
public List<HouseUser> findUsers(final int page, final int size) {
// TODO Auto-generated method stub
return this.getHibernateTemplate().execute(new HibernateCallback<List<HouseUser>>(){
@Override
public List<HouseUser> doInHibernate(Session session) throws HibernateException, SQLException {
// TODO Auto-generated method stub
Query query = session.createQuery("from HouseUser");
query.setFirstResult((page -1)*size);//当把方法中的局部变量传递给它的内部类使用时,必须把该变量声明为final
query.setMaxResults(size);
return query.list();
}
});
}
测试
@Test
public void testUserDao1(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
List<HouseUser> users = userDao.findUsers(1, 2);
for(HouseUser user : users){
System.out.println(user.getUsername());
}
}