SSH2整合完整案例

注解配置:Struts2+Spring2.5+Hibernate3.3+Oracle11g

本文介绍
1.Struts2+Spring2.5+Hibernate3.3的整合
2.采用单元测试
3.加入了lob类型的操作配置
4.介绍oralce驱动 本文采用oracle11g
5.在HIbernate中采用“枚举”设置映射关系


jar的下载:
Struts2:   http://struts.apache.org/download.cgi#struts2013
Hibernate: http://www.hibernate.org/  点击Hibernate Core 下载
Spring:    http://www.springsource.org/download

Oracle的驱动介绍

Java代码  收藏代码
  1. class12.jar(jdk 1.2 / 1.3 )   
  2. class14.jar(jdk 1.4 / 1.5)  
  3. 其实只要安装了oracle 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。(例如: ojdbc6.jar)  




SSH2整合需要的Jar
1.Strusts

Java代码  收藏代码
  1. javassist-3.4.GA.jar  
  2. commons-fileupload-1.2.1.jar  
  3. commons-logging-1.0.4.jar  
  4. freemarker-2.3.15.jar  
  5. ognl-2.7.3.jar  
  6. struts2-core-2.1.8.jar  
  7. xwork-core-2.1.6.jar  
  8. struts2-spring-plugin-2.1.8.jar  



2.Hibernate

Java代码  收藏代码
  1. commons-collections-3.1.jar  
  2. dom4j-1.6.1.jar  
  3. ehcache-1.2.3.jar  
  4. ejb3-persistence.jar  
  5. hibernate-annotations.jar  
  6. hibernate-cglib-repack-2.1_3.jar  
  7. hibernate-commons-annotations.jar  
  8. hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包  
  9. hibernate3.jar  
  10. javassist-3.4.GA.jar  
  11. jta-1.1.jar  
  12. log4j.jar  
  13. slf4j-api-1.5.2.jar  
  14. slf4j-log4j12.jar  



3.Spring

Java代码  收藏代码
  1. aspectjrt.jar  
  2. aspectjweaver.jar  
  3. c3p0-0.9.1.2.jar  
  4. cglib-nodep-2.1_3.jar  
  5. common-annotations.jar  
  6. log4j-1.2.15.jar  
  7. spring.jar  



整合步骤先整合 Spring2.5+Hibernate3.3 成功后在整合 Struts2 这样就不容易报错,而且 报错误后也便于找出问题。

spring配置文件模版可以到 spring自带的一些例子中进行拷贝。

applicationContext.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns="http://www.springframework.org/schema/beans"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"  
  7.     xmlns:tx="http://www.springframework.org/schema/tx"  
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  9.     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.     http://www.springframework.org/schema/context  
  11.     http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  12.     http://www.springframework.org/schema/aop  
  13.     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  14.     http://www.springframework.org/schema/tx  
  15.     http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  16.   
  17. <!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->  
  18. <context:component-scan base-package="com.sh"/>  
  19.   
  20. <!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->  
  21. <!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->  
  22. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
  23.    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>  
  24.    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>  
  25.    <property name="user" value="luob"/>  
  26.    <property name="password" value="m123"/>  
  27.    <!-- 连接池中的最大连接数 -->  
  28.    <property name="maxPoolSize" value="150"/>  
  29.      
  30.    <!-- 连接池中的最小连接数 -->  
  31.    <property name="minPoolSize" value="1"></property>  
  32.      
  33.    <!-- 初始化连接池中的 连接数,取值 在  minPoolSize 和 maxPoolSize 之间,default:3-->  
  34.    <property name="initialPoolSize" value="3"/>  
  35.      
  36.    <!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->  
  37.    <property name="maxIdleTime" value="60"/>  
  38.      
  39.    <!-- 当连接数不够时,每次同时创建多少个连接 -->  
  40.    <property name="acquireIncrement" value="1"/>  
  41.      
  42.    <!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->  
  43.    <property name="idleConnectionTestPeriod" value="60"/>  
  44. </bean>  
  45.   
  46. <!--从c3p0数据源中抽取出JDBC的代理对象-->  
  47. <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"  lazy-init="true" />   
  48.   
  49. <!--9i: org.springframework.jdbc.support.lob.OracleLobHandler  -->  
  50. <!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个)  -->  
  51. <bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">  
  52.   <!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->  
  53.   <property name="nativeJdbcExtractor">  
  54.     <ref local="nativeJdbcExtractor" />  
  55.   </property>  
  56. </bean>  
  57.   
  58. <!-- 将Hibernate中的事物交给Spring进行接管 -->  
  59. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  60.     <!-- 指定sessiongFactory中的数据源 -->  
  61.     <property name="dataSource" ref="dataSource"/>  
  62.       
  63.     <!-- 指定hibernate的属性  -->  
  64.     <property name="hibernateProperties">  
  65.         <value>  
  66.             <!-- hibernate使用的 方言 -->  
  67.             hibernate.dialect=org.hibernate.dialect.Oracle10gDialect  
  68.             <!-- 根据实体的映射文件生成表结构 -->  
  69.             hibernate.hbm2ddl.auto=update  
  70.             <!-- 格式化sql -->  
  71.             hibernate.format_sql=false  
  72.             <!-- 是否打印出sql语句 -->  
  73.             hibernate.show_sql=false  
  74.         </value>  
  75.     </property>  
  76.     <!-- 定义lob操作对象 -->  
  77.     <property name="lobHandler">  
  78.         <ref bean="lobHandler" />  
  79.     </property>  
  80.      <!-- 指定hibernate的映射文件 -->  
  81.     <property name="mappingResources">  
  82.         <list>  
  83.             <value>com/sh/employee/model/Employee.hbm.xml</value>  
  84.         </list>  
  85.     </property>  
  86. </bean>  
  87.   
  88. <!-- 配置使用基于Hibernate的事务管理器 -->  
  89. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  90.     <!-- spring需要通过sessionFactory来开启事务 -->  
  91.     <property name="sessionFactory" ref="sessionFactory"/>  
  92. </bean>  
  93.   
  94. <!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->  
  95. <tx:annotation-driven transaction-manager="txManager"/>  
  96.   
  97. </beans>  



Employee.java

Java代码  收藏代码
  1. package com.sh.employee.model;  
  2.   
  3. public class Employee {  
  4.     private String username;  
  5.     private String password;  
  6.     //枚举类型  
  7.     private Gender gender=Gender.MAN;  
  8.     public String getUsername() {  
  9.         return username;  
  10.     }  
  11.     public void setUsername(String username) {  
  12.         this.username = username;  
  13.     }  
  14.     public String getPassword() {  
  15.         return password;  
  16.     }  
  17.     public void setPassword(String password) {  
  18.         this.password = password;  
  19.     }  
  20.     public Gender getGender() {  
  21.         return gender;  
  22.     }  
  23.     public void setGender(Gender gender) {  
  24.         this.gender = gender;  
  25.     }  
  26.     public Employee(String username, String password) {  
  27.         super();  
  28.         this.username = username;  
  29.         this.password = password;  
  30.     }  
  31.     public Employee() {  
  32.         super();  
  33.         // TODO Auto-generated constructor stub  
  34.     }  
  35.     public Employee(String username, String password, Gender gender) {  
  36.         super();  
  37.         this.username = username;  
  38.         this.password = password;  
  39.         this.gender = gender;  
  40.     }  
  41.       
  42. }  



Gender.java

Java代码  收藏代码
  1. package com.sh.employee.model;  
  2.   
  3. public enum Gender {  
  4.     //分为字面值 :MAN   /  WOMAN  
  5.     //索引值:0 1   
  6.     MAN,WOMAN  
  7.       
  8. }  



Employee.hbm.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.sh.employee.model">  
  6.     <class name="Employee">  
  7.         <id name="username" length="20"/>  
  8.         <property name="password" length="20" not-null="true"/>  
  9.         <property name="gender" not-null="true" length="5">  
  10.             <type name="org.hibernate.type.EnumType">  
  11.                 <param name="enumClass">com.sh.employee.model.Gender</param>  
  12.                 <!--type:12 为java.sql.Types.VARCHAR常量值,即保存枚举字面值到数据库。  
  13.                 如果不指定(删除)type:则保存枚举索引值到数据库(从0 开始) -->  
  14.                 <param name="type">12</param>  
  15.             </type>  
  16.         </property>  
  17.     </class>  
  18. </hibernate-mapping>  



web.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.     
  8.  <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->  
  9.   <context-param>  
  10.     <param-name>contextConfigLocation</param-name>  
  11.     <!-- 如果有多个文件 使用 "," 分开 -->  
  12.     <param-value>classpath:applicationContext.xml</param-value>  
  13.   </context-param>  
  14.     
  15.   <!-- 对spring容器进行实例化 -->  
  16.   <listener>  
  17.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  18.   </listener>  
  19.     
  20.   <!--配置Struts2的过滤器 -->  
  21.   <filter>  
  22.     <filter-name>struts2</filter-name>  
  23.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  24.   </filter>  
  25.   <filter-mapping>  
  26.     <filter-name>struts2</filter-name>  
  27.     <url-pattern>/*</url-pattern>  
  28.   </filter-mapping>  
  29.     
  30.   <welcome-file-list>  
  31.     <welcome-file>index.jsp</welcome-file>  
  32.   </welcome-file-list>  
  33. </web-app>  



EmployeeService.java

Java代码  收藏代码
  1. package com.sh.employee.interfaces;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.sh.employee.model.Employee;  
  6.   
  7. public interface EmployeeService {  
  8.     void save(Employee employee);  
  9.     void update(Employee employee);  
  10.     Employee find(String userName);  
  11.     void delete(String... userName);  
  12.     List<Employee> list();  
  13. }  



EmployeeServiceBean.java

Java代码  收藏代码
  1. package com.sh.employee.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.Transaction;  
  10. import org.springframework.stereotype.Service;  
  11. import org.springframework.transaction.annotation.Propagation;  
  12. import org.springframework.transaction.annotation.Transactional;  
  13.   
  14. import com.sh.employee.interfaces.EmployeeService;  
  15. import com.sh.employee.model.Employee;  
  16.   
  17. /** 
  18.  *@author LuoB. 
  19.  */  
  20.   
  21. //@Service: 定义业务层。采用扫描加注解  将这个类交给spring管理 。  
  22. //-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean  
  23.   
  24. //@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。  
  25. //-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)  
  26. @Service @Transactional  
  27. public class EmployeeServiceBean implements EmployeeService {  
  28.     //采用注解方式注入SessionFactory  
  29.     //factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了  
  30.     //spring的事物管理一般是先获取当前的session,然后 将这个begin。  
  31.     //factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session  
  32.       
  33.       
  34.     @Resource SessionFactory factory;  
  35.     public void delete(String... userName) {  
  36.         //中间的load 替换了 get方法  因为速度和效率 比get 高  
  37.         for (String string : userName) {  
  38.             factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));  
  39.         }  
  40.     }  
  41.   
  42.     @Transactional(propagation=Propagation.NOT_SUPPORTED)  
  43.     public Employee find(String userName) {  
  44.         // TODO Auto-generated method stub  
  45.         return (Employee)factory.getCurrentSession().get(Employee.class, userName);  
  46.     }  
  47.   
  48.     @SuppressWarnings("unchecked")  
  49.     public List<Employee> list() {  
  50.         //Hql 进行查询  
  51.         /*Session session=factory.openSession(); 
  52.         Transaction ts= session.beginTransaction(); 
  53.         ts.commit(); 
  54.         ts.rollback();*/  
  55.         return factory.getCurrentSession().createQuery("from Employee").list();  
  56.     }  
  57.   
  58.     public void save(Employee employee) {  
  59.         //持久化方法 -内部还是调用save方法  
  60.         factory.getCurrentSession().persist(employee);  
  61.     }  
  62.   
  63.     public void update(Employee employee) {  
  64.         // merge对update更新了有 save和update的功能  
  65.         factory.getCurrentSession().merge(employee);  
  66.     }  
  67.   
  68. }  



EmployeeAction.java

Java代码  收藏代码
  1. package com.sh.employee.action;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6.   
  7. import com.opensymphony.xwork2.ActionContext;  
  8. import com.sh.employee.interfaces.EmployeeService;  
  9.   
  10. //@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名  
  11. @Controller  
  12. public class EmployeeAction {  
  13.     @Resource EmployeeService employeeService;  
  14.     public String execute(){  
  15.         ActionContext.getContext().put("employees",employeeService.list());  
  16.         return "list";  
  17.     }  
  18. }  



EmployeeManageAction.java

Java代码  收藏代码
  1. package com.sh.employee.action;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.context.annotation.Scope;  
  6. import org.springframework.stereotype.Controller;  
  7.   
  8. import com.opensymphony.xwork2.ActionContext;  
  9. import com.sh.employee.interfaces.EmployeeService;  
  10. import com.sh.employee.model.Employee;  
  11.   
  12. //因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action   
  13. //然后把Action存在在ValueStack中 所以Action可以被OGNL访问.  
  14. //但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。  
  15. //所以 我们需要 将action 声明为 原型 @Scope("prototype")  
  16. @Controller @Scope("prototype")  
  17. public class EmployeeManageAction {  
  18.     @Resource EmployeeService employeeService;  
  19.       
  20.     //如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据   
  21.     //比如下面 如果是但单利模式 所有的请求都可以访问这个对象了  
  22.     private Employee employee;  
  23.       
  24.     public Employee getEmployee() {  
  25.         return employee;  
  26.     }  
  27.   
  28.     public void setEmployee(Employee employee) {  
  29.         this.employee = employee;  
  30.     }  
  31.   
  32.     public String addUI(){  
  33.         return "add";  
  34.     }  
  35.       
  36.     public String add(){  
  37.         employeeService.save(employee);  
  38.         ActionContext.getContext().put("msg", "保存成功!");  
  39.         return "message";  
  40.     }  
  41. }  



struts.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5.   
  6. <struts>  
  7.     <!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->  
  8.     <!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置  
  9.     如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->  
  10.     <constant name="struts.objectFactory" value="spring"/>  
  11.       
  12.     <package name="employee" namespace="/employee" extends="struts-default">  
  13.         <!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。  
  14.         需要写上action在spring中的简单类名 -->  
  15.         <!-- http://localhost:8080/SSH2/employee/list.action -->  
  16.         <action name="list" class="employeeAction">  
  17.             <result name="list">/WEB-INF/page/employee.jsp</result>  
  18.         </action>  
  19.           
  20.         <!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->  
  21.         <action name="manage_*" class="employeeManageAction" method="{1}">  
  22.             <result name="add">/WEB-INF/page/employeeAdd.jsp</result>  
  23.             <result name="message">/WEB-INF/page/message.jsp</result>  
  24.         </action>  
  25.     </package>  
  26.   
  27. </struts>  



employee.jsp

Html代码  收藏代码
  1. <body>  
  2.     采用OGNL表达式获取<br/>  
  3.     <s:iterator value="#request.employees">  
  4.         <s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>  
  5.     </s:iterator>  
  6.     <br/>采用JSTL/EL表达式获取<br/>  
  7.     <c:forEach var="emp" items="${employees}" varStatus="st">  
  8.         ${emp.username},${emp.password},${gender}<br/>  
  9.     </c:forEach>  
  10.     [url=<s:url action=]">员工添加[/url]  
  11.  </body>  



employeeAdd.jsp

Html代码  收藏代码
  1. <body>  
  2.     <s:form action="manage_add" namespace="/employee" method="post" theme="simple">  
  3.         用户名:<s:textfield name="employee.username"/><br/>  
  4.         密码:<s:textfield name="employee.password"/><br/>  
  5.         性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>  
  6.         <s:submit value="保存"/>  
  7.     </s:form>  
  8.  </body>  



message.jsp

Html代码  收藏代码
  1. <body>  
  2.     <h1><font color="red">${msg}</font></h1>  
  3.     [url=${pageContext.request.contextPath}/employee/list.action]返回员工列表[/url]  
  4.   </body>  



--访问http://localhost:8080/SSH2/employee/list.action
--访问http://localhost:8080/SSH2/employee/list.action

posted @   剑芒  阅读(331)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示