zoukankan      html  css  js  c++  java
  • Struts2+Hibernate+Spring 整合示例

    转自: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>

     

     

    12.运行结果:

  • 相关阅读:
    Linux配置手记及软件FAQ-更新到Fedora core 3
    怎样给多维数组动态分配内存
    mysql管理密码修改及管理权限设定(zz)
    链表处理函数(自己总结)
    二级C笔试试题
    中央广播电视大学19992000学年度第二学期“开放教育(本科)期末考试计算机科学与技术专业数据结构试题
    关闭计算机就这几招
    交大ftp校内搜索引擎终于好了!好!!
    有趣的Baidu。终于发现点比Google好的地方了
    几组重要概念
  • 原文地址:https://www.cnblogs.com/sharpest/p/5809381.html
Copyright © 2011-2022 走看看