SSH(Spring+Struts2+Hibernate)整合过程

在整合框架的过程中,每一步都要测试,这样容易排查出问题,出现问题也就得从头开始

第一步,导包

将需要的jar包导入到项目中

hibernate所需要的jar包

struts2所需要的jar包

spring所需要的jar包


导包时,如果发现是同一个包,版本不同一定要删除一个(建议低版本)因为高版本可以兼容低版本

Struts2-spring-plugin-2.3.24.jar

一旦导入了该包,struts2在启动的时候会自动寻找spring容器,如果没有配置spring就会报异常


第二步测试spring配置是否成功

首先创建一个applicationContext.xml文件

导入四个约束:bean context  aop tx


在web.xml中配置监听器

<!--spring 设置监听器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

三 单独配置struts2

先把struts2-spring-plugin-2.3.24.jar

然后书写struts2.xml文件导入约束,书写刚刚的userAction的配置


<package name="main" namespace="/" extends="struts-default">
    <action name="userAction_*" class="cn.hd.action.UserAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>
</package>

在web.xml中配置struts2过滤器

<!--struts 配置过滤器-->
<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>

四 整合spring和struts

(1)将刚刚删除的包导入项目中

Struts2-spring-plugin-2.3.23.jar

(2)添加常量

<!--action的创建交给spring-->
<constant name="struts.objectFactory" value="spring"></constant>
<!--spring负责装配action的属性-->
<constant name="struts.objectFactory.spring.autoWire" value="name"></constant>
<!--热部署,开启友好提示-->
<constant name="struts.devMode" value="true"></constant>

(3)由spring管理action

①struts2创建action,由spring负责struts2的属性注入

struts2配置文件

<struts>
    <!--action的创建交给spring-->
    
<constant name="struts.objectFactory" value="spring"></constant>
    <!--spring负责装配action的属性-->
    
<constant name="struts.objectFactory.spring.autoWire" value="name"></constant>
    <!--热部署,开启友好提示-->
    
<constant name="struts.devMode" value="true"></constant>

    <package name="main" namespace="/" extends="struts-default">
        <action name="userAction_*" class="cn.hd.action.UserAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

spring的配置文件


<bean name="userService" class="cn.hd.service.impl.UserServiceImpl"></bean>

<bean name="userAction" class="cn.hd.action.UserAction">
    <property name="userService" ref="userService"></property>
</bean>

②完全交给spring去管理action

在配置action的class属性值改为spring中的bean的名字

<struts>
    <!--action的创建交给spring-->
    
<constant name="struts.objectFactory" value="spring"></constant>
    <!--spring负责装配action的属性-->
    
<constant name="struts.objectFactory.spring.autoWire" value="name"></constant>
    <!--热部署,开启友好提示-->
    
<constant name="struts.devMode" value="true"></constant>

    <package name="main" namespace="/" extends="struts-default">
        <action name="userAction_*" class="userAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

spring配置文件


<bean name="userService" class="cn.hd.service.impl.UserServiceImpl"></bean>

<bean name="userAction" class="cn.hd.action.UserAction" scope=prototype>
    <property name="userService" ref="userService"></property>
</bean>

注意:spring配置action要配置的类的创建模式为多例模式


单独整合hibernate

1.1 书写实体bean类和orm数据源文件

package cn.hd.entity;

public class User {

    private Integer stuid;
    private String name;
    private String password;
    private Integer money;

    public Integer getStuid() {
        return stuid;
    }

    public void setStuid(Integer stuid) {
        this.stuid = stuid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User{" +
                "stuid=" + stuid +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                '}';
    }
}

1.2书写核心配置文件

将线程绑定事务隔离级别删除,然后使用spring管理事务

<!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="cn.hd.entity.User" table="t_user">
        <id name="stuid" column="stuid">
            <generator class="native"></generator>
        </id>
        <property name="name" column="name"></property>
        <property name="password" column="password"></property>
        <property name="money" column="money"></property>
    </class>
</hibernate-mapping>

1.3书写测试类,测试hibernate单独配置成功


@Test
public void fun(){
    Configuration configuration = new Configuration().configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    User user = new User();
    user.setMoney(1000);
    user.setName("莫邪");
    user.setPassword("123");
    session.save(user);
    transaction.commit();
    session.close();
    sessionFactory.close();
}

Hibernate和spring的结合

实际上结合的原理即使hibernate中的sessionFactory和事务交给spring管理

有两种管理方案

(一)hibernate中的配置文件不动,在spring配置文件中配置sessionFactory

<!--配置hibernate-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>

书写测试代码


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {

    @Resource(name = "sessionFactory")
    private SessionFactory sessionFactory;

@Test
    public void fun(){
        Session session = sessionFactory.openSession();
        User user = session.get(User.class, 1);
        System.out.println(user);
    }
}

(二)不使用hibernate配置文件,所以配置写入到spring配置文件中

<!--配置hibernate-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!--第一种-->
    <!--<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>-->

 

<!--第二种-->
<property name="hibernateProperties">
    <props>
        <prop key="connection.driver_class">com.mysql.jdbc.Driver</prop>
        <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh</prop>
        <prop key="hibernate.connection.username">root</prop>
        <prop key="hibernate.connection.password">1234</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</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="mappingDirectoryLocations" value="classpath:cn/hd/entity"></property>


整合c3p0连接池

使用spring读取连接池的配置文件

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

配置连接池的bean

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}"></property>
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
    <property name="user" value="${jdbc.user}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>

将hibernate中的数据库配置删除,增加一个propertity为dataSource

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

整合状态下操作数据库(dao)

书写dao类,并让dao类继承hibernateDaoSupport

提供了一个hibernateTemplate模板

这个模板可以实现hibernate的crud  hql  criteria  sql 四种查询


public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    @Override
    public void add(User user) {
        HibernateTemplate hibernateTemplate = getHibernateTemplate();
        hibernateTemplate.save(user);
    }


整合spring aop事务

(一)获得事务管理对象(dataSourceTransaction,HibernateTransactionManager)

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

(二)配置事务通知

<!--配置事务-->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="find" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
</tx:advice>
<!--将事务织入到目标对象-->
<aop:config>
    <aop:pointcut id="txPc" expression="execution(* cn.hd.service.impl.*ServiceImpl.*(..))"></aop:pointcut>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"></aop:advisor>
</aop:config>

介绍Template模板

使用hibernateTransactionTemplate.execute就拿到了session

回到了原始的hibernate开发


@Override
public List<User> getAll() {
    return this.getHibernateTemplate().execute(new HibernateCallback<List<User>>() {
        @Nullable
        @Override
        public List<User> doInHibernate(Session session) throws HibernateException {
            String sql = "from  User";
            Query query = session.createQuery(sql);
            List<User>list = query.list();
            return list;
        }
    });
}










  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值