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 配置文件
- 通过 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>
- 将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>