SSH整合(零配置)


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拦截器中需要用到)

同时,将springContext.xml配置到src下面。     


2. 添加Hibernate必要的Libraries    
选择以下10个jar,并配置到/WEB-INF/lib下   
Hibernate-3.6.10.jar   (核心JAR包)

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
(即不单独创建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下     
commons-logging-1.1.1.jar  (日志生成)
freemarker-2.3.19.jar  (Freemarker是struts2默认的模版语言 )
ognl-2.7.3.jar  (Struts2默认的表达式语言OGNL)
xwork-core-2.1.6.jar   (也是Struts2核心包,毕竟struts2很大部分是来自webwork )

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>

 </filter-mapping>   
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" /> <!-- 表对象扫描路径 -->

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值