• Struts2+Hibernate+Spring 整合示例[转]


    原文 http://blog.csdn.net/tkd03072010/article/details/7468769

    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配置文件:

    [html] view plaincopy
     
    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配置

    [html] view plaincopy
     
    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配置:

    [html] view plaincopy
     
    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代码清单:

    [java] view plaincopy
     
    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 代码清单:

    [java] view plaincopy
     
    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代码清单:

    [java] view plaincopy
     
    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代码清单:

    [java] view plaincopy
     
    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配置:

    [html] view plaincopy
     
    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代码清单:

    [java] view plaincopy
     
    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代码清单:

    [java] view plaincopy
     
    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. }  

    12.运行结果:

  • 相关阅读:
    3. VIM 系列
    2. VIM 系列
    2. 修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误
    1. VIM 系列
    RESTful风格API
    APIview的使用
    1.DRF初始化
    Linux下的django项目02
    Linux下的django项目01
    1,web项目工作流程
  • 原文地址:https://www.cnblogs.com/whtydn/p/5036608.html
Copyright © 2020-2023  润新知