`
Luob.
  • 浏览: 1589896 次
  • 来自: 上海
社区版块
存档分类
最新评论

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的驱动介绍

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



SSH2整合需要的Jar
1.Strusts
javassist-3.4.GA.jar
commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
struts2-spring-plugin-2.1.8.jar


2.Hibernate
commons-collections-3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar


3.Spring
aspectjrt.jar
aspectjweaver.jar
c3p0-0.9.1.2.jar
cglib-nodep-2.1_3.jar
common-annotations.jar
log4j-1.2.15.jar
spring.jar


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

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

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->
<context:component-scan base-package="com.sh"/>

<!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->
<!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
   <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
   <property name="user" value="luob"/>
   <property name="password" value="m123"/>
   <!-- 连接池中的最大连接数 -->
   <property name="maxPoolSize" value="150"/>
   
   <!-- 连接池中的最小连接数 -->
   <property name="minPoolSize" value="1"></property>
   
   <!-- 初始化连接池中的 连接数,取值 在  minPoolSize 和 maxPoolSize 之间,default:3-->
   <property name="initialPoolSize" value="3"/>
   
   <!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->
   <property name="maxIdleTime" value="60"/>
   
   <!-- 当连接数不够时,每次同时创建多少个连接 -->
   <property name="acquireIncrement" value="1"/>
   
   <!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->
   <property name="idleConnectionTestPeriod" value="60"/>
</bean>

<!--从c3p0数据源中抽取出JDBC的代理对象-->
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"  lazy-init="true" /> 

<!--9i: org.springframework.jdbc.support.lob.OracleLobHandler  -->
<!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个)  -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
  <!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->
  <property name="nativeJdbcExtractor">
   	<ref local="nativeJdbcExtractor" />
  </property>
</bean>

<!-- 将Hibernate中的事物交给Spring进行接管 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<!-- 指定sessiongFactory中的数据源 -->
	<property name="dataSource" ref="dataSource"/>
	
	<!-- 指定hibernate的属性  -->
	<property name="hibernateProperties">
		<value>
			<!-- hibernate使用的 方言 -->
			hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
			<!-- 根据实体的映射文件生成表结构 -->
			hibernate.hbm2ddl.auto=update
			<!-- 格式化sql -->
			hibernate.format_sql=false
			<!-- 是否打印出sql语句 -->
			hibernate.show_sql=false
		</value>
	</property>
	<!-- 定义lob操作对象 -->
	<property name="lobHandler">
    	<ref bean="lobHandler" />
 	</property>
	 <!-- 指定hibernate的映射文件 -->
	<property name="mappingResources">
		<list>
			<value>com/sh/employee/model/Employee.hbm.xml</value>
		</list>
	</property>
</bean>

<!-- 配置使用基于Hibernate的事务管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<!-- spring需要通过sessionFactory来开启事务 -->
	<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->
<tx:annotation-driven transaction-manager="txManager"/>

</beans>


Employee.java
package com.sh.employee.model;

public class Employee {
	private String username;
	private String password;
	//枚举类型
	private Gender gender=Gender.MAN;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	public Employee(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	public Employee() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Employee(String username, String password, Gender gender) {
		super();
		this.username = username;
		this.password = password;
		this.gender = gender;
	}
	
}



Gender.java
package com.sh.employee.model;

public enum Gender {
	//分为字面值 :MAN   /  WOMAN
	//索引值:0 1 
	MAN,WOMAN
	
}


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


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  
 <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<!-- 如果有多个文件 使用 "," 分开 -->
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <!-- 对spring容器进行实例化 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!--配置Struts2的过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


EmployeeService.java
package com.sh.employee.interfaces;

import java.util.List;

import com.sh.employee.model.Employee;

public interface EmployeeService {
	void save(Employee employee);
	void update(Employee employee);
	Employee find(String userName);
	void delete(String... userName);
	List<Employee> list();
}


EmployeeServiceBean.java
package com.sh.employee.service;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;

/**
 *@author LuoB.
 */

//@Service: 定义业务层。采用扫描加注解  将这个类交给spring管理 。
//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean

//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
@Service @Transactional
public class EmployeeServiceBean implements EmployeeService {
	//采用注解方式注入SessionFactory
	//factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
	//spring的事物管理一般是先获取当前的session,然后 将这个begin。
	//factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
	
	
	@Resource SessionFactory factory;
	public void delete(String... userName) {
		//中间的load 替换了 get方法  因为速度和效率 比get 高
		for (String string : userName) {
			factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
		}
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public Employee find(String userName) {
		// TODO Auto-generated method stub
		return (Employee)factory.getCurrentSession().get(Employee.class, userName);
	}

	@SuppressWarnings("unchecked")
	public List<Employee> list() {
		//Hql 进行查询
		/*Session session=factory.openSession();
		Transaction ts= session.beginTransaction();
		ts.commit();
		ts.rollback();*/
		return factory.getCurrentSession().createQuery("from Employee").list();
	}

	public void save(Employee employee) {
		//持久化方法 -内部还是调用save方法
		factory.getCurrentSession().persist(employee);
	}

	public void update(Employee employee) {
		// merge对update更新了有 save和update的功能
		factory.getCurrentSession().merge(employee);
	}

}


EmployeeAction.java
package com.sh.employee.action;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;

//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
@Controller
public class EmployeeAction {
	@Resource EmployeeService employeeService;
	public String execute(){
		ActionContext.getContext().put("employees",employeeService.list());
		return "list";
	}
}


EmployeeManageAction.java
package com.sh.employee.action;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;

//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action 
//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
//所以 我们需要 将action 声明为 原型 @Scope("prototype")
@Controller @Scope("prototype")
public class EmployeeManageAction {
	@Resource EmployeeService employeeService;
    
	//如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据 
	//比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
	private Employee employee;
	
	public Employee getEmployee() {
		return employee;
	}

	public void setEmployee(Employee employee) {
		this.employee = employee;
	}

	public String addUI(){
		return "add";
	}
	
	public String add(){
		employeeService.save(employee);
		ActionContext.getContext().put("msg", "保存成功!");
		return "message";
	}
}



struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

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

</struts>


employee.jsp
 <body>
    	采用OGNL表达式获取<br/>
    	<s:iterator value="#request.employees">
    		<s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>
    	</s:iterator>
    	<br/>采用JSTL/EL表达式获取<br/>
    	<c:forEach var="emp" items="${employees}" varStatus="st">
    		${emp.username},${emp.password},${gender}<br/>
    	</c:forEach>
    	[url=<s:url action=]">员工添加[/url]
  </body>


employeeAdd.jsp
 <body>
    	<s:form action="manage_add" namespace="/employee" method="post" theme="simple">
    		用户名:<s:textfield name="employee.username"/><br/>
    		密码:<s:textfield name="employee.password"/><br/>
    		性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>
    		<s:submit value="保存"/>
    	</s:form>
  </body>


message.jsp
<body>
    <h1><font color="red">${msg}</font></h1>
    [url=${pageContext.request.contextPath}/employee/list.action]返回员工列表[/url]
  </body>


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

Spring,Struts,Hibernate,Oracle
Struts2, Spring, Hibernate, Oracle, prototype
  • src.zip (9.9 KB)
  • 下载次数: 205
7
9
分享到:
评论
11 楼 被遗忘的下路 2017-12-22  
少了个junit-4.8.2的包
10 楼 maocai15 2016-05-03  
写的真好,根据这篇搭建文章,我自己整理了一下,完整的包和可以在eclipse中运行的完整SSH项目在这里下载,也包括源代码
http://how2j.cn/k/ssh/ssh-integrationtest/100.html
9 楼 java3344520 2013-05-09  
不错,测试成功,最好能把步骤总结下,兄弟!
8 楼 Luob. 2012-09-14  
xuliuliu 写道
为什么会报错啊
找不到
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

这个问题如何解决

应该是少了包
7 楼 xuliuliu 2012-09-14  
为什么会报错啊
找不到
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

这个问题如何解决
6 楼 shuaiji 2012-09-14  
想请问一下,扫描和注解方式会变得维护困难,什么方便便于维护
5 楼 lsjinpeng 2012-09-14  
matk idea
4 楼 Luob. 2012-09-14  
shuaiji 写道
Oracle 拼错了。

嗯,手误。不好意思。

鼓励提出错误,希望提出个人见解!!!
3 楼 shuaiji 2012-09-14  
Oracle 拼错了。
2 楼 steafler 2012-09-14  
用最新的吧,spring3+hibernate4,略显过时了
1 楼 Java路 2012-09-14  
不错!!!!

相关推荐

    maven整合ssh案例

    Maven整合SSH案例 ************************************************************************************* 注意:运行前请配置Maven环境,和修改config.properties中数据库名称用户和密码,并且修改Tuser中的...

    SSH整合的一个案例

    SSH整合在IT行业中通常指的是Spring、Struts和Hibernate这三个开源框架的集成应用。Spring作为核心容器,负责管理对象(依赖注入DI)和事务处理;Struts则是MVC(Model-View-Controller)设计模式的实现,处理用户...

    SSH整合小案例,实用性比较强

    SSH整合是软件开发中一种常见的技术实践,主要指的是Spring、Struts和Hibernate这三大开源框架的集成应用。这个小案例提供了SSH整合的具体实现,对于项目研发具有很高的实用价值。下面我们将详细探讨SSH整合的关键...

    SSH2整合 案例

    SSH2整合案例的学习不仅可以帮助开发者理解这三个框架的集成原理,还能提高实际项目中的开发效率,因为它们各自解决了一部分问题,组合起来可以提供一个强大且灵活的解决方案。通过深入研究SSH2整合,开发者可以更好...

    SSH2整合案例

    SSH2整合的案例旨在帮助开发者理解和实践这三大框架的协同工作,提升对Java Web开发的理解。在实际开发中,这样的整合可以大大提高开发效率,同时保证代码的可读性和可维护性。通过这个案例,你可以学习到如何利用...

    SSH项目整合案例

    SSH项目整合是软件开发中的一种常见...这个简单的SSH项目整合案例,提供了一个基础的客户信息管理系统,涵盖了CRUD操作。通过学习和实践这个案例,开发者可以深入理解SSH框架间的协同工作原理,提升Java Web开发技能。

    ssh整合案例代码

    这个"ssh整合案例代码"应该提供了一个完整的示例,帮助开发者了解如何在实际项目中将这三个框架协同工作。接下来,我们将深入探讨SSH整合的核心概念、配置以及常见应用场景。 **Spring框架**:Spring是Java企业级...

    SSH2整合小案例

    SSH2整合小案例主要涉及到的是Secure Shell (SSH) 协议的第二版,这是一个用于在网络设备之间提供安全通信的协议。SSH2常用于远程登录、命令执行、文件传输等,尤其在Linux和Unix系统中广泛使用。在这个小案例中,...

    JBPM5.4 SSH 完整项目整合案例

    **JBPM5.4 SSH 完整项目整合案例** 该案例是基于JBPM5.4、Spring(SSH框架的一部分)的集成应用实例,旨在展示如何将业务流程管理(BPM)系统JBPM与Spring框架无缝结合,实现企业级的业务流程自动化。SSH,即Struts...

    SSH整合视频 SSH整合案例 SSH整合问题解决

    NULL 博文链接:https://wuxiangqian.iteye.com/blog/1292591

    SSH2 整合案例

    这个整合案例提供了在Eclipse环境中快速搭建SSH2项目的基础结构,包括所有必需的jar包,便于开发者进行Web应用的开发。 **Struts2** 是一个基于MVC设计模式的Web应用框架,它有效地解决了JSP模型2中的表现层与业务...

    SSH整合案例(myeclipse)搭建

    SSH整合案例(myeclipse)搭建,这个案例没有业务代码,就单纯地把SSH的框架平台搭好,你们可以很顺利的在上面开发,而无需花时间搭平台了。懒人装用,测试通过了。如果有什么问题,留言解决,注意给个好评,谢谢。

    SSH简单整合案例

    简单的案例整合SSH框架的应用,主要熟悉SSH三大框架的使用

    ssh项目整合案例

    SSH整合是Java开发中一种常见的Web应用架构模式,它由三个强大的开源框架组成:Struts2、Hibernate和Spring。这个组合被广泛应用于构建复杂、可维护的企业级应用程序。接下来,我们将详细探讨这三个框架以及它们如何...

    SSH整合案例

    SSH整合案例有助于理解这些框架如何协同工作,提高开发效率,减少代码冗余。通过这样的整合,开发者可以更专注于业务逻辑,而非底层的技术细节。在实际项目中,SSH整合也是很多大型企业级应用的首选方案,因为它提供...

    SSH框架经典整合案例

    SSH框架经典整合案例是IT行业中一个非常重要的主题,它涵盖了Struts2、Spring和Hibernate这三个主流的Java开发框架。这三者之间的集成可以为开发者提供一个高效、灵活且功能强大的后端开发环境,广泛应用于企业级...

    SSH整合经典实例

    SSH整合经典实例主要涉及到的是Java开发中的三大框架:Spring、Struts和Hibernate的集成应用,这些框架在J2EE体系中被广泛使用,为开发者提供了高效、便捷的开发环境。SSH整合是Java企业级开发中一种常见的解决方案...

    flex ssh2整合案例

    "flex ssh2整合案例"是一个具体的项目,展示了如何将Flex前端、Spring、Struct2后端以及Hibernate持久化层进行融合,实现一个完整的Web应用解决方案。以下是这个案例涉及的关键知识点的详细解析: 1. **Flex**:...

    04 SSH 尚硅谷SSH整合&amp;综合案例视频

    04 SSH 尚硅谷SSH整合&综合案例视频 教程视频:Struts2+Spring+Hibernate整合

Global site tag (gtag.js) - Google Analytics