Spring+Struts2+Hibernate的整合

时间:2023-03-08 20:15:31

这篇主要采用Maven搭建Spring+Struts2+Hibernate的整合项目,复习一下SSH框架,虽然spring提供自己的MVC框架, 但是Spring也提供和其他框架的无缝整合,采用组件形式对个框架进行管理,项目实例是按照真实企业里面的开发搭建,也是web的最后一片了。数据库使 用mysql,连接池使用的是Druid数据源(这些都无关紧要,可以随时的替换),下面就将详细的介绍一下Maven搭建 Spring,Struts2,和hibernation的步奏。

1、数据库设计

数据库库表很简单,设计好数据库后,直接逆向生成实体,提高速度。数据库名为shop,只有一个表user_info。其结构如下:

Spring+Struts2+Hibernate的整合

2、创建Maven的webapp项目

创建maven项目,pom.xml配置中引入所需依赖包。

Spring+Struts2+Hibernate的整合

引入所需的依赖包,pom.xml内容如下:

  1. <span style="font-size:14px;">     <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.andy.ssh</groupId>
  5. <artifactId>spring_struts2_Hibernate_demo</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>spring_struts2_Hibernate_demo Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <spring.version>4.1.4.RELEASE</spring.version>
  13. <hibernate.version>4.3.8.Final</hibernate.version>
  14. <struts2.version>2.3.20</struts2.version>
  15. <jackson.version>2.5.0</jackson.version>
  16. </properties>
  17. <dependencies>
  18. <!-- junit -->
  19. <dependency>
  20. <groupId>junit</groupId>
  21. <artifactId>junit</artifactId>
  22. <version>4.12</version>
  23. <scope>test</scope>
  24. </dependency>
  25. <!-- spring -->
  26. <dependency>
  27. <groupId>org.springframework</groupId>
  28. <artifactId>spring-core</artifactId>
  29. <version>${spring.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-beans</artifactId>
  34. <version>${spring.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework</groupId>
  38. <artifactId>spring-context</artifactId>
  39. <version>${spring.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-tx</artifactId>
  44. <version>${spring.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework</groupId>
  48. <artifactId>spring-web</artifactId>
  49. <version>${spring.version}</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework</groupId>
  53. <artifactId>spring-test</artifactId>
  54. <version>${spring.version}</version>
  55. <scope>provided</scope>
  56. </dependency>
  57. <!-- 关系型数据库整合时需配置 如hibernate jpa等 -->
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-orm</artifactId>
  61. <version>${spring.version}</version>
  62. </dependency>
  63. <!-- hibernate -->
  64. <dependency>
  65. <groupId>org.hibernate</groupId>
  66. <artifactId>hibernate-core</artifactId>
  67. <version>${hibernate.version}</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.hibernate</groupId>
  71. <artifactId>hibernate-ehcache</artifactId>
  72. <version>${hibernate.version}</version>
  73. </dependency>
  74. <!-- struts2 -->
  75. <dependency>
  76. <groupId>org.apache.struts</groupId>
  77. <artifactId>struts2-core</artifactId>
  78. <version>${struts2.version}</version>
  79. <exclusions>
  80. <exclusion>
  81. <!-- Hibernate已经还有该包的依赖 -->
  82. <artifactId>javassist</artifactId>
  83. <groupId>javassist</groupId>
  84. </exclusion>
  85. </exclusions>
  86. </dependency>
  87. <dependency>
  88. <groupId>org.apache.struts</groupId>
  89. <artifactId>struts2-spring-plugin</artifactId>
  90. <version>${struts2.version}</version>
  91. </dependency>
  92. <dependency>
  93. <groupId>org.apache.struts</groupId>
  94. <artifactId>struts2-convention-plugin</artifactId>
  95. <version>${struts2.version}</version>
  96. </dependency>
  97. <!-- log4j -->
  98. <dependency>
  99. <groupId>log4j</groupId>
  100. <artifactId>log4j</artifactId>
  101. <version>1.2.17</version>
  102. </dependency>
  103. <!-- mysql连接 -->
  104. <dependency>
  105. <groupId>mysql</groupId>
  106. <artifactId>mysql-connector-java</artifactId>
  107. <version>5.1.34</version>
  108. </dependency>
  109. <!-- 数据源 druid -->
  110. <dependency>
  111. <groupId>com.alibaba</groupId>
  112. <artifactId>druid</artifactId>
  113. <version>1.0.12</version>
  114. </dependency>
  115. <!-- json -->
  116. <dependency>
  117. <groupId>com.alibaba</groupId>
  118. <artifactId>fastjson</artifactId>
  119. <version>1.2.3</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>com.fasterxml.jackson.core</groupId>
  123. <artifactId>jackson-annotations</artifactId>
  124. <version>${jackson.version}</version>
  125. </dependency>
  126. <dependency>
  127. <groupId>com.fasterxml.jackson.core</groupId>
  128. <artifactId>jackson-core</artifactId>
  129. <version>${jackson.version}</version>
  130. </dependency>
  131. <dependency>
  132. <groupId>com.fasterxml.jackson.core</groupId>
  133. <artifactId>jackson-databind</artifactId>
  134. <version>${jackson.version}</version>
  135. </dependency>
  136. <!-- aop -->
  137. <dependency>
  138. <groupId>org.aspectj</groupId>
  139. <artifactId>aspectjweaver</artifactId>
  140. <version>1.8.4</version>
  141. </dependency>
  142. <!-- servlet -->
  143. <dependency>
  144. <groupId>javax.servlet</groupId>
  145. <artifactId>servlet-api</artifactId>
  146. <version>3.0-alpha-1</version>
  147. <scope>provided</scope>
  148. </dependency>
  149. <dependency>
  150. <groupId>javax.servlet</groupId>
  151. <artifactId>jstl</artifactId>
  152. <version>1.2</version>
  153. </dependency>
  154. </dependencies>
  155. <build>
  156. <finalName>spring_struts2_Hibernate_demo</finalName>
  157. <plugins>
  158. <!-- Run the JUnit unit tests in an isolated classloader -->
  159. <plugin>
  160. <groupId>org.apache.maven.plugins</groupId>
  161. <artifactId>maven-surefire-plugin</artifactId>
  162. <version>2.4.2</version>
  163. <configuration>
  164. <skipTests>true</skipTests>
  165. </configuration>
  166. </plugin>
  167. <plugin>
  168. <groupId>org.apache.maven.plugins</groupId>
  169. <artifactId>maven-war-plugin</artifactId>
  170. <version>2.3</version>
  171. <configuration>
  172. <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
  173. </configuration>
  174. </plugin>
  175. <!-- generate java doc -->
  176. <plugin>
  177. <groupId>org.apache.maven.plugins</groupId>
  178. <artifactId>maven-javadoc-plugin</artifactId>
  179. <version>2.9.1</version>
  180. <configuration>
  181. <javadocDirectory>target/javadoc</javadocDirectory>
  182. <reportOutputDirectory>target/javadoc</reportOutputDirectory>
  183. <charset>UTF-8</charset>
  184. <encoding>UTF-8</encoding>
  185. <docencoding>UTF-8</docencoding>
  186. <show>private</show>
  187. </configuration>
  188. </plugin>
  189. <!-- 部署至本机 -->
  190. <plugin>
  191. <groupId>org.codehaus.cargo</groupId>
  192. <artifactId>cargo-maven2-plugin</artifactId>
  193. <version>1.0</version>
  194. <configuration>
  195. <container>
  196. <containerId>tomcat6x</containerId>
  197. <home>F:\apache-tomcat-7.0.27</home>
  198. </container>
  199. <configuration>
  200. <type>existing</type>
  201. <home>F:\apache-tomcat-7.0.27</home>
  202. </configuration>
  203. </configuration>
  204. </plugin>
  205. </plugins>
  206. </build>
  207. </project>
  208. </span>

以上就是ssh所需的所有依赖包。、

3、引入Spring

最优先引入的是Spring框架,他是管理其他框架的容器,spring中需要配置的是自动扫描的dao,和service层的注解,然后将其注入为bean,管理。

配置文件在src/main/java目录下,创建spring的配置文件spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-4.1.xsd">
  8. <!-- 加载配置文件 -->
  9. <context:property-placeholder location="classpath:config.properties"/>
  10. <!-- 扫描service自动注入为bean -->
  11. <context:component-scan base-package="org.andy.shop.service.impl,org.andy.shop.dao.impl" />
  12. </beans>

3.1、引入日志Log4j配置

log4j.properties配置内容如下:

  1. ### set log levels ###
  2. log4j.rootLogger = INFO , C , D , E
  3. ### console ###
  4. log4j.appender.C = org.apache.log4j.ConsoleAppender
  5. log4j.appender.C.Target = System.out
  6. log4j.appender.C.layout = org.apache.log4j.PatternLayout
  7. log4j.appender.C.layout.ConversionPattern = [spring_struts2_Hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  8. ### log file ###
  9. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
  10. log4j.appender.D.File = ../logs/spring_struts2_Hibernate_demo.log
  11. log4j.appender.D.Append = true
  12. log4j.appender.D.Threshold = INFO
  13. log4j.appender.D.layout = org.apache.log4j.PatternLayout
  14. log4j.appender.D.layout.ConversionPattern = [spring_struts2_Hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
  15. ### exception ###
  16. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
  17. log4j.appender.E.File = ../logs/spring_struts2_Hibernate_demo_error.log
  18. log4j.appender.E.Append = true
  19. log4j.appender.E.Threshold = ERROR
  20. log4j.appender.E.layout = org.apache.log4j.PatternLayout
  21. log4j.appender.E.layout.ConversionPattern = [spring_struts2_Hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n

3.2、项目配置文件

添加项目的配置文件config.properties,有spring管理。

  1. #application configs
  2. #jdbc druid config
  3. validationQuery = SELECT 1
  4. jdbc.url = jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8
  5. jdbc.username = root
  6. jdbc.password = root
  7. #hibernate config
  8. hibernate.dialect = org.hibernate.dialect.MySQLDialect
  9. hibernate.show_sql = true
  10. hibernate.format_sql = false
  11. hibernate.hbm2ddl.auto = update

4、引入Hibernation

Hibernation的配置主要有如下内容:数据源,SessionFactory,事务等的配置。

spring-hibernate.xml配置如下(配置文件名可以随便起)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
  12. <!-- 配置数据源 使用的是Druid数据源 -->
  13. <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  14. init-method="init" destroy-method="close">
  15. <property name="url" value="${jdbc.url}" />
  16. <property name="username" value="${jdbc.username}" />
  17. <property name="password" value="${jdbc.password}" />
  18. <!-- 初始化连接大小 -->
  19. <property name="initialSize" value="0" />
  20. <!-- 连接池最大使用连接数量 -->
  21. <property name="maxActive" value="20" />
  22. <!-- 连接池最小空闲 -->
  23. <property name="minIdle" value="0" />
  24. <!-- 获取连接最大等待时间 -->
  25. <property name="maxWait" value="60000" />
  26. <property name="poolPreparedStatements" value="true" />
  27. <property name="maxPoolPreparedStatementPerConnectionSize"
  28. value="33" />
  29. <!-- 用来检测有效sql -->
  30. <property name="validationQuery" value="${validationQuery}" />
  31. <property name="testOnBorrow" value="false" />
  32. <property name="testOnReturn" value="false" />
  33. <property name="testWhileIdle" value="true" />
  34. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  35. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  36. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  37. <property name="minEvictableIdleTimeMillis" value="25200000" />
  38. <!-- 打开removeAbandoned功能 -->
  39. <property name="removeAbandoned" value="true" />
  40. <!-- 1800秒,也就是30分钟 -->
  41. <property name="removeAbandonedTimeout" value="1800" />
  42. <!-- 关闭abanded连接时输出错误日志 -->
  43. <property name="logAbandoned" value="true" />
  44. <!-- 监控数据库 -->
  45. <property name="filters" value="mergeStat" />
  46. </bean>
  47. <!-- 配置hibernate的SessionFactory -->
  48. <bean id="sessionFactory"
  49. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  50. <!-- 注入数据源 相关信息看源码 -->
  51. <property name="dataSource" ref="dataSource" />
  52. <!-- hibernate配置信息 -->
  53. <property name="hibernateProperties">
  54. <props>
  55. <prop key="hibernate.dialect">${hibernate.dialect}</prop>
  56. <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
  57. <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
  58. <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
  59. </props>
  60. </property>
  61. <!-- 扫描hibernate注解配置的entity -->
  62. <property name="packagesToScan" value="org.andy.shop.entity" />
  63. </bean>
  64. <!-- 配置事务管理器 -->
  65. <bean id="transactionManager"
  66. class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  67. <property name="sessionFactory" ref="sessionFactory" />
  68. </bean>
  69. <!-- 配置事务增强处理Bean,指定事务管理器 -->
  70. <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
  71. <!-- 配置详细事务处理语义 -->
  72. <tx:attributes>
  73. <tx:method name="insert*" propagation="REQUIRED" />
  74. <tx:method name="update*" propagation="REQUIRED" />
  75. <tx:method name="delete*" propagation="REQUIRED" />
  76. <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
  77. <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
  78. <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
  79. <tx:method name="load*" propagation="SUPPORTS" read-only="true" />
  80. <!-- 其他采用默认事务方式 -->
  81. <tx:method name="*" />
  82. </tx:attributes>
  83. </tx:advice>
  84. <!-- Spring aop事务管理 -->
  85. <aop:config>
  86. <!-- 配置切入点 -->
  87. <aop:pointcut id="transactionPointcut"
  88. expression="execution(* org.andy.shop.service.impl.*Impl.*(..))" />
  89. <!-- 指定在txAdvice切入点应用txAdvice事务增强处理 -->
  90. <aop:advisor pointcut-ref="transactionPointcut"
  91. advice-ref="transactionAdvice" />
  92. </aop:config>
  93. </beans>

注意:Hibernation4使用的是SessionFactory而不是HibernationTemplate。

5、生成实体

我们先添加实体entity,Dao,Service,Action等几个包,一般设计如下:

Spring+Struts2+Hibernate的整合

设计好数据表之后,采用Hibernation tools自动逆向生成实体,其实体UserInfo如下:

  1. package org.andy.shop.entity;
  2. // Generated 2015-2-13 12:48:39 by Hibernate Tools 4.0.0
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import javax.persistence.Table;
  7. /**
  8. * UserInfo generated by hbm2java
  9. */
  10. @Entity
  11. @Table(name = "user_info", catalog = "shop")
  12. public class UserInfo implements java.io.Serializable {
  13. /**
  14. *
  15. */
  16. private static final long serialVersionUID = 5127853981202454040L;
  17. private int id;
  18. private String name;
  19. private Integer age;
  20. private String telephone;
  21. public UserInfo() {
  22. }
  23. public UserInfo(int id, String name) {
  24. this.id = id;
  25. this.name = name;
  26. }
  27. public UserInfo(int id, String name, Integer age, String telephone) {
  28. this.id = id;
  29. this.name = name;
  30. this.age = age;
  31. this.telephone = telephone;
  32. }
  33. @Id
  34. @Column(name = "id", unique = true, nullable = false)
  35. public int getId() {
  36. return this.id;
  37. }
  38. public void setId(int id) {
  39. this.id = id;
  40. }
  41. @Column(name = "name", nullable = false)
  42. public String getName() {
  43. return this.name;
  44. }
  45. public void setName(String name) {
  46. this.name = name;
  47. }
  48. @Column(name = "age")
  49. public Integer getAge() {
  50. return this.age;
  51. }
  52. public void setAge(Integer age) {
  53. this.age = age;
  54. }
  55. @Column(name = "telephone")
  56. public String getTelephone() {
  57. return this.telephone;
  58. }
  59. public void setTelephone(String telephone) {
  60. this.telephone = telephone;
  61. }
  62. }

6、创建Dao层

我们采用面向接口编程,所以先设计接口,在写dao的实现类,其理,同样适用于service层。

6.1、Dao层接口

我们先定义一个通用的GenericDao接口,如下:

  1. package org.andy.shop.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5. * 创建时间:2015-2-11 下午2:26:42
  6. *
  7. * @author andy
  8. * @version 2.2
  9. *
  10. * Dao通用接口
  11. */
  12. interface GenericDao<T, PK extends Serializable> {
  13. T load(PK id);
  14. T get(PK id);
  15. List<T> findAll();
  16. void persist(T entity);
  17. PK save(T entity);
  18. void saveOrUpdate(T entity);
  19. void delete(PK id);
  20. void flush();
  21. }

具体的UserInfo的Dao接口UserInfoDao如下:

  1. package org.andy.shop.dao;
  2. import org.andy.shop.entity.UserInfo;
  3. /**
  4. * 创建时间:2015-2-13 下午12:49:55
  5. * @author andy
  6. * @version 2.2
  7. * 描述: userDao
  8. */
  9. public interface UserInfoDao extends GenericDao<UserInfo, Integer> {
  10. }

6.2、Dao层实现类

UserInfo的Dao层实现类UserInfoDaoImpl如下:

  1. package org.andy.shop.dao.impl;
  2. import java.util.List;
  3. import org.andy.shop.dao.UserInfoDao;
  4. import org.andy.shop.entity.UserInfo;
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Repository;
  9. /**
  10. * 创建时间:2015-2-13 下午12:51:47
  11. *
  12. * @author andy
  13. * @version 2.2
  14. * 描述: dao实现类
  15. */
  16. @Repository("userInfoDao")
  17. public class UserInfoDaoImpl implements UserInfoDao {
  18. @Autowired
  19. private SessionFactory sessionFactory;
  20. private Session getCurrentSession() {
  21. return this.sessionFactory.getCurrentSession();
  22. }
  23. @Override
  24. public UserInfo load(Integer id) {
  25. return (UserInfo) this.getCurrentSession().load(UserInfo.class, id);
  26. }
  27. @Override
  28. public UserInfo get(Integer id) {
  29. return (UserInfo) this.getCurrentSession().get(UserInfo.class, id);
  30. }
  31. @SuppressWarnings("unchecked")
  32. @Override
  33. public List<UserInfo> findAll() {
  34. List<UserInfo> userInfos = this.getCurrentSession()
  35. .createQuery("from UserInfo").list();
  36. return userInfos;
  37. }
  38. @Override
  39. public void persist(UserInfo entity) {
  40. this.getCurrentSession().persist(entity);
  41. }
  42. @Override
  43. public Integer save(UserInfo entity) {
  44. return (Integer) this.getCurrentSession().save(entity);
  45. }
  46. @Override
  47. public void saveOrUpdate(UserInfo entity) {
  48. this.getCurrentSession().saveOrUpdate(entity);
  49. }
  50. @Override
  51. public void delete(Integer id) {
  52. UserInfo entity = this.load(id);
  53. this.getCurrentSession().delete(entity);
  54. }
  55. @Override
  56. public void flush() {
  57. this.getCurrentSession().flush();
  58. }
  59. }

我们采用@Repository注解将其注入为dao的bean,交由spring管理。

7、创建Service层

Service层同理按照面向接口编程。

7.1、Service层接口

UserInfo层接口UserInfoService如下:

  1. package org.andy.shop.service;
  2. import java.util.List;
  3. import org.andy.shop.entity.UserInfo;
  4. /**
  5. * 创建时间:2015-2-13 下午1:00:51
  6. * @author andy
  7. * @version 2.2
  8. * 描述:
  9. */
  10. public interface UserInfoService {
  11. UserInfo load(Integer id);
  12. UserInfo get(Integer id);
  13. List<UserInfo> findAll();
  14. void persist(UserInfo entity);
  15. Integer save(UserInfo entity);
  16. void saveOrUpdate(UserInfo entity);
  17. void delete(Integer id);
  18. void flush();
  19. }

7.2、service层实现类

service层我们使用@Service注解将其注入为bean。

  1. package org.andy.shop.service.impl;
  2. import java.util.List;
  3. import org.andy.shop.dao.UserInfoDao;
  4. import org.andy.shop.entity.UserInfo;
  5. import org.andy.shop.service.UserInfoService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. /**
  9. * 创建时间:2015-2-13 下午1:03:47
  10. *
  11. * @author andy
  12. * @version 2.2 描述:
  13. */
  14. @Service("userInfoService")
  15. public class UserInfoServiceImpl implements UserInfoService {
  16. @Autowired
  17. private UserInfoDao userInfoDao;
  18. @Override
  19. public UserInfo load(Integer id) {
  20. return null;
  21. }
  22. @Override
  23. public UserInfo get(Integer id) {
  24. return userInfoDao.get(id);
  25. }
  26. @Override
  27. public List<UserInfo> findAll() {
  28. return userInfoDao.findAll();
  29. }
  30. @Override
  31. public void persist(UserInfo entity) {
  32. userInfoDao.persist(entity);
  33. }
  34. @Override
  35. public Integer save(UserInfo entity) {
  36. return userInfoDao.save(entity);
  37. }
  38. @Override
  39. public void saveOrUpdate(UserInfo entity) {
  40. userInfoDao.saveOrUpdate(entity);
  41. }
  42. @Override
  43. public void delete(Integer id) {
  44. userInfoDao.delete(id);
  45. }
  46. @Override
  47. public void flush() {
  48. userInfoDao.flush();
  49. }
  50. }

8、单元测试Spring和Hibernation框架的整合

以上,spring和Hibernation框架就算是整合完成了,我们需要测试一下是否整合成功,事务是否起作用等,所以我们需要在src/test/java源目录中编写测试类,进行测试:

我们创建了TestUserService类,进行单元测试:

Spring+Struts2+Hibernate的整合

TestUserService内容如下:

  1. package org.andy.shop.service;
  2. import org.andy.shop.entity.UserInfo;
  3. import org.apache.log4j.Logger;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.test.context.ContextConfiguration;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9. import com.alibaba.fastjson.JSON;
  10. /**
  11. * 创建时间:2015-2-13 下午3:31:07
  12. *
  13. * @author andy
  14. * @version 2.2
  15. */
  16. @RunWith(SpringJUnit4ClassRunner.class)
  17. @ContextConfiguration(locations = { "classpath:spring.xml",
  18. "classpath:spring-hibernate.xml" })
  19. public class TestUserService {
  20. private static final Logger LOGGER = Logger
  21. .getLogger(TestUserService.class);
  22. @Autowired
  23. private UserInfoService userInfoService;
  24. @Test
  25. public void save() {
  26. UserInfo userInfo = new UserInfo();
  27. userInfo.setName("zty");
  28. userInfo.setAge(23);
  29. userInfo.setTelephone("13212221333");
  30. Integer id = userInfoService.save(userInfo);
  31. JSON.toJSONString(id);
  32. }
  33. }

我们需要引入springjunit的包,将spring配置加载,如果单元测试成功,那么项目搭建已经成功了一半了。

9、引入Struts2

配置Struts框架的配置文件,Struts2不同于前面的框架,其配置文件名必须为struts.xml,内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
  3. <struts>
  4. <!-- 指定由spring负责action对象的创建 -->
  5. <constant name="struts.objectFactory" value="spring" />
  6. <!-- 所有匹配*.action的请求都由struts2处理 -->
  7. <constant name="struts.action.extension" value="action" />
  8. <!-- 是否启用开发模式 -->
  9. <constant name="struts.devMode" value="true" />
  10. <!-- struts配置文件改动后,是aa否重新加载 -->
  11. <constant name="struts.configuration.xml.reload" value="true" />
  12. <!-- 设置浏览器是否缓存静态内容 -->
  13. <constant name="struts.serve.static.browserCache" value="false" />
  14. <!-- 请求参数的编码方式 -->
  15. <constant name="struts.i18n.encoding" value="utf-8" />
  16. <!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
  17. <constant name="struts.i18n.reload" value="true" />
  18. <!-- 文件上传最大值 -->
  19. <constant name="struts.multipart.maxSize" value="104857600" />
  20. <!-- 让struts2支持动态方法调用 -->
  21. <constant name="struts.enable.DynamicMethodInvocation" value="true" />
  22. <!-- Action名称中是否还是用斜线 -->
  23. <constant name="struts.enable.SlashesInActionNames" value="false" />
  24. <!-- 允许标签中使用表达式语法 -->
  25. <constant name="struts.tag.altSyntax" value="true" />
  26. <!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
  27. <constant name="struts.dispatcher.parametersWorkaround" value="false" />
  28. <!-- 用于CRUD Action的parent package -->
  29. <package name="crud-default" extends="convention-default">
  30. <!-- 基于paramsPrepareParamsStack, 增加store interceptor保证actionMessage在redirect后不会丢失 -->
  31. <interceptors>
  32. <interceptor-stack name="crudStack">
  33. <interceptor-ref name="store">
  34. <param name="operationMode">AUTOMATIC</param>
  35. </interceptor-ref>
  36. <interceptor-ref name="paramsPrepareParamsStack" />
  37. </interceptor-stack>
  38. </interceptors>
  39. <default-interceptor-ref name="crudStack" />
  40. </package>
  41. <!-- 使用Convention插件,实现约定大于配置的零配置文件风格. 特殊的Result路径在Action类中使用@Result设定. -->
  42. </struts>

上面配置的比较详细,可以按照实际项目,做一下筛检。

10、配置web容器web.xml

web.xml是web项目的核心,里面配置了容器启动是的加载文件,以及监听器,过滤器等内容,所以需要我们配置对个框架的启动,加载。其内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <display-name>spring_struts2_Hibernate_demo</display-name>
  7. <!-- spring 和  Hibernate的配置文件 -->
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>
  11. classpath:spring.xml
  12. classpath:spring-hibernate.xml
  13. </param-value>
  14. </context-param>
  15. <!-- 编码设置 -->
  16. <filter>
  17. <filter-name>encodingFilter</filter-name>
  18. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  19. <init-param>
  20. <param-name>encoding</param-name>
  21. <param-value>utf-8</param-value>
  22. </init-param>
  23. <init-param>
  24. <param-name>forceEncoding</param-name>
  25. <param-value>true</param-value>
  26. </init-param>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>encodingFilter</filter-name>
  30. <url-pattern>/*</url-pattern>
  31. </filter-mapping>
  32. <!-- openSessionInView配置 作用是延迟session关闭到view层 -->
  33. <filter>
  34. <filter-name>openSessionInViewFilter</filter-name>
  35. <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  36. <init-param>
  37. <param-name>singleSession</param-name>
  38. <param-value>true</param-value>
  39. </init-param>
  40. </filter>
  41. <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 -->
  42. <listener>
  43. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  44. </listener>
  45. <!-- 防止spring内存溢出监听器 -->
  46. <listener>
  47. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  48. </listener>
  49. <!-- Struts2 filter -->
  50. <filter>
  51. <filter-name>struts2</filter-name>
  52. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  53. </filter>
  54. <filter-mapping>
  55. <filter-name>struts2</filter-name>
  56. <url-pattern>*.action</url-pattern>
  57. </filter-mapping>
  58. <filter-mapping>
  59. <filter-name>openSessionInViewFilter</filter-name>
  60. <url-pattern>*.action</url-pattern>
  61. </filter-mapping>
  62. <!-- 配置session超时时间,单位分钟 -->
  63. <session-config>
  64. <session-timeout>30</session-timeout>
  65. </session-config>
  66. <welcome-file-list>
  67. <welcome-file>/index.jsp</welcome-file>
  68. </welcome-file-list>
  69. </web-app>

注意:上面Hibernation4和3还是有点区别的。

11、创建控制层Action

控制层Struts2我们采用annotation 约束注解方式实现action的零配置,需要我们在WEB-INF下创建content目录(必须是content),里面存放是视图层jsp。

UserinfoAction内容如下:

  1. package org.andy.shop.action;
  2. import java.util.List;
  3. import org.andy.shop.entity.UserInfo;
  4. import org.andy.shop.service.UserInfoService;
  5. import org.andy.shop.utils.AjaxUtil;
  6. import org.apache.log4j.Logger;
  7. import org.apache.struts2.ServletActionContext;
  8. import org.apache.struts2.convention.annotation.Namespace;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import com.opensymphony.xwork2.ActionSupport;
  11. import com.opensymphony.xwork2.ModelDriven;
  12. import com.opensymphony.xwork2.Preparable;
  13. /**
  14. * 创建时间:2015-2-13 下午2:49:22
  15. *
  16. * @author andy
  17. * @version 2.2 描述: user的Action
  18. */
  19. @Namespace("/user")
  20. public class UserinfoAction extends ActionSupport implements
  21. ModelDriven<UserInfo>, Preparable {
  22. private static final long serialVersionUID = -2301203156032690317L;
  23. private static final Logger LOGGER = Logger.getLogger(UserinfoAction.class);
  24. private Integer id;
  25. private UserInfo userInfo;
  26. private List<UserInfo> userInfos;
  27. @Autowired
  28. private UserInfoService userInfoService;
  29. public Integer getId() {
  30. return id;
  31. }
  32. public void setId(Integer id) {
  33. this.id = id;
  34. }
  35. public UserInfo getUserInfo() {
  36. return userInfo;
  37. }
  38. public void setUserInfo(UserInfo userInfo) {
  39. this.userInfo = userInfo;
  40. }
  41. public List<UserInfo> getUserInfos() {
  42. return userInfos;
  43. }
  44. public void setUserInfos(List<UserInfo> userInfos) {
  45. this.userInfos = userInfos;
  46. }
  47. @Override
  48. public UserInfo getModel() {
  49. if (null != id) {
  50. userInfo = userInfoService.get(id);
  51. } else {
  52. userInfo = new UserInfo();
  53. }
  54. return userInfo;
  55. }
  56. @Override
  57. public String execute() throws Exception {
  58. LOGGER.info("查询所有用户");
  59. userInfos = userInfoService.findAll();
  60. return SUCCESS;
  61. }
  62. public void detail() {
  63. String id = ServletActionContext.getRequest().getParameter("id");
  64. LOGGER.info("查看用户详情:" + id);
  65. userInfo = userInfoService.get(Integer.valueOf(id));
  66. AjaxUtil.ajaxJSONResponse(userInfo);
  67. }
  68. @Override
  69. public void prepare() throws Exception {
  70. }
  71. }

按照约束原则,上面success是会跳转到content下的/user/userinfo.jsp视图。

注意:如果上述的UserinfoAction写出了UserInfoAction,那么对应的视图为/user/user-info.jsp,对应的Action为user-info.action

12、创建视图层

视图userinfo.jsp内容如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
  4. <%
  5. String path = request.getContextPath();
  6. String basePath = request.getScheme() + "://"
  7. + request.getServerName() + ":" + request.getServerPort()
  8. + path + "/";
  9. %>
  10. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  11. <html>
  12. <head>
  13. <base href="<%=basePath%>" />
  14. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  15. <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
  16. <title>userInfo</title>
  17. </head>
  18. <body>
  19. 全部用户信息:
  20. <c:forEach items="${ userInfos}" var="user">
  21. <div>  姓
    名:${user.name }   年龄:${user.age }    电
    话: ${user.telephone }  <a target="_blank" href="user/userinfo!detail.action?id=${user.id}"&
    gt;json详情</a></div>
  22. </c:forEach>
  23. </body>
  24. </html>

通过这个视图,我们可以测试UserinfoAction中的两个url。

13、部署服务器测试

使用Maven打包部署:clean compile  package

测试   http://localhost:8080/spring_struts2_Hibernate_demo/user/userinfo.action

Spring+Struts2+Hibernate的整合

json返回数据  http://localhost:8080/spring_struts2_Hibernate_demo/user/userinfo!detail.action?id=1

Spring+Struts2+Hibernate的整合

OK,到此为止Spring+Struts2+Hibernate全部搭建完成。

博客来源http://blog.****.net/fengshizty?viewmode=list

项目源码http://download.****.net/detail/fengshizty/8464569