1. 添加Spring 的Libraries
选择以下jar文件,并配置到/WEB-INF/lib下Spring-2.5.6.jar (spring核心包,里面囊括了aop,beans,context,dao,jdbc,web等必须的jar包)
spring-security-core-2.0.5.jar(Authentication登陆验证以及EntityIntercepor拦截器中需要用到)
2. 添加Hibernate必要的Libraries
选择以下10个jar,并配置到/WEB-INF/lib下
hibernate-jpa-2.0-api-1.1.1.jar(bean注解)
hibernate-search-3.4.1.jar (baseentity里面的时间自动写入策略,主要用于Hibernate的持久化模型的全文检索工具)
antlr.jar( Another Tool for Language Recognition,可以构造语言识别器,解析HQL需要)
commons-collections.jar ( 包含了一些Apache开发的集合类,功能比java.util.*强大)
dom4j.jar ( 越来越多的Java软件都在使用dom4j来操作XML,Hibernate也不例外)
javassist.jar ( 操作字节码,跟cglib相关)
jta.jar ( 定义JTA规范的JAR包,当Hibernate使用JTA的时候需要)
slf4j-api-1.6.4.jar (整合各种日志框架的工具)
slf4j-log4j12-1.6.4.jar (将slf4j和log4j关联起来的JAR包)
(即不单独创建hibernate的配置文件,而是将其作为资源文件整合到springContext.xml中)
3. 添加
c3p0-0.9.1.2.jar(springContext.xml数据连接池配置)
commons-lang-2.6.jar(数据库表命名策略类需要用到jar包里面的StringUtils类)
到lib下,以消除springContext.xml中找不到class的的错误
4. 添加struts2的9个jar到lib下
struts2-core-2.1.8.jar (struts2的核心jar包)
commons-fileupload-1.2.1.jar(注意这个与2.0.x版本不同,即使不上传文件这个也是需要的)
commons-io-1.3.2.jar (注意这个与2.0.x版本不同,即使不上传文件这个也是需要的)
注意:由于要整合Spring,还需要添加struts2-spring-plugin-2.1.8.jar
本人用的项目是零配置的,所以还用到了struts2-convention-plugin-2.1.8.jar
5. 配置web.xml
5.1 配置spring的应用上下文
<!-- spring的应用上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/springContext*.xml</param-value>
</context-param>
5.2 配置struts2的过滤器
<!-- 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>*.action</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
5.3 配置spring的监听器,以便在启动时就自动加载spring的配置
<!-- spring的监听器,以便在启动时就自动加载spring的配置 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
5.4 配置OpenSessionInViewFilter过滤器,处理事务
<!-- OpenSessionInViewFilter过滤器 -->
<filter>
<filter-name>lazyLoadingFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>lazyLoadingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
6. 配置struts.xml
<!-- 开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 添加一个常量,将action交予spring处理 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 零配置组件 -->
<constant name="struts.convention.classes.reload" value="false" />
<constant name="struts.convention.action.packages" value="test.action" />
<constant name="struts.convention.result.path" value="/template/" />
<constant name="struts.convention.action.name.separator" value="_" />
<!-- 命名空间 -->
<package name="admin" extends="struts-default" namespace="/admin"><!-- 继承了struts2-core-2.1.8.jar里面的struts默认配置文件(struts-default.xml)定义的package节点 -->
<interceptors>
<interceptor-stack name="baseStack">
<interceptor-ref name="validation">
<!-- 在struts-default.xml配置文件里面没有配置,这里必须加一下,不然会找不到页面,报:No result defined for action and result -->
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
7.springContext.xml配置
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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/aop
http://www.springframework.org/schema/aop/spring-aop-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/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-lazy-init="true">
<context:component-scan base-package="test" /><!-- 组件扫描路径 -->
<context:property-placeholder location="classpath*:/jdbc.properties"/><!-- jdbc配置文件路径 -->
<!-- 配置数据连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize" value="${pool.initialPoolSize}" />
<property name="minPoolSize" value="${pool.minPoolSize}" />
<property name="maxPoolSize" value="${pool.maxPoolSize}" />
<property name="maxIdleTime" value="${pool.maxIdleTime}" />
<property name="acquireIncrement" value="${pool.acquireIncrement}" />
<property name="checkoutTimeout" value="${pool.checkoutTimeout}" />
<property name="maxIdleTimeExcessConnections" value="${pool.maxIdleTimeExcessConnections}" />
</bean>
<!-- 配置数据库表命名策略 -->
<bean id="databaseNamingStrategy" class="test.common.DatabaseNamingStrategy">
<property name="tablePrefix" value="${namingStrategy.tablePrefix}" />
<property name="isAddUnderscores" value="${namingStrategy.isAddUnderscores}" />
<property name="maxLength" value="${namingStrategy.maxLength}" />
</bean>
<!-- session工厂 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="entityInterceptor" ref="entityInterceptor" />
<property name="namingStrategy" ref="databaseNamingStrategy" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</prop>
<prop key="hibernate.search.default.indexBase">${java.io.tmpdir}/webtest/index</prop>
</props>
</property>
<property name="packagesToScan" value="test.entity" /> <!-- 表对象扫描路径 -->
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- spring容器缺省事务管理器,可以配置多个,首先加载的为缺省 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- <tx:annotation-driven transaction-manager="transactionManager_1"/> 在需要声明事物的地方就可以这么写了:@Transactional("transactionManager_1") -->
<!-- 配置事务模板,设置模板bean为abstract bean -->
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 为事务模板注入事务管理器-->
<property name="transactionManager" ref="transactionManager" />
<!-- 设置事务属性-->
<property name="transactionAttributes">
<props>
<!-- PROPAGATION_REQUIRED,readOnly,-Exception
这样的配置,其中:
-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交
readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.
我们下面使用的PROPAGATION_REQUIRED -支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。-->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="springUtil" class="test.util.SpringUtil" lazy-init="false"/>
<bean id="freemarkerManager" class="test.common.FreemarkerManager" />
</beans>
8. 杂记
8.1 struts2-spring-plugin
struts中的action对象工厂由spring接手,需依赖struts2-spring-plugin-2.1.8.jar(这个插件重写了struts的对象工厂,当创建一个action类时,它会根据struts的配置文件的class属性的值与spring配置文件中的id属性的值相匹配。如果没有与之相匹配,将会像没有使用这个插件前一样创建,然后由spring自动装配。) 。
在其jar包根目录里,有这么个文件,struts-plugin.xml,
完整内容如下:
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<!-- Make the Spring object factory the automatic default(自动默认为spring的对象工厂) -->
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.class.reloading.watchList" value="" />
<constant name="struts.class.reloading.acceptClasses" value="" />
<constant name="struts.class.reloading.reloadConfig" value="false" />
<package name="spring-default">
<interceptors>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
</interceptors>
</package>
</struts>
8.2 无
freemarkerManager 需要springUtils和directive下的三个类(PaginationDirective需要pager和directiveUtil)
EntityInterceptor类上面用注解@Component("entityInterceptor"),省去了在springContext.xml中进行注册,在此需要类:ReflectionUtil以及spring的security的jar包
9.整合中出现的问题:
1.异常:Unable to load configuration :缺少commons-fileupload-1.2.1.jar和
commons-io-1.3.2.jar
2.java.lang.NoClassDefFoundError:org/apache/lucene/analysis/Analyzer 缺少jar包:lunce-core-3.4.1.jar。
3.java.lang.NoClassDefFoundError:org/apache/commons/collections/map/LRUMap 缺少jar包:
commons-collections-3.2.1.jar。
4.WARN No appenders could be found for logger:缺少 log4j.properties配置文件,写好后放在src目录下。
5.hibernate不自动建表,首先排除了jar包缺失的问题,仔细看过@Entity的声明后,发现import的class不对,应为:import javax.persistence.Entity;
6.org.hibernate.hql.ast.QuerySyntaxException: T303 is not mapped 。AsdF在sessionFactory这个bean里面,需要将这个对象的扫描目录放进来:<property name="packagesToScan" value="test.entity" /> <!-- 表对象扫描路径 -->