SSH整合

SSH整合(Spirng4.x+struts2+Hibernate4.x)
  • Spring4.x:主要是IOC/AOP/事务管理/及抢走Hibernate的工厂方法

  • Struts2: 主要核心包括拦截器(等同于serlvt的过滤器),Action,struts2标签库及OGNL表达式.相当于mvc的控制层,起到控制层作用,接收请求,转发视图.

  • Hibernate4.x:基于ORM的持久化框架.

具体配置

顺序:
Spring->Hibernate->stuts2

  • 保留Hiberate.cfg.xml
将连接数据库的四个参项加到Spring的配置文件创建DataSource对象,并删除cfg.xml的四个参数
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
    <property name="url" value="jdbc:mysql://localhost:3306/ssh"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>  
然后将datasource注入到sessionFactory.其他都相同
  • 不保留Hiberate.cfg.xml的配置
    <context:annotation-config/>
    <!--spring扫描注解的包-->
    <context:component-scan base-package="com.kxind.dao,com.kxind.action,com.kxind.biz"/>

     <!--配置数据源 注入到Spring工厂里面去-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/ssh"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="username" value="root"></property>
    </bean>
    <!--Spring工厂,代替Hibernate工厂-->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <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>
            </props>
        </property>
        <!--  Hibernate的映射文件的路径-->
        <property name="mappingResources">
            <list>
                <value>com/kxind/entity/Good.hbm.xml</value>
            </list>
        </property>
    </bean>
    <!--事务管理器-->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!--注解的事务管理器-->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="GoodDAO" class="com.kxind.entity.GoodDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="TestAction" class="com.kxind.action.TestAction" scope="prototype">
        <property name="goodDAO" ref="GoodDAO"></property>
    </bean>
    <!-- 定义一个通知方法-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 事务执行方式 REQUIRED:指定当前方法必需在事务环境中运行, 如果当前有事务环境就加入当前正在执行的事务环境,; 如果当前没有事务,就新建一个事务。 
            这是默认值。 -->
        <tx:attributes>
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" />
            <tx:method name="import*" propagation="REQUIRED" />
            <!-- & g& V8 V, T+ {5 T' q 指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。 
                查询定义即可               read-only="true" 表示只读' -->
            <tx:method name="*" propagation="NOT_SUPPORTED" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!--定义一个切面-->
    <aop:config>
        <aop:pointcut id="serviceOperation" expression="execution(* com.kxind..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>

</beans>  
  • Hibernat实现延迟加载
<filter>  
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>  
<filter-mapping>  
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ASYNC</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>  

然后就可以放心大胆的测试了..测试的话已通过增删改查及分页.

github地址:https://github.com/kxinds/ssh_demo

kxind

性别:男. 敢于尝试 爱折腾的死宅程序猿. https://github.com/kxinds