【Spring实战-3】Spring整合Hibernate、Struts

作者:ssslinppp     


1. 摘要


版本:

Spring4.0.4;Hibernate4.3.5;struts2.3.16;

主要介绍了如下内容:

  1. 项目结构的规划;
  2. Spring下整合Hibernate的具体过程;
  3. 整合struts的过程;
  4. 重点介绍Dao层的设计;

2. 项目结构



lib文件:

3. web.xml


因为需要整合struts和Hibernate,所以需要配置spring监听器、以及struts分发器。

  1. <?xml version="1.0" encoding="GBK"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  6. <listener>
  7. <listener-class>org.springframework.web.context.ContextLoaderListener
  8. </listener-class>
  9. </listener>
  10. <filter>
  11. <filter-name>struts2</filter-name>
  12. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>struts2</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>
  18. <welcome-file-list>
  19. <welcome-file>/WEB-INF/content/bookForm.jsp</welcome-file>
  20. </welcome-file-list>
  21. </web-app>


4. applicationContext.xml


主要完成了如下工作:

  1. 首先需要配置 数据源,这里使用C3P0数据源;
  2. 配置sessionFactory;
  3. 配置Hibernate事务管理器;
  4. 配置切入点、通告等;


  1. <?xml version="1.0" encoding="GBK"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  9. http://www.springframework.org/schema/tx
  10. http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
  13. <!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 -->
  14. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  15. destroy-method="close"
  16. p:driverClass="com.mysql.jdbc.Driver"
  17. p:jdbcUrl="jdbc:mysql://localhost:3306/sampledb"
  18. p:user="root"
  19. p:password="qaz"
  20. p:maxPoolSize="40"
  21. p:minPoolSize="2"
  22. p:initialPoolSize="2"
  23. p:maxIdleTime="30"/>
  24. <!-- 定义Hibernate的SessionFactory,SessionFactory需要依赖数据源,注入dataSource -->
  25. <bean id="sessionFactory"
  26. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
  27. p:dataSource-ref="dataSource">
  28. <!-- annotatedClasses用来列出全部持久化类 -->
  29. <property name="annotatedClasses">
  30. <list>
  31. <!-- 以下用来列出所有的PO类-->
  32. <value>org.crazyit.booksys.domain.Book</value>
  33. </list>
  34. </property>
  35. <!-- 定义Hibernate SessionFactory的属性 -->
  36. <property name="hibernateProperties">
  37. <props>
  38. <!-- 指定Hibernate的连接方言 -->
  39. <prop key="hibernate.dialect">
  40. org.hibernate.dialect.MySQL5InnoDBDialect</prop>
  41. <!--是否根据Hiberante映射创建数据表 -->
  42. <prop key="hibernate.hbm2ddl.auto">update</prop>
  43. <prop key="hibernate.show_sql">true</prop>
  44. <prop key="hibernate.format_sql">true</prop>
  45. </props>
  46. </property>
  47. </bean>
  48. <!-- 定义Service组件,并将DAO组件注入Service组件 -->
  49. <bean id="bookService" class="org.crazyit.booksys.service.impl.BookServiceImpl"
  50. p:bookDao-ref="bookDao"/>
  51. <!-- 定义DAO组件,并将SessionFactory注入DAO组件 -->
  52. <bean id="bookDao" class="org.crazyit.booksys.dao.impl.BookDaoHibernate4"
  53. p:sessionFactory-ref="sessionFactory"/>
  54. <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
  55. <!-- 该类是PlatformTransactionManager接口针对采用Hibernate的特定实现类 -->
  56. <!-- 配置HibernateTransactionManager需依赖注入SessionFactory -->
  57. <bean id="transactionManager"
  58. class="org.springframework.orm.hibernate4.HibernateTransactionManager"
  59. p:sessionFactory-ref="sessionFactory"/>
  60. <!-- 配置事务增强处理Bean,指定事务管理器 -->
  61. <tx:advice id="txAdvice"
  62. transaction-manager="transactionManager">
  63. <!-- 用于配置详细的事务定义 -->
  64. <tx:attributes>
  65. <!-- 所有以‘get‘开头的方法是read-only的 -->
  66. <tx:method name="get*" read-only="true"/>
  67. <!-- 其他方法使用默认的事务设置,指定超时时长为5秒 -->
  68. <tx:method name="*" isolation="DEFAULT"
  69. propagation="REQUIRED" timeout="5"/>
  70. </tx:attributes>
  71. </tx:advice>
  72. <!-- AOP配置的元素 -->
  73. <aop:config>
  74. <!-- 配置一个切入点 -->
  75. <aop:pointcut id="myPointcut" expression="bean(bookService)"/>
  76. <!-- 指定在myPointcut切入点应用txAdvice事务增强处理 -->
  77. <aop:advisor advice-ref="txAdvice"
  78. pointcut-ref="myPointcut"/>
  79. </aop:config>
  80. </beans>

5. struts.xml


struts.xml配置文件,没有多少要说明的,就是常规的。


  1. <?xml version="1.0" encoding="GBK"?>
  2. <!-- 指定Struts 2配置文件的DTD信息 -->
  3. <!DOCTYPE struts PUBLIC
  4. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  5. "http://struts.apache.org/dtds/struts-2.3.dtd">
  6. <struts>
  7. <!-- 配置了系列常量 -->
  8. <constant name="struts.i18n.encoding" value="GBK"/>
  9. <constant name="struts.enable.DynamicMethodInvocation" value="false" />
  10. <constant name="struts.devMode" value="true"/>
  11. <package name="lee" extends="struts-default">
  12. <action name="addBook" class="org.crazyit.booksys.action.BookAction"
  13. method="add">
  14. <!-- 添加图书成功,列出所有图书 -->
  15. <result type="chain">listBooks</result>
  16. <!-- 添加图书失败,跳转到添加图书的表单页 -->
  17. <result name="error">/WEB-INF/content/bookForm.jsp</result>
  18. </action>
  19. <action name="listBooks" class="org.crazyit.booksys.action.BookAction"
  20. method="list">
  21. <result>/WEB-INF/content/listBooks.jsp</result>
  22. </action>
  23. <action name="deleteBook" class="org.crazyit.booksys.action.BookAction"
  24. method="delete">
  25. <result type="chain">listBooks</result>
  26. </action>
  27. <!-- 让用户直接访问该应用时列出所有视图页面 -->
  28. <action name="*">
  29. <result>/WEB-INF/content/{1}.jsp</result>
  30. </action>
  31. </package>
  32. </struts>

6. Dao层设计


项目时分层设计结构,分为控制层、业务层、持久层(Dao)层、PO层(持久化对象),如下图:

在进行Dao层设计的时候,我们按照接口编程的原则,如下图所示:

dao层作为持久层,需要与数据库打交道,而所有的数据库操作基本都涉及增、删、改、查等相同的基本操作,而这些通用的操作主要包括:

  1. 根据ID加载实体;
  2. 保存实体;
  3. 更新实体;
  4. 删除实体;
  5. 根据ID删除实体;
  6. 获取所有实体;
  7. 获取实体总数;
  8. 等等等;

我们可以编写一个dao层基类来实现这些基本操作,然后让其他的dao层类来继承这个基类,这样就可以减少重复的工作量。

dao层基类的编写也采用按照接口编程的原则,这样我们就可以得到继承关系图,如下所示:





dao层基类接口:BaseDao.java


  1. package org.crazyit.common.dao;
  2. import java.util.List;
  3. import java.io.Serializable;
  4. public interface BaseDao<T>
  5. {
  6. // 根据ID加载实体
  7. T get(Class<T> entityClazz , Serializable id);
  8. // 保存实体
  9. Serializable save(T entity);
  10. // 更新实体
  11. void update(T entity);
  12. // 删除实体
  13. void delete(T entity);
  14. // 根据ID删除实体
  15. void delete(Class<T> entityClazz , Serializable id);
  16. // 获取所有实体
  17. List<T> findAll(Class<T> entityClazz);
  18. // 获取实体总数
  19. long findCount(Class<T> entityClazz);
  20. }

dao层基类实现类:BaseDaoHibernate4.java

说明:程序中有两个实现类,分别对应Hibernate3和Hibernate4的,我们推荐使用Hibernate4的实现类。

Hibernate配置时,需要配置sessionFactory,这个sessionFactory实际上就是对应数据库,我们可以通过sessionFactory获取对应的session(相当于数据库连接),然后通过session对数据库进行访问,因此,如果我们想对数据库进行操作,就需要获取sessionFactory,而这个sessionFactory的获取我们采用spring的依赖注入方式,只需要在实现类中配置这个sessionFactory属性即可。

* 1. Spring推荐使用sessionFactory的getCurrentSession()来获取Session,

* 然后通过Session进行持久化操作。 ==> BaseDaoHibernate4.java

*

* 2. Spring并不推荐使用HibernateTemplate、HibernateDaoSupport来实现Dao组件,

* Spring4为了和以前编码风格兼容,才提供了HibernateTemplate、HibernateDaoSupport;

* ==>==> BaseDaoHibernate3.java

  1. package org.crazyit.common.dao.impl;
  2. import org.hibernate.*;
  3. import java.util.List;
  4. import java.io.Serializable;
  5. import org.crazyit.common.dao.*;
  6. /***********************************
  7. * 1. Spring推荐使用sessionFactory的getCurrentSession()来获取Session,
  8. * 然后通过Session进行持久化操作。 ==> BaseDaoHibernate4.java
  9. *
  10. * 2. Spring并不推荐使用HibernateTemplate、HibernateDaoSupport来实现Dao组件,
  11. * Spring4为了和以前编码风格兼容,才提供了HibernateTemplate、HibernateDaoSupport;
  12. * ==>==> BaseDaoHibernate3.java
  13. *
  14. ***********************************/
  15. public class BaseDaoHibernate4<T> implements BaseDao<T>
  16. {
  17. // DAO组件进行持久化操作底层依赖的SessionFactory组件
  18. private SessionFactory sessionFactory;
  19. // 依赖注入SessionFactory所需的setter方法
  20. public void setSessionFactory(SessionFactory sessionFactory)
  21. {
  22. this.sessionFactory = sessionFactory;
  23. }
  24. public SessionFactory getSessionFactory()
  25. {
  26. return this.sessionFactory;
  27. }
  28. // 根据ID加载实体
  29. @SuppressWarnings("unchecked")
  30. public T get(Class<T> entityClazz , Serializable id)
  31. {
  32. return (T)getSessionFactory().getCurrentSession()
  33. .get(entityClazz , id);
  34. }
  35. // 保存实体
  36. public Serializable save(T entity)
  37. {
  38. return getSessionFactory().getCurrentSession()
  39. .save(entity);
  40. }
  41. // 更新实体
  42. public void update(T entity)
  43. {
  44. getSessionFactory().getCurrentSession().saveOrUpdate(entity);
  45. }
  46. // 删除实体
  47. public void delete(T entity)
  48. {
  49. getSessionFactory().getCurrentSession().delete(entity);
  50. }
  51. // 根据ID删除实体
  52. public void delete(Class<T> entityClazz , Serializable id)
  53. {
  54. getSessionFactory().getCurrentSession()
  55. .createQuery("delete " + entityClazz.getSimpleName()
  56. + " en where en.id = ?0")
  57. .setParameter("0" , id)
  58. .executeUpdate();
  59. }
  60. // 获取所有实体
  61. public List<T> findAll(Class<T> entityClazz)
  62. {
  63. return find("select en from "
  64. + entityClazz.getSimpleName() + " en");
  65. }
  66. // 获取实体总数
  67. public long findCount(Class<T> entityClazz)
  68. {
  69. List<?> l = find("select count(*) from "
  70. + entityClazz.getSimpleName());
  71. // 返回查询得到的实体总数
  72. if (l != null && l.size() == 1 )
  73. {
  74. return (Long)l.get(0);
  75. }
  76. return 0;
  77. }
  78. // 根据HQL语句查询实体
  79. @SuppressWarnings("unchecked")
  80. protected List<T> find(String hql)
  81. {
  82. return (List<T>)getSessionFactory().getCurrentSession()
  83. .createQuery(hql)
  84. .list();
  85. }
  86. // 根据带占位符参数HQL语句查询实体
  87. @SuppressWarnings("unchecked")
  88. protected List<T> find(String hql , Object... params)
  89. {
  90. // 创建查询
  91. Query query = getSessionFactory().getCurrentSession()
  92. .createQuery(hql);
  93. // 为包含占位符的HQL语句设置参数
  94. for(int i = 0 , len = params.length ; i < len ; i++)
  95. {
  96. query.setParameter(i + "" , params[i]);
  97. }
  98. return (List<T>)query.list();
  99. }
  100. /**
  101. * 使用hql 语句进行分页查询操作
  102. * @param hql 需要查询的hql语句
  103. * @param pageNo 查询第pageNo页的记录
  104. * @param pageSize 每页需要显示的记录数
  105. * @return 当前页的所有记录
  106. */
  107. @SuppressWarnings("unchecked")
  108. protected List<T> findByPage(String hql,
  109. int pageNo, int pageSize)
  110. {
  111. // 创建查询
  112. return getSessionFactory().getCurrentSession()
  113. .createQuery(hql)
  114. // 执行分页
  115. .setFirstResult((pageNo - 1) * pageSize)
  116. .setMaxResults(pageSize)
  117. .list();
  118. }
  119. /**
  120. * 使用hql 语句进行分页查询操作
  121. * @param hql 需要查询的hql语句
  122. * @param params 如果hql带占位符参数,params用于传入占位符参数
  123. * @param pageNo 查询第pageNo页的记录
  124. * @param pageSize 每页需要显示的记录数
  125. * @return 当前页的所有记录
  126. */
  127. @SuppressWarnings("unchecked")
  128. protected List<T> findByPage(String hql , int pageNo, int pageSize
  129. , Object... params)
  130. {
  131. // 创建查询
  132. Query query = getSessionFactory().getCurrentSession()
  133. .createQuery(hql);
  134. // 为包含占位符的HQL语句设置参数
  135. for(int i = 0 , len = params.length ; i < len ; i++)
  136. {
  137. query.setParameter(i + "" , params[i]);
  138. }
  139. // 执行分页,并返回查询结果
  140. return query.setFirstResult((pageNo - 1) * pageSize)
  141. .setMaxResults(pageSize)
  142. .list();
  143. }
  144. }

上面介绍的是Hibernate4推荐使用的方式,当然,我们也可以使用HibernateTemplete和HibernateDaoSupport来实现这个基类,这种方式主要是Hibernate3使用的方式,现在不推荐。

HibernateTemplete是spring提供的模板,这里面封装好了基本的数据库操作方法。

HibernateDaoSupport提供了两个方法:

  1. getHibernateTemplate():获取HibernateTemplate,通过HibernateTemplate来实现数据库操作;
  2. setSessionFactory():使用spring的依赖注入;

BaseDaoHibernate3.java




  1. package org.crazyit.common.dao.impl;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. import org.crazyit.common.dao.BaseDao;
  5. import org.hibernate.*;
  6. import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
  7. import org.springframework.orm.hibernate4.HibernateCallback;
  8. /***********************************
  9. * 1. Spring推荐使用sessionFactory的getCurrentSession()来获取Session,
  10. * 然后通过Session进行持久化操作。 ==> BaseDaoHibernate4.java
  11. *
  12. * 2. Spring并不推荐使用HibernateTemplate、HibernateDaoSupport来实现Dao组件,
  13. * Spring4为了和以前编码风格兼容,才提供了HibernateTemplate、HibernateDaoSupport;
  14. * ==>==> BaseDaoHibernate3.java
  15. *
  16. ***********************************/
  17. public class BaseDaoHibernate3<T> extends HibernateDaoSupport
  18. implements BaseDao<T>
  19. {
  20. // 根据ID加载实体
  21. public T get(Class<T> entityClazz, Serializable id)
  22. {
  23. return getHibernateTemplate().get(entityClazz, id);
  24. }
  25. // 保存实体
  26. public Serializable save(T entity)
  27. {
  28. return getHibernateTemplate().save(entity);
  29. }
  30. // 更新实体
  31. public void update(T entity)
  32. {
  33. getHibernateTemplate().saveOrUpdate(entity);
  34. }
  35. // 删除实体
  36. public void delete(T entity)
  37. {
  38. getHibernateTemplate().delete(entity);
  39. }
  40. // 根据ID删除实体
  41. public void delete(Class<T> entityClazz, Serializable id)
  42. {
  43. delete(get(entityClazz , id));
  44. }
  45. @Override
  46. @SuppressWarnings("unchecked")
  47. public List<T> findAll(Class<T> entityClazz)
  48. {
  49. return (List<T>)getHibernateTemplate().find("select en from "
  50. + entityClazz.getSimpleName() + " en");
  51. }
  52. @Override
  53. @SuppressWarnings("unchecked")
  54. public long findCount(Class<T> entityClazz)
  55. {
  56. List<Long> list = (List<Long>)getHibernateTemplate().find(
  57. "select count(*) from " + entityClazz.getSimpleName() + " en");
  58. return list.get(0);
  59. }
  60. /**
  61. * 使用hql 语句进行分页查询操作
  62. * @param hql 需要查询的hql语句
  63. * @param pageNo 查询第pageNo页的记录
  64. * @param pageSize 每页需要显示的记录数
  65. * @return 当前页的所有记录
  66. */
  67. @SuppressWarnings("unchecked")
  68. protected List<T> findByPage(final String hql,
  69. final int pageNo, final int pageSize)
  70. {
  71. // 通过一个HibernateCallback对象来执行查询
  72. List<T> list = getHibernateTemplate()
  73. .execute(new HibernateCallback<List<T>>(){
  74. // 实现HibernateCallback接口必须实现的方法
  75. public List<T> doInHibernate(Session session)
  76. {
  77. // 执行Hibernate分页查询
  78. List<T> result = session.createQuery(hql)
  79. .setFirstResult((pageNo - 1) * pageSize)
  80. .setMaxResults(pageSize)
  81. .list();
  82. return result;
  83. }
  84. });
  85. return list;
  86. }
  87. /**
  88. * 使用hql 语句进行分页查询操作
  89. * @param hql 需要查询的hql语句
  90. * @param pageNo 查询第pageNo页的记录
  91. * @param pageSize 每页需要显示的记录数
  92. * @param params 如果hql带占位符参数,params用于传入占位符参数
  93. * @return 当前页的所有记录
  94. */
  95. @SuppressWarnings("unchecked")
  96. protected List<T> findByPage(final String hql , final int pageNo,
  97. final int pageSize , final Object... params)
  98. {
  99. // 通过一个HibernateCallback对象来执行查询
  100. List<T> list = getHibernateTemplate()
  101. .execute(new HibernateCallback<List<T>>()
  102. {
  103. // 实现HibernateCallback接口必须实现的方法
  104. public List<T> doInHibernate(Session session)
  105. {
  106. // 执行Hibernate分页查询
  107. Query query = session.createQuery(hql);
  108. // 为包含占位符的HQL语句设置参数
  109. for(int i = 0 , len = params.length ; i < len ; i++)
  110. {
  111. query.setParameter(i + "" , params[i]);
  112. }
  113. List<T> result = query.setFirstResult((pageNo - 1) * pageSize)
  114. .setMaxResults(pageSize)
  115. .list();
  116. return result;
  117. }
  118. });
  119. return list;
  120. }
  121. }

6.2 dao层具体类的实现


这是BookDao的接口和实现类;

我们需要让BookDao继承BaseDao,让BookDaoHibernate4类继承BaseDaoHibernate4;如下图所示:

接口:BookDao.java


  1. package org.crazyit.booksys.dao;
  2. import org.crazyit.booksys.domain.Book;
  3. import org.crazyit.common.dao.BaseDao;
  4. public interface BookDao extends BaseDao<Book>
  5. {
  6. }

实现类:BookDaoHibernate4.java


  1. package org.crazyit.booksys.dao.impl;
  2. import org.crazyit.booksys.dao.BookDao;
  3. import org.crazyit.booksys.domain.Book;
  4. import org.crazyit.common.dao.impl.BaseDaoHibernate4;
  5. /**
  6. * Spring推荐使用继承前面的BaseDaoHibernate4,也可以继承前面的BaseDaoHibernate3
  7. */
  8. public class BookDaoHibernate4 extends BaseDaoHibernate4<Book>
  9. implements BookDao{
  10. }

对应的spring配置==>依赖注入:sessionFactory;

BookDaoHibernate4继承了BaseDaoHibernate4,而BaseDaoHibernate4有SessionFactory属性;

7. 持久层类的编写


Book.java:为持久层类,与数据表相对应;

  1. package org.crazyit.booksys.domain;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name="book_inf")
  5. public class Book
  6. {
  7. @Id @Column(name="book_id")
  8. @GeneratedValue(strategy=GenerationType.IDENTITY)
  9. private Integer id;
  10. @Column(name="book_name")
  11. private String name;
  12. private double price;
  13. private String author;
  14. public Integer getId()
  15. {
  16. return id;
  17. }
  18. public void setId(Integer id)
  19. {
  20. this.id = id;
  21. }
  22. public String getName()
  23. {
  24. return name;
  25. }
  26. public void setName(String name)
  27. {
  28. this.name = name;
  29. }
  30. public double getPrice()
  31. {
  32. return price;
  33. }
  34. public void setPrice(double price)
  35. {
  36. this.price = price;
  37. }
  38. public String getAuthor()
  39. {
  40. return author;
  41. }
  42. public void setAuthor(String author)
  43. {
  44. this.author = author;
  45. }
  46. }

因为我们在spring的配置文件中配置了:

而Book类又添加了注解:

所以,spring容器会自动将book类看作是持久化类;

与此同时,我们还在spring配置文件中配置了:hibernate.hbm2ddl.auto=update


所以当我们第一次运行程序,执行数据库操作时,会在数据库中自动生成数据表:

8. 控制层和业务层


控制层:BookAction.java

  1. package org.crazyit.booksys.action;
  2. import java.util.List;
  3. import org.crazyit.booksys.domain.Book;
  4. import org.crazyit.booksys.service.BookService;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. public class BookAction extends ActionSupport
  7. {
  8. private BookService bookService; //业务层组件
  9. private Book book;
  10. private List<Book> books;
  11. private int id;
  12. // 处理添加图书的add()方法
  13. public String add()
  14. {
  15. if(book == null){
  16. book = new Book();
  17. book.setAuthor("zhangsan");
  18. book.setName("zhangsan");
  19. book.setPrice(123);
  20. }
  21. // 调用业务逻辑组件的addBook()方法来处理用户请求
  22. int result = bookService.addBook(book);
  23. if(result > 0)
  24. {
  25. addActionMessage("恭喜您,图书添加成功!");
  26. return SUCCESS;
  27. }
  28. addActionError("图书添加失败,请重新输入!");
  29. return ERROR;
  30. }
  31. public String list()
  32. {
  33. setBooks(bookService.getAllBooks());
  34. return SUCCESS;
  35. }
  36. public String delete()
  37. {
  38. bookService.deleteBook(id);
  39. return SUCCESS;
  40. }
  41. public void setBookService(BookService bookService)
  42. {
  43. this.bookService = bookService;
  44. }
  45. public Book getBook()
  46. {
  47. return book;
  48. }
  49. public void setBook(Book book)
  50. {
  51. this.book = book;
  52. }
  53. public List<Book> getBooks()
  54. {
  55. return books;
  56. }
  57. public void setBooks(List<Book> books)
  58. {
  59. this.books = books;
  60. }
  61. public int getId()
  62. {
  63. return id;
  64. }
  65. public void setId(int id)
  66. {
  67. this.id = id;
  68. }
  69. }

bookService 采用依赖注入的方式:

业务层:

接口:BookService.java

  1. package org.crazyit.booksys.service;
  2. import java.util.List;
  3. import org.crazyit.booksys.domain.Book;
  4. public interface BookService
  5. {
  6. // 添加图书
  7. int addBook(Book book);
  8. List<Book> getAllBooks();
  9. void deleteBook(int id);
  10. }

实现类:BookServiceImpl.java


  1. package org.crazyit.booksys.service.impl;
  2. import java.util.List;
  3. import org.crazyit.booksys.dao.BookDao;
  4. import org.crazyit.booksys.domain.Book;
  5. import org.crazyit.booksys.service.BookService;
  6. public class BookServiceImpl implements BookService
  7. {
  8. private BookDao bookDao;
  9. public void setBookDao(BookDao bookDao)
  10. {
  11. this.bookDao = bookDao;
  12. }
  13. @Override
  14. public int addBook(Book book)
  15. {
  16. return (Integer) bookDao.save(book);
  17. }
  18. @Override
  19. public List<Book> getAllBooks()
  20. {
  21. return bookDao.findAll(Book.class);
  22. }
  23. @Override
  24. public void deleteBook(int id)
  25. {
  26. bookDao.delete(Book.class, id);
  27. }
  28. }

9. 前台界面


bookForm.jsp


  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <title>添加图书</title>
  8. </head>
  9. <body>
  10. <h3>添加图书</h3>
  11. <s:form action="addBook">
  12. <s:textfield name="book.name" label="书名"/>
  13. <s:textfield name="book.price" label="价格"/>
  14. <s:textfield name="book.author" label="作者"/>
  15. <tr align="center">
  16. <td colspan="2">
  17. <s:submit value="添加" theme="simple"/>
  18. <s:reset value="重设" theme="simple"/>
  19. </td>
  20. </tr>
  21. </s:form>
  22. </body>
  23. </html>

listBooks.jsp


  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <title>全部图书</title>
  8. </head>
  9. <body>
  10. <h3>全部图书</h3>
  11. <table width="640" border="1">
  12. <s:iterator value="books" var="b">
  13. <tr>
  14. <td><s:property value="name"/></td>
  15. <td><s:property value="price"/></td>
  16. <td><s:property value="author"/></td>
  17. <td><a href="${pageContext.request.contextPath}/deleteBook?id=${b.id}">删除</a></td>
  18. </tr>
  19. </s:iterator>
  20. </table>
  21. </body>
  22. </html>

10.运行


网址:http://localhost:8080/SpringStrutsHibernate/bookForm 


来自为知笔记(Wiz)

附件列表

时间: 2024-10-09 18:23:10

【Spring实战-3】Spring整合Hibernate、Struts的相关文章

(一)《Spring实战》——Spring核心

<Spring实战>(第4版) 第一章:Spring之旅 1. 简化Java开发 为了降低Java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明式编程: 通过切面和模板减少样板式代码. 1.1 激发POJO的潜能 在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring.最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO. Spring赋予POJO魔力的

Spring实战-Spring in Action, 4th Edition-2015年第4版本

In Action系列中最畅销的Spring图书,近十万读者学习Spring的共同选择!In Action系列中最畅销的Spring图书,有近10万读者选择本书来学习Spring! Spring框架已经成为Java开发人员的必备知识,而且Spring 3引入了强大的新特性,例如SpEL.Spring表达式语言.IoC容器的新注解以及用户急需的对REST的支持.无论你是刚刚接触Spring还是被Spring 3.0的新特性所吸引,本书都是掌握Spring的最佳选择. 下载地址: Spring in

Spring 学习笔记之整合Hibernate

Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心SQL语句,直接与对象打交道. Spring提供了对Hibernate的SessionFactory的集成功能. 1.建立Spring的bean.xml文件,在其里面配置 SessionFactory 以及事务,在hibernate.cfg.xml中不需要配置什么. <!-- 配置 Hibernate

Spring学习笔记之整合hibernate

1.web.xml里边要配置好对应的springxml的路径 <context-param> <param-name>contextConfigLocation</param-name> <param-value> conf/kernel/spring_kernel/spring-*.xml, conf/business/spring_business/spring-*.xml, conf/custom/spring_custom/spring-*.xml

(二)《Spring实战》——Spring核心

第二章:装配Bean 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件.订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件. 创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质. 1. Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,

条理清晰的搭建SSH环境之整合Hibernate和Spring

上篇博客整合了Struts和Spring,感觉很简单,这篇博客主要讲述Hibernate和Spring的整合. 如果说上篇博客中的整合是以为Spring的IOC可以管理对象,让Struts2里的对象管理变得更方便.那么Hibernate与Spring的整合的好处就是,可以将SessionFactory的实例交由Spring容器管理,那么我们只需要这一个实例就可以了.还有一点就是声明式的事务管理非常方便. 需要以下配置: 1.配置applicationContext.xml文件,添加配置sessi

Spring 整合hibernate和mybatis的 applicationContext.xml的配置

Spring整合hibernate的applicationContext.xml配置 1.注解方式的实现 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x

Spring(四):Spring整合Hibernate,之后整合Struts2

背景: 上一篇文章<Spring(三):Spring整合Hibernate>已经介绍使用spring-framework-4.3.8.RELEASE与hibernate-release-5.2.9.Final项目整合搭建的过程,本文基于上一篇文章的基础之上,整合Struts2. 开发环境简介: 1).jdk 1.8 2).spring-framework-4.3.8.RELEASE.hibernate-release-5.2.9.Final.struts-2.3.31 引入Struts2的ja

JavaWeb_(Spring框架)Spring整合Hibernate

Dao层类要继承HibernateDaoSupport.java父类 原先使用Hibernate框架hibernate.cfg.xml配置数据库 <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name=&q