转自:https://blog.csdn.net/tkd03072010/article/details/7468769
Struts2+Hibernate+Spring 整合示例
Spring整合Struts2、Hibernate原理概述:
从用户角度来看,用户发出HTTP请求,当MVC框架的控制器组件拦截到用户请求时,将调用系统的业务逻辑组件,业务逻辑组件则调用系统的DAO组件,而DAO组件则依赖于SessionFactory和DataSource等底层组件实现数据库访问。
从系统实现角度看,Ioc容器先创建SessionFactory和DataSource等底层组件,然后将这些底层组件注入给DAO组件,提供一个完整 的DAO组件,并将此DAO组件注入给业务逻辑组件,从而提供一个完整的业务逻辑组件,而业务逻辑组件又被注入给控制器组件,控制器组件负责拦截用户请 求,并将处理结果呈现给用户——这一系列的衔接,都由Spring的IoC容器提供实现。
简单来说,Spring通过IoC容器上管(Struts2)Action的创建并依赖注入给控制器,下管(Hibernate)SessionFactory的创建并依赖注入给DAO组件,是一个巨大的工厂。(个人理解)
源代码下载:Regist_S2SH.rar
1.项目结构:
2.web.xml配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 <welcome-file-list> 7 <welcome-file>index.jsp</welcome-file> 8 </welcome-file-list> 9 <!-- 使用ContextLoaderListener初始化Spring容器 --> 10 <listener> 11 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 12 </listener> 13 <!-- 定义Struts 2的FilterDispathcer的Filter --> 14 <filter> 15 <filter-name>struts2</filter-name> 16 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 17 </filter> 18 <!-- FilterDispatcher用来初始化Struts 2并且处理所有的WEB请求。 --> 19 <filter-mapping> 20 <filter-name>struts2</filter-name> 21 <url-pattern>/*</url-pattern> 22 </filter-mapping> 23 </web-app>
3.applicationContext.xml配置
1 <?xml version="1.0" encoding="GBK"?> 2 <!-- 指定Spring配置文件的Schema信息 --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 9 http://www.springframework.org/schema/tx 10 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 13 <!-- 定义数据源Bean,使用C3P0数据源实现 --> 14 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 15 destroy-method="close"> 16 <!-- 指定连接数据库的驱动 --> 17 <property name="driverClass" value="com.mysql.jdbc.Driver"/> 18 <!-- 指定连接数据库的URL --> 19 <property name="jdbcUrl" value="jdbc:mysql://localhost/javaee"/> 20 <!-- 指定连接数据库的用户名 --> 21 <property name="user" value="root"/> 22 <!-- 指定连接数据库的密码 --> 23 <property name="password" value="1120"/> 24 <!-- 指定连接数据库连接池的最大连接数 --> 25 <property name="maxPoolSize" value="40"/> 26 <!-- 指定连接数据库连接池的最小连接数 --> 27 <property name="minPoolSize" value="1"/> 28 <!-- 指定连接数据库连接池的初始化连接数 --> 29 <property name="initialPoolSize" value="1"/> 30 <!-- 指定连接数据库连接池的连接的最大空闲时间 --> 31 <property name="maxIdleTime" value="20"/> 32 </bean> 33 <!-- 定义Hibernate的SessionFactory --> 34 <bean id="sessionFactory" 35 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 36 <!-- 依赖注入数据源,注入正是上面定义的dataSource --> 37 <property name="dataSource" ref="dataSource"/> 38 <!-- mappingResouces属性用来列出全部映射文件 --> 39 <property name="mappingResources"> 40 <list> 41 <!-- 以下用来列出Hibernate映射文件 --> 42 <value>com/xqh/model/Person.hbm.xml</value> 43 </list> 44 </property> 45 <!-- 定义Hibernate的SessionFactory的属性 --> 46 <property name="hibernateProperties"> 47 <!-- 配置Hibernate属性 --> 48 <value> 49 hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect 50 hibernate.hbm2ddl.auto=update 51 hibernate.show_sql=true 52 hibernate.format_sql=true; 53 </value> 54 </property> 55 </bean> 56 <!-- 定义DAO Bean--> 57 <bean id="personDao" class= 58 "com.xqh.dao.impl.PersonDaoHibernate"> 59 <!-- 注入持久化操作所需的SessionFactory --> 60 <property name="sessionFactory" ref="sessionFactory"/> 61 </bean> 62 <!-- 配置一个业务逻辑组件 --> 63 <bean id="service" class= 64 "com.xqh.service.impl.ServiceImpl"> 65 <!-- 注入持久化访问所需的DAO组件 --> 66 <property name="personDao" ref="personDao"/> 67 </bean> 68 69 70 <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 --> 71 <!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现--> 72 <bean id="transactionManager" 73 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 74 <!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 --> 75 <property name="sessionFactory" ref="sessionFactory"/> 76 </bean> 77 <!-- 配置事务增强处理,指定事务管理器 --> 78 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 79 <!-- 用于配置详细的事务语义 --> 80 <tx:attributes> 81 <!-- 所有以'get'开头的方法是read-only的 --> 82 <tx:method name="get*" read-only="true"/> 83 <!-- 其他方法使用默认的事务设置 --> 84 <tx:method name="*"/> 85 </tx:attributes> 86 </tx:advice> 87 <aop:config> 88 <!-- 配置一个切入点 --> 89 <aop:pointcut id="pointcut" 90 expression="bean(service)"/> 91 <!-- 指定在pointcut切入点应用txAdvice事务增强处理 --> 92 <aop:advisor advice-ref="txAdvice" 93 pointcut-ref="pointcut"/> 94 </aop:config> 95 96 </beans>
4.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.1.7//EN" 5 "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 6 <!-- Struts 2配置文件的根元素 --> 7 <struts> 8 <!-- 配置了系列常量 --> 9 <constant name="struts.i18n.encoding" value="GBK"/> 10 <constant name="struts.devMode" value="true"/> 11 <package name="xqh" extends="struts-default"> 12 <!-- 定义处理用户请求的Action,指定该Action的实现类--> 13 <action name="registPro" 14 class="com.xqh.action.RegistAction"> 15 <!-- 为两个逻辑视图配置视图页面 --> 16 <result name="error">/error.jsp</result> 17 <result name="success">/welcome.jsp</result> 18 </action> 19 <!-- 让用户直接访问该应用时列出所有视图页面 --> 20 <action name="*"> 21 <result>/{1}.jsp</result> 22 </action> 23 </package> 24 </struts>
5.RegistAction.java代码清单:
1 package com.xqh.action; 2 3 import com.opensymphony.xwork2.Action; 4 import com.xqh.model.Person; 5 import com.xqh.service.Service; 6 7 public class RegistAction 8 implements Action 9 { 10 //下面是用于封装用户请求参数的属性 11 private Person person; 12 //用于封装处理结果的属性 13 private String tip; 14 //系统所用的业务逻辑组件 15 private Service service; 16 //设置注入业务逻辑组件所必需的setter方法 17 public void setService(Service service) 18 { 19 this.service = service; 20 } 21 22 //person属性的setter和getter方法 23 public void setPerson(Person person) 24 { 25 this.person = person; 26 } 27 public Person getPerson() 28 { 29 return this.person; 30 } 31 32 //tip属性的setter和getter方法 33 public void setTip(String tip) 34 { 35 this.tip = tip; 36 } 37 public String getTip() 38 { 39 return this.tip; 40 } 41 42 //处理用户请求的execute方法 43 public String execute() 44 throws Exception 45 { 46 //调用业务逻辑组件的regist方法来处理请求 47 if (service.regist(person)) 48 { 49 setTip("哈哈,注册成功!"); 50 return SUCCESS; 51 } 52 else 53 { 54 return ERROR; 55 } 56 } 57 }
6.personDao.java 代码清单:
1 package com.xqh.dao; 2 3 4 import java.util.List; 5 6 import com.xqh.model.Person; 7 8 public interface PersonDao 9 { 10 /** 11 * 加载Person实例 12 * @param id 需要加载的Person实例的主键值 13 * @return 返回加载的Person实例 14 */ 15 Person get(Integer id); 16 17 /** 18 * 保存Person实例 19 * @param person 需要保存的Person实例 20 * @return 刚刚保存的Person实例的标识属性值 21 */ 22 Integer save(Person person); 23 24 /** 25 * 修改Person实例 26 * @param person 需要修改的Person实例 27 */ 28 void update(Person person); 29 30 /** 31 * 删除Person实例 32 * @param id 需要删除的Person实例的标识属性值 33 */ 34 void delete(Integer id); 35 36 /** 37 * 删除Person实例 38 * @param person 需要删除的Person实例 39 */ 40 void delete(Person person); 41 42 /** 43 * 根据用户名查找Person 44 * @param name 查询的人名 45 * @return 指定用户名对应的全部Person 46 */ 47 List<Person> findByName(String name); 48 49 /** 50 * 查询全部Person实例 51 * @return 全部Person实例 52 */ 53 public List<Person> findAllPerson(); 54 }
7.personDaoHibernate.java代码清单:
1 package com.xqh.dao.impl; 2 3 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 4 5 import com.xqh.dao.PersonDao; 6 import com.xqh.model.Person; 7 8 import java.util.*; 9 10 public class PersonDaoHibernate 11 extends HibernateDaoSupport implements PersonDao 12 { 13 /** 14 * 加载Person实例 15 * @param id 需要加载的Person实例的标识属性值 16 * @return 指定id对应的Person实例 17 */ 18 public Person get(Integer id) 19 { 20 return getHibernateTemplate() 21 .get(Person.class, id); 22 } 23 24 /** 25 * 保存Person实例 26 * @param person 需要保存的Person实例 27 * @return 刚刚保存的Person实例的标识属性值 28 */ 29 public Integer save(Person person) 30 { 31 return (Integer)getHibernateTemplate() 32 .save(person); 33 } 34 35 /** 36 * 修改Person实例 37 * @param person 需要修改的Person实例 38 */ 39 public void update(Person person) 40 { 41 getHibernateTemplate().update(person); 42 } 43 44 /** 45 * 删除Person实例 46 * @param id 需要删除的Person实例的标识属性值 47 */ 48 public void delete(Integer id) 49 { 50 getHibernateTemplate().delete(get(id)); 51 } 52 53 /** 54 * 删除Person实例 55 * @param person 需要删除的Person实例 56 */ 57 public void delete(Person person) 58 { 59 getHibernateTemplate().delete(person); 60 } 61 62 /** 63 * 根据用户名查找Person 64 * @param name 查询的人名 65 * @return 指定用户名对应的全部Person 66 */ 67 @SuppressWarnings("unchecked") 68 public List<Person> findByName(String name) 69 { 70 return (List<Person>)getHibernateTemplate() 71 .find("from Person p where p.name like ?" , name); 72 } 73 74 /** 75 * 查询全部Person实例 76 * @return 全部Person实例 77 */ 78 @SuppressWarnings("unchecked") 79 public List<Person> findAllPerson() 80 { 81 return (List<Person>)getHibernateTemplate() 82 .find("from Person"); 83 } 84 }
8.Person.java代码清单:
1 package com.xqh.model; 2 3 public class Person 4 { 5 private Integer id; 6 private String name; 7 private int age; 8 9 //无参数的构造器 10 public Person() 11 { 12 } 13 //初始化全部属性的构造器 14 public Person(String name , int age) 15 { 16 this.name = name; 17 this.age = age; 18 } 19 20 //id属性的setter和getter方法 21 public void setId(Integer id) 22 { 23 this.id = id; 24 } 25 public Integer getId() 26 { 27 return this.id; 28 } 29 30 //name属性的setter和getter方法 31 public void setName(String name) 32 { 33 this.name = name; 34 } 35 public String getName() 36 { 37 return this.name; 38 } //age属性的setter和getter方法 39 public void setAge(int age) 40 { 41 this.age = age; 42 } 43 public int getAge() 44 { 45 return this.age; 46 } 47 }
9.Person.hbm.xml配置:
1 <?xml version="1.0" encoding="GBK"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.xqh.model"> 6 <class name="Person" table="tb_person"> 7 <!-- 映射标识属性 --> 8 <id name="id" column="Id" 9 type="int"> 10 <!-- 指定主键生成器策略 --> 11 <generator class="increment"/> 12 </id> 13 <!-- 映射普通属性 --> 14 <property name="name" type="string"/> 15 <property name="age" type="int"/> 16 </class> 17 </hibernate-mapping>
10.Service.java代码清单:
1 package com.xqh.service; 2 3 import com.xqh.model.Person; 4 5 public interface Service 6 { 7 //注册用户 8 boolean regist(Person person); 9 }
11.ServiceImpl.java代码清单:
1 package com.xqh.service.impl; 2 3 import com.xqh.dao.PersonDao; 4 import com.xqh.model.Person; 5 import com.xqh.service.Service; 6 7 public class ServiceImpl 8 implements Service 9 { 10 private PersonDao personDao; 11 //依赖注入DAO组件所需的setter方法 12 public void setPersonDao(PersonDao personDao) 13 { 14 this.personDao = personDao; 15 } 16 //注册用户 17 public boolean regist(Person person) 18 { 19 //调用DAO组件的方法来实现业务逻辑 20 int result = personDao.save(person); 21 if (result > 0) 22 { 23 return true; 24 } 25 return false; 26 } 27 }
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'login.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <h1>用户注册</h1> 27 <form action="xqh/registPro.action" method="post"> 28 ID:<input type="text" value="" name="person.id"><br/> 29 用户名:<input type="text" value="" name="person.name"><br/> 30 年龄:<input type="text" value="" name="person.age"><br/> 31 注册:<input type="submit" value="注册"> 32 重置:<input type="reset" value="重置"> 33 </form> 34 </body> 35 </html>
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'welcome.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 你好 欢迎光临 27 </body> 28 </html>