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

Employee.java

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

Gender.java

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

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. <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
  8. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <!-- 如果有多个文件 使用 "," 分开 -->
  11. <param-value>classpath:applicationContext.xml</param-value>
  12. </context-param>
  13. <!-- 对spring容器进行实例化 -->
  14. <listener>
  15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  16. </listener>
  17. <!--配置Struts2的过滤器 -->
  18. <filter>
  19. <filter-name>struts2</filter-name>
  20. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  21. </filter>
  22. <filter-mapping>
  23. <filter-name>struts2</filter-name>
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>
  26. <welcome-file-list>
  27. <welcome-file>index.jsp</welcome-file>
  28. </welcome-file-list>
  29. </web-app>

EmployeeService.java

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

EmployeeServiceBean.java

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

EmployeeAction.java

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

EmployeeManageAction.java

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

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. <struts>
  6. <!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->
  7. <!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置
  8. 如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->
  9. <constant name="struts.objectFactory" value="spring"/>
  10. <package name="employee" namespace="/employee" extends="struts-default">
  11. <!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。
  12. 需要写上action在spring中的简单类名 -->
  13. <!-- http://localhost:8080/SSH2/employee/list.action -->
  14. <action name="list" class="employeeAction">
  15. <result name="list">/WEB-INF/page/employee.jsp</result>
  16. </action>
  17. <!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->
  18. <action name="manage_*" class="employeeManageAction" method="{1}">
  19. <result name="add">/WEB-INF/page/employeeAdd.jsp</result>
  20. <result name="message">/WEB-INF/page/message.jsp</result>
  21. </action>
  22. </package>
  23. </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

转载于:https://www.cnblogs.com/jianmang/articles/4704545.html

SSH2整合完整案例相关推荐

  1. SSH2整合完整案例(四十三)

    注解配置:Struts2+Spring2.5+Hibernate3.3+Oracle11g 本文介绍 1.Struts2+Spring2.5+Hibernate3.3的整合 2.采用单元测试 3.加入 ...

  2. ssm框架使用resultful_SSM框架整合完整案例

    SSM框架整合 一.整合思路 二.案例实战 1. 项目前期准备 2. 整合dao层 ① mybatis全局配置文件(SqlConfig.xml) ② 配置spring.xml ③ 编写POJO类(ja ...

  3. SSM框架整合完整案例

    SSM框架整合 一.整合思路 二.案例实战 1. 项目前期准备 2. 整合dao层 ① mybatis全局配置文件(SqlConfig.xml) ② 配置spring.xml ③ 编写POJO类(ja ...

  4. 【强推】Blender制作逼真人物角色完整案例视频教程

    [强推]Blender制作逼真人物角色完整案例视频教程 [强推]Blender制作逼真人物角色完整案例视频教程 时长53h 30m 1280X720 MP4 含教程工程文件 共九大模块 130小节课程 ...

  5. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity

    Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity MP4 |视频:h264,1280x720 |音频:A ...

  6. php 爬虫_Scrapy 爬虫完整案例-基础篇

    1 Scrapy 爬虫完整案例-基础篇 1.1 Scrapy 爬虫案例一 Scrapy 爬虫案例:爬取腾讯网招聘信息 案例步骤: 第一步:创建项目. 在 dos下切换到目录 D:爬虫_scriptsc ...

  7. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  8. Spring+SpringMVC +MyBatis整合配置文件案例66666

    Spring+SpringMVC +MyBatis整合配置文件案例 标签: springspringmvcmybatismvcjava 2017-04-13 19:12 228人阅读 评论(1) 收藏 ...

  9. 现代中小企业IT基础平台建设 - 完整案例实战(00_序)

    前言 随着IT不断发展,它的应用领域也在日新月异的变化和深化,为人与人.人与物.以及物与物之间信息沟通提供了越来越丰富的工具和手段,深刻改变着当今人们的生活和生产方式. 近几年云计算应用的兴起(如:阿 ...

最新文章

  1. java50车架适合身高,【经验分享】身高与车架的选择
  2. php 验证qq密码错误,QQ输入正确密码却验证错误的解决办法
  3. C语言创建二叉树的方法(全)
  4. angularjs 中 Factory,Service,Provider 之间的区别
  5. java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较
  6. C++学习笔记-----std::pair作为unordered_map的key
  7. hosts文件是什么?
  8. TextView设置缩略显示
  9. 存储过程循环遍历一个月的每一天的函数_JavaScript 循环:如何处理 async/await
  10. eclipse设置java虚拟机内存大小_eclipse设置java虚拟机内存大小
  11. 字符串匹配算法知多少?
  12. 3.8 51单片机-M74HC138译码器驱动8位数码管
  13. 机械革命Z2 键盘失灵
  14. python中三角函数计算
  15. python爬虫——爬取taptap游戏的评论信息(通过fiddler抓包)
  16. e.target的用法
  17. 分享给学弟学妹们的一些成为全栈工程师的方向和方法
  18. 测试工程师如何跟进用户反馈
  19. Java中的浮点型数据类型
  20. 计算机组成与系统结构期末复习 第二章 2.2

热门文章

  1. ssm课堂考勤管理毕业设计-附源码191617
  2. videojs动态封面_video.js如何动态的播放视频?
  3. 公司分支使用5G链路和总部建立IPS加密隧道配置案例
  4. 计算机毕业设计ssm校园教育服务平台
  5. Edge浏览器看优酷视频CPU占用率超高
  6. udp包为什么最好不要大于1472字节
  7. Word页眉、页码的使用:利用分隔符设置指定页显示页眉,解决页码显示{PAGE \* MERGEFORMAT}问题...
  8. 零跑汽车财报解读:短跑“增程”双动力,长跑“自研”加速度
  9. [App Store Connect帮助]七、在 App Store 上发行(2.2)设定价格与销售范围:将您的 App 以预订形式发布...
  10. 如何度过研究生生活(转)