Struts2,Spring,Hibernate三大框架的整合(SSH)

本文介绍如何整合Struts2、Spring和Hibernate三大框架,包括所需JAR包、配置文件设置、注解使用等内容,适用于Java Web开发者。

jar 包和配置文件整合 sturts2.3.7 + hibernate3.6 + Spring3.2.0


struts2 框架
最基本开发jar包 “Struts2解压目录”/apps/struts2-blank.war 下所有jar包.

  • asm-3.3.jar
  • asm-commons-3.3.jar
  • asm-tree-3.3.jar
  • commons-fileupload-1.2.2.jar
  • commons-io-2.0.1.jar
  • commons-lang3-3.1.jar
  • freemarker-2.3.19.jar
  • javassist-3.11.0.GA.jar
  • ognl-3.0.5.jar
  • struts2-core-2.3.7.jar
  • xwork-core-2.3.7.jar

其他的jar包

  • struts2-convention-plugin-2.3.7.jar用于struts使用注解(可选)
  • struts2-json-plugin-2.3.7.jar 用于struts2整合Ajax(可选)
  • struts2-spring-plugin-2.3.7.jar 用于struts2整合Spring

在web.xml 配置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>

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>
	<!-- 常量 开发模式  -->
    <constant name="struts.devMode" value="false" />

    <package name="default" namespace="/" extends="struts-default">
		<action name="" class=""></action>
    </package>
</struts>


spring框架 3.2.0
pring3.2 开发最基本jar包 :

  • spring-beans-3.2.0.RELEASE.jar
  • spring-context-3.2.0.RELEASE.jar
  • spring-core-3.2.0.RELEASE.jar
  • spring-expression-3.2.0.RELEASE.jar
  • com.springsource.org.apache.commons.logging-1.1.1.jar
  • com.springsource.org.apache.log4j-1.2.15.jar

AOP开发 :

  • spring-aop-3.2.0.RELEASE.jar
  • spring-aspects-3.2.0.RELEASE.jar
  • com.springsource.org.aopalliance-1.0.0.jar
  • com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

Spring Jdbc开发 :

  • spring-jdbc-3.2.0.RELEASE.jar
  • spring-tx-3.2.0.RELEASE.jar

Spring事务管理 :

  • spring-tx-3.2.0.RELEASE.jar

Spring整合其他ORM框架 (整合 hibernate 、mybatis)

  • spring-orm-3.2.0.RELEASE.jar

Spring在web中使用 :

  • spring-web-3.2.0.RELEASE.jar

Spring整合Junit测试 :

  • spring-test-3.2.0.RELEASE.jar

在web.xml 配置 Spring 核心监听器,指定配置文件位置

<context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>	
  <listener>
  	<listener-class>
	org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>

在src 创建 spring 配置文件 applicationContext.xml

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

<bean id="" class="" >
	<property name="" ref=""></property>
</bean>

</beans>

hibernate 框架

  • hibernate3.jar
  • antlr-2.7.6.jar
  • commons-collections-3.1.jar
  • dom4j-1.6.1.jar
  • javassist-3.12.0.GA.jar
  • jta-1.1.jar
  • slf4j-api-1.6.1.jar
  • hibernate-jpa-2.0-api-1.0.1.Final.jar

日志 slf4j 整合 log4j

  • slf4j-log4j12-1.7.2.jar

c3p0 连接池

  • com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

数据库驱动

  • mysql-connector-java-5.0.8-bin.jar

在src下添加log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout, file

在src 创建 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<!-- JDBC基本连接参数 -->
	<session-factory> <!-- 理解为连接池 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///spring_demo</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">1234</property>
		<!-- 配置方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 常见其它配置 -->
		<property name="hibernate.show_sql">true</property> <!-- 控制台上打印SQL -->
		<property name="hibernate.format_sql">true</property> <!-- 控制台输出时,对SQL语句格式化 -->
		<property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动建表 -->
		
		<!-- 映射 实体类 -->	
		<mapping resource="com/my/bean/Book.hbm.xml"/>
	
	</session-factory>
</hibernate-configuration>	

在 bean实体类 所在目录,创建 类名.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
 	<class name="com.my.bean.Book" table="book">
 		<id name="id">
 			<generator class="identity"></generator>
 		</id>
 		<property name="name"></property>
 		<property name="price"></property>
 	</class>
 	
 </hibernate-mapping>   

Spring 框架和 hibernate 框架整合
依赖 spring-orm.jar 提供 支持类
方式一 : 保留原有hibernate 配置文件,直接在Spring 配置中 引用hibernate 配置文件

  1. 通过 LocalSessionFactoryBean 将hibernate的配置,定义为Spring 一个bean (SessionFactory )
<!-- 定义Bean : SessionFactory  -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 加载hibernate 配置文件  -->
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>

  1. 将SessionFactory 注入到DAO 代码
    Spring 为了简化 Hibernate 开发,提供 HibernateTemplate 模板工具类
    通过定义DAO 继承 HibernateDaoSupport 类, 获得注入模板一些方法
public class BookDAO  extends HibernateDaoSupport{//继承模板注入方法
<!-- 将SessionFactory 注入DAO  -->
	<bean id="bookDao" class="com.my.dao.BookDao">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

3) 将DAO 注入到 Service

<!-- 将DAO 注入到Service  -->
	<bean id="bookService" class="com.my.service.BookService">
		<property name="bookDao" ref="bookDao"></property>
	</bean>

4) 采用注解进行声明式事务管理

@Transactional
public class BookService {
}
<!-- spring 采用声明式事务管理  -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/>

方式二 : 将hibernate 文件中内容,都写入到Spring 配置文件(不需要单独hibernate配置文件 )
1) 将jdbc的连接参数,配置文件 连接池,引入SessionFactory
jdbc.properties

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///spring_demo
jdbc.username = root
jdbc.password = 1234

<!-- 引入外部属性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 配置c3p0连接池  -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

<!-- 将连接池注入到SessionFactory -->
<property name="dataSource" ref="dataSource"></property>

2) 在Spring 的SessionFactory 配置hibernate常用属性

<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>

3) 进行 hbm映射文件引入

<!-- 进行hbm映射文件引入  -->
		<property name="mappingResources">
			<list>
				<value>com/my/bean/Book.hbm.xml</value>
			</list>
		</property>

		<!-- 会导入指定目录下 所有hbm映射文件 -->
		<property name="mappingDirectoryLocations">
			<list>
				<value>classpath:com/my/bean</value>
			</list>
		</property>

SessionFactory 的完整配置

<!-- 定义Bean : SessionFactory  -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 将连接池注入到SessionFactory -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 配置hibernate常用属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 进行hbm映射文件引入  
			mappingResources和mappingLocations不能两种写法,引入重复hbm文件,报错 Duplicate Mapping Exception 
		-->
		<property name="mappingResources">
			<list>
				<value>com/my/bean/Book.hbm.xml</value>
			</list>
		</property>
<!-- 		<property name="mappingLocations"> -->
<!-- 			<list> -->
<!-- 				<value>classpath:com/my/bean/Book.hbm.xml</value> -->
<!-- 			</list> -->
<!-- 		</property> -->
		<!-- 会导入指定目录下 所有hbm映射文件  -->
<!-- 		<property name="mappingDirectoryLocations"> -->
<!-- 			<list> -->
<!-- 				<value>classpath:com/my/bean</value> -->
<!-- 			</list> -->
<!-- 		</property> -->
	</bean>

Struts2框架 和 Spring框架整合
通过 struts2-spring-plugin.jar 插件包,完成整合
通过插件包,配置新的ObjectFactory

<bean type="com.opensymphony.xwork2.ObjectFactory" 
name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

<!--  Make the Spring object factory the automatic default -->
<constant name="struts.objectFactory" value="spring" />

导入插件,修改了Struts2 默认对象工厂 ,造成了 Struts2 Action类对象 创建对象工厂发生了变化
方式一 : 由 Struts2自己管理Action创建,自动装配Spring容器对象

<!-- struts2 整合 spring 方式一 : struts2自己管理Action创建 -->
<action name="addBook" class="com.my.action.BookAction" />

class属性配置完整类名,struts2 根据类名构造Action对象
启用对象工厂自动装配 ,将Spring容器对象,自动注入到Action中!!

用Struts2 Action属性 去匹配Spring 容器Bean id,如果匹配,进行自动装配 !!
注意:默认按照name注入,如果name不匹配,无法注入,容易出现空指针异常

方式二: Struts2将Action创建权交给Spring容器
导入 struts2-spring-plugin.jar 插件后
先通过Struts2自己创建Action ,如果Action类名无法找到,会去Spring 容器中去找,通过Spring Bean 构造Action

struts.xml

<!-- struts2整合 spring 方式二 : 将Action 交给Spring创建  -->
<!-- class属性 伪类名  -->
<action name="addBook" class="BookAction"></action>

因为class无法找到,struts2无法创建Action ,去Spring中去找
applicationContext.xml

<!-- 配置Action 创建 -->
	<bean id="BookAction" class="com.my.action.BookAction">
		<property name="bookService" ref="bookService"></property>
	</bean>

注意: struts2 管理Action创建,默认Action是多个实例的, spring管理Action创建 ,默认scope=singleton 是单例 的,使用Spring 管理Action 创建,必须将Action scope=prototype

延迟加载数据问题解决
使用 OpenSessionInView 解决 : 将Session生命周期 延续到 web层,刚才程序获得book对象 ,成为持久对象,具有延迟加载能力
在web.xml 配置Spring 提供 OpenSessionInViewFitler 。
OpenSessionInViewFilter 必须配置在 StrutsPrepareAndExecuteFilter 之前!否则无效

	<!-- openSessionInViewFilter -->
  <filter>
  	<filter-name>openSessionInViewFilter</filter-name>
  	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>openSessionInViewFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>


通过注解进行三大框架整合
进行注解的整合时,需要添加struts2 注解开发插件包 struts2-convention-plugin-2.3.7.jar
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">
  <display-name></display-name>	
   <!-- spring 监听器 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>	
  <listener>
  	<listener-class>
	org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>
  
    <!-- openSessionInViewFilter -->
  <filter>
  	<filter-name>openSessionInViewFilter</filter-name>
  	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>openSessionInViewFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- 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>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	<!-- 自动扫描 -->
	<context:component-scan base-package="cn.itcast"></context:component-scan>
	<!-- 注解注入 -->
	<context:annotation-config></context:annotation-config>
	
	<!-- 引入外部属性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 配置c3p0连接池  -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 定义Bean : SessionFactory  -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<!-- 将连接池注入到SessionFactory -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 配置hibernate常用属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 引用注解类 -->
		<property name="packagesToScan">
			<list>
				<value>cn.itcast.domain</value>
			</list>
		</property>
	</bean>
	
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<!-- spring 采用声明式事务管理  -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
</beans>

jdbc.properties和log4j.properties跟前面的一样。

在Action 通过注解配置访问路径 @Action 、@ParentPackage、@Namespace 几个注解

@ParentPackage("struts-default") //  extends="struts-default"
@Namespace("/")
public class BookAction extends ActionSupport implements ModelDriven<Book>{
	
	// 业务方法 
	@Override
	@Action(value="addBook", results={@Result(name="success", location="/index.jsp")}) // value 就是 <action name="" />
	public String execute() throws Exception {
		System.out.println("添加图书...");
		return NONE;
	}
}

编写Action、Service、DAO 通过注解声明Bean ,进行注解注入
@Controller
@Service
@Repository

@Controller // 被Spring 管理
@Scope("prototype")
public class BookAction extends ActionSupport implements ModelDriven<Book>{


@Service("bookService")
@Transactional
public class BookService {
	
}

@Repository("bookDAO")
public class BookDAO {

}

通过 @Autowired 注解完成依赖注入

Hibernate注解配置

@Entity // 实体类
@Table(name="book") // 表名
public class Book {
	@Id // 主键字段
	@GeneratedValue(strategy=GenerationType.IDENTITY) // 自动生成
	private Integer id ;
	@Column(name="name") // 如果不写column 属性名就是字段名 
	private String name;
	private Double price ;

注意:SessionFactory如果不用hbm而使用注解,就不能使用 LocalSessionFactoryBean 配置 ,使用 AnnotationSessionFactoryBean

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<!-- 将连接池注入到SessionFactory -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 配置hibernate常用属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 引用注解类 -->
		<property name="packagesToScan">
			<list>
				<value>com.my.bean</value>
			</list>
		</property>
	</bean>

Coding Diary

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值