Spring学习day04

本文详细介绍SSH(Spring、Struts2、Hibernate)三大框架的整合原理与步骤,包括配置、依赖注入、事务管理等内容,旨在帮助开发者理解并实现框架间的无缝对接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、三大框架整合原理

本文的主要目的是为了整合SSH三大框架。

三大框架整合原理:Spring作为容器,创建存储和管理Struts2的Action对象、Hibernate的SessionFactory对象和事务

二、导包

分别导三大框架的包,以及框架整合相关的包。

框架整合相关的包:Struts2-spring-plugin(注意:该包一旦导入,则struts2在启动时就会寻找spring容器,找不到就会抛出异常)

Spring所要导的包如下图所示。

三、单独整合Spring到web项目

1、创建配置文件并导入约束(beans|context|aop|tx)

2、配置spring随项目启动而启动:配置listener(ContextLoadListener)

3、配置spring配置文件位置参数:

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:applicationContext.xml</param-value>

</context-param>

四、单独整合Struts2到web项目

1、配置struts2主配置文件

2、配置struts2核心过滤器到web.xml

五、整合Struts2和Spring

1、导包(struts2-spring-plugin)

2、配置常量

<constant name="struts.objectFactory" value="spring"></constant>              //将action的创建交给spring

// struts.objectFactory.spring.autowire = name:spring负责action的依赖属性(默认打开),该常量已经由struts2在default.properties中配置,在此不用配置

3.1 整合方案一:struts2自己创建action,由spring负责组装依赖属性

(不推荐使用,理由:为了spring的功能能够应用到action,spring需要管理action的完整生命周期)

class属性上依然配置action的完整类名,struts2仍然自己创建action,由spring负责组装Action的依赖属性

<action name="UserAction_*" class="domain.UserAction" method="{1}"></action>

3.2 整合方案二:spring负责action的创建和组装(推荐使用)

1、在applicationContext.xml中手动配置依赖属性

//注意:Action对象作用范围一定是多例的,这样才符合Struts2架构

<bean name="userAciton"  class="domain.UserAction" scope=“prototype”>

    <property name="userService" ref="userService"></property>

</bean>

2、class属性上填写applicationContext.xml中action对象的bean标签的name

<action name="UserAction_*" class=‘"userAction" method="{1}"></action>

六、单独配置Hibernate

1、导入实体类&orm元数据

2、配置主配置文件

七、整合Hibernate和Spring

1、将SessionFactory配置到Spring容器中

<bean name="sessionFactory" class=“org.....LocalSessionFactoryBean”></bean>

2.1 加载配置方案1:仍然使用外部hibernate.cfg.xml配置文件(不推荐)

<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>

2.2 加载配置方案2:在spring配置中配置hibernate配置基本信息(推荐使用)

<property name="hibernateProperties" >

    <props>

          //必选配置

         //当配置完C3P0连接池后,以下前四个属性不应配置,以免冲突

        <!-- <prop key="hibernate.connection.driver_class">com.mysql.jdbc.driver</prop>

         <prop key="hibernate.connection.url">jdbc:mysql:///crm_32</prop>

         <prop key="hibernate.connection.username">root</prop>

         <prop key="hibernate.connection.password">1234</prop>  -->

         <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>

//引入orm元数据, 指定orm元数据所在的包路径,spring会自动读取该包内的所有配置文件

<property name="mappingDictionaryLocations" value="classpath:domain"></property>

八、引入C3P0连接池

1、配置C3P0连接池

//指定Spring读取db.properties配置文件

<context:property-placeholder location="classpath:db.properties">

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPoolDataSource">

    <property name="jdbcUrl" value="${jdbc.jdcbUrl}"></property>

    <property name="jdbcDriver" value="${jdbc.jdbcDriver}"></property>

    <property name="jdcbUser" value="${jdbc.jdcbUser}"></property>

    <property name="jdbcPassword"  value="${jdbc.jdcbPassword}"></property>

</bean>

2、将C3P0连接池配置到SessionFactory中

<property name="dataSource" ref="dataSource"></property>

九、HibernateTemplate操作数据库

Spring提供了一个HibernateTemplate对象来操作数据库,与JdbcTemplate类似,也存在一个HibernateDaoSupport来简化配置过程,即只需要继承HibernateDaoSupport类即可快速获得HibernateTemplate对象。

Dao类创建:继承HibernateDaoSupport。

public class UserDaoImpl extends HibernateDaoSupport implements UserDao{

    public User getUserByUserCode(final String usercode){

        //HQL方法操作数据库

        return  getHibernateTemplate.execute(new HibernateCallback<User>(){
           public User doHibernate(Session session) throws Exception{

               String sql = "from User where user_code=?";

                Query query = session.createQuery(sql);

                query.setParamter(0, usercode);

                User user = (User)query.uniqueResult();

                return user;

           }

       ]);

       //使用Criteria操作数据库

       DetachedCriteria dc = DetachedCriteria.forClass(User.class);

       dc.add(Restriction.eq("user_code", usercode));

        List<User> list = (List<User>) getHibernateTemplate.findByCriteria(dc);

        if(list != null && list.size()>0){

             return list.get(0);

         }else{

             return null;

         }

    }

}

十、整合AOP事务

1、准备工作:配置核心事务管理器

<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory">

</bean>

2.1 xml配置AOP事务

1、配置目标对象   

2、配置通知(Advice):<tx:advice>

3、将通知织入:<aop:config>

2.2 注解配置AOP事务

1、开启注解事务  2、Service类中使用注解进行配置

十一、扩大session作用范围

为了避免懒加载时出现no-session问题,需要扩大session的作用范围。

做法:在web.xml中配置openSessionInView过滤器。

注意:openSessionInView过滤器必须要配置在Struts2核心过滤器之前,因为Struts2核心过滤器不会放行。

<filter>

    <filter-name>openSessionInView</filter-name>

    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInView</class>

</filter>

<filter-mapping>

    <filter-name>openSessionInView</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值