SSH整合

参考项目地址请访问我的Github(附带SQL文件):
https://github.com/Herbbbb/SSH-
*****************************************************
SSH框架的整合思路和步骤
*****************************************************
1-首先要整合的是Hibernate4Spring4框架,并对Service进行Junit测试.
(
A HibernateC3P0数据源dataSourceSessionFactory配置到Spring IOC容器中(成果物,关于SessionFactoryJUnit测试)
B Dao层中,使用SessionFactory(IOC),成果物:基于Dao层的JUnit测试
C Service,自动装配Dao的对象,并进行业务逻辑开发.成果物:基于ServiceJUnit测试
D 利用SpringAOP特性,实现在Service层的事务处理 @Transactional
)
2-整合Spring4Struts2框架
(
A 根据Spring IOC特性,使用注解对Action进行修改
B Tomcat启动之前,web.xml中增加一个Listener,实现IOC容器的初始化(之前,通过@ControllerAction配置进IOC容器)
C Struts.xml配置文件中,应用IOC容器中的Action对象
)
3-在原有项目Hibernate+Struts基础上,整合到Spring框架中,实现逐步演示
*****************************************************
首先对Hibernate框架和Spring框架进行整合
*****************************************************
***********************************************************
1- 导入SSH整合的jar(注意点:预防jar包冲突,或者jar包缺失)
***********************************************************
SSH整合
***********************************************************
2- 精简hibernate.cfg.xml,Spring框架的applicationContext.xml中配置dataSourceSessionFactory
***********************************************************
SSH整合
为了服务器集群操作,采用了applicationContext.xml+db.properties的组合方式实现配置
SSH整合
SSH整合
测试数据源是否有效
SSH整合
根据IOC容器中的数据源dataSource对象,注册Hibernate框架的SessionFactory对象
SSH整合
在使用getCurrentSession之前,hibernate.cfg.xml中需要增加如下配置:
SSH整合
测试SessionFactory对象
SSH整合
Spring框架配置中的AOP事务机制,稍后讲解.
***********************************************************
3- 应用Hibernate实现Dao层开发(采用注解方式)
***********************************************************
修改dao层的结构
SSH整合
修改UserDaoImpl中的代码:
需要注意的是,由于应用了getCurrentSession方式获取Session对象,因此,所有方法必须启动事务机制,因为在事务提交或回滚后,session对象才能被自动关闭.
SSH整合
SSH整合
SSH整合
SSH整合
package com.neu.dao.impl; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import com.neu.dao.idao.UserDao; import com.neu.dao.pojo.User; @Repository("userDao") public class UserDaoImpl implements UserDao { @Autowired @Qualifier("sessionFactory") private SessionFactory sessionFactory; @Override public void save(User user) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); session.save(user); transaction.commit(); } @Override public void delete(User user) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); session.delete(user); transaction.commit(); } @Override public void update(User user) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); session.update(user); transaction.commit(); } @Override public List<User> findAll() throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); Query query = session.createQuery("from User"); List<User> users = query.list(); transaction.commit(); return users; } @Override public List<User> findByName(String username) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); Query query = session.createQuery("from User u where u.username like ?"); query.setParameter(0, "%"+username+"%"); List<User> users = query.list(); transaction.commit(); return users; } @Override public User findById(int id) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); User user = (User) session.get(User.class, id); transaction.commit(); return user; } @Override public boolean login(User user) throws Exception { Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); Query query = session .createQuery("from User u where u.username=? and u.password=?"); query.setParameter(0, user.getUsername()); query.setParameter(1, user.getPassword()); User user1 = (User) query.uniqueResult(); transaction.commit(); return user1 == null ? false : true; } }
编写基于UserDaoImpl的单元测试:
SSH整合
SSH整合
SSH整合
***********************************************************
3- 实现Service层开发(采用Spring注解方式)
***********************************************************
Service层中的方法,需要根据系统业务逻辑需求进行编写(业务逻辑>程序编写)
SSH整合
SSH整合
package com.neu.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.neu.dao.idao.UserDao; import com.neu.dao.pojo.User; @Service("userService") public class UserServiceImpl implements UserService { @Autowired @Qualifier("userDao") private UserDao userDao; public UserServiceImpl() { } @Override public String save(User user) { String msg = "error"; try { if (userDao.findById(user.getId()) == null) { userDao.save(user); msg = "success"; } } catch (Exception e) { e.printStackTrace(); } return msg; } @Override public String delete(User user) { String msg = "error"; try { if (userDao.findById(user.getId()) != null) { userDao.delete(user); msg = "success"; } } catch (Exception e) { e.printStackTrace(); } return msg; } @Override public String update(User user) { String msg = "error"; try { if (userDao.findById(user.getId()) != null) { userDao.update(user); msg = "success"; } } catch (Exception e) { e.printStackTrace(); } return msg; } @Override public List<User> findAll() { List<User> users = null; try { users = userDao.findAll(); } catch (Exception e) { e.printStackTrace(); } return users; } @Override public List<User> findByName(String username) { List<User> users = null; try { users = userDao.findByName(username); } catch (Exception e) { e.printStackTrace(); } return users; } @Override public User findById(int id) { User user = null; try { user = userDao.findById(id); } catch (Exception e) { e.printStackTrace(); } return user; } @Override public boolean login(User user) { boolean flag = false; try { flag = userDao.login(user); } catch (Exception e) { e.printStackTrace(); } return flag; } }
package com.neu.test; import static org.junit.Assert.fail; import java.util.Date; import org.junit.Before; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.neu.dao.pojo.User; import com.neu.service.UserService; public class UserServiceImplTest { UserService userService; @Before public void setUp() throws Exception { //从IOC容器内获取userService,而userService中将被自动装配userDao,userDao中自动装配sessionFactory userService = (UserService) new ClassPathXmlApplicationContext("applicationContext.xml") .getBean("userService"); } @Test public void testSave() { User user = new User("abc","123",new Date()); System.out.println(userService.save(user)); } @Test public void testDelete() { User user = new User(); user.setId(5); System.out.println(userService.delete(user)); } @Test public void testUpdate() { User user = new User(); user.setId(6); user.setUsername("TTTT"); user.setPassword("123"); System.out.println(userService.update(user)); } @Test public void testFindAll() { System.out.println(userService.findAll()); } @Test public void testFindByName() { System.out.println(userService.findByName("t")); } @Test public void testFindById() { System.out.println(userService.findById(2)); } @Test public void testLogin() { User user = new User(); user.setUsername("scott"); user.setPassword("tiger"); System.out.println(userService.login(user)); } }
$$$$$至此,完成了Hibernate框架和Spring框架的整合!$$$$$$$
*****************************************************
其次对Struts框架和Spring框架进行整合
*****************************************************
首先导入
SSH整合
jar.
1-Action进行基于SpringIOC容器注解修改
SSH整合
2-由于我们将Action放入了IOC容器,则需要在Tomcat启动后,加载IOC容器,这样,跳转的url连接才能访问到Action
对象.
解决方案:Tomcat启动时,加载web.xml文件,所以,我们在web.xml中加入一个关于Spring IOC容器的Listener监听
快捷键:ALT+? 回车
SSH整合
3-修改struts.xml中的所有Action连接,将值修改为IOC容器中的Actionid
SSH整合
$$$$$至此,完成了SSH框架的整合!$$$$$$$
*****************************************************
为项目模块追加Spring框架的AOP 事务机制
*****************************************************
1- applicationContext.xml中配置事务声明机制(AOP+注解)
SSH整合
2-service,将相关方法添加Transactional事务注解
SSH整合
3- 修改hibernate.cfg.xml,使得SessionFactorygetCurrentSession方法能够正常执行
SSH整合
4-目前,session可以自动关闭,事务可以从service以上的请求中自动启动,并提交或回滚.,修改UserDaoImpl中的代码,进行精简
SSH整合
SSH整合
SSH整合
5-关于@Transactional注解的说明
5.1 @Transactional一般设置在service层的Impl类中,只能对外部访问提供事务AOP机制.所以,dao层方法的内部访问不触发事务机制.
5.2 @Transactional的属性设置
SSH整合