Spring(三)Spring整合Struts2、Hibernate

SSH整合

spring分别整合hibernate与struts。
spring管理hibernate中的对象以及struts中的对象。

整合原理

导包

hibernate

在lib下导入required下的包

struts2

导入apps下struts2-blank下的包
注意:删除重复的包,优先删除低版本.javassist.jar

struts2整合spring包,注意:该包的功能会在struts2启动时从application域寻找spring容器,如果找不到将会抛出异常.

spring

  • 导入4个核心包以及两个依赖包(bean、core、context、exception、apache下的log4j、logging)
  • spring-jdbc、spring-tx、spring-orm
  • 数据库驱动、c3p0连接池
  • spring-aop、spring-aspects
  • aspectj织入包、aop联盟
  • spring-web
  • spring-test、junit4类库

web

jstl.jar

整合spring到web项目

配置监听器

配置监听器,让spring容器随项目的启动而创建

<!--配置监听器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定容器的配置文件位置 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-name>classpath:applicationContext.xml</param-name>
</ocntext-param>

准备spring配置文件

在src目录下创建applicationContext.xml文件,并导入beans、context、aop、tx约束

整合struts2到web项目

创建Action对象

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    public String regist() throws Exception {
        //1.service执行注册逻辑
        userService.regist(user);
        //2.重定向到登录页面
        return "toLogin";
    }
    @Override
    public User getModel() {
        return user;
    }
}

创建struts2配置文件

<struts>
    <package name="crm" namespace="/" extends="struts-default">
        <action name="userAction_*" class="cn.it.web.action.UserAction" method="{1}">
            <result name="toLogin" >/login.jsp</result>
        </action>
    </package>
</struts>

配置入口过滤器

<!--配置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>/*</url-pattern>
</filter-mapping>

spring整合strurs2

配置整合spring常量

在struts.xml中配置

<!--配置常量,指定由spring完成属性注入-->
<context name="struts.objextFactory" value="spring"></context>

struts2创建Action,由spring负责组装

方案一:Action对象仍然由struts2创建,spring负责组装依赖
  1. 指定由spring自动装配依赖属性


  2. 在action中准备依赖属性

    public class UserAction extends ActionSupport implements ModelDriven {
    private UserService userService;
    }

  3. 在spring中配置依赖属性对象

Action对象创建与依赖注入全部由spring完成

方案二:Action对象创建与依赖注入全部由spring完成(推荐使用)
  1. 将Action配置到spring容器中

    <bean name="userService" class="cn.it.service.UserServiceImpl"></bean>
    <bean name="userAction" class="cn.it.web.action.UserAction">
        <property name="userService" ref="userService"></property>
    </bean>
    
  2. 在Action配置中的class属性,填写对象的BeanName


    login.jsp

搭建Hibernate框架

准备实体与映射文件

如:

  • User.java
  • User.hbm.xml

准备主配置文件

  • 主配置文件名称:hibernate.cfg.xml
  • 导入dtd映射文件
  • 填写配置

    <hibernate-configuration>
        <session-factory>
            <!-- 5个必选 -->
             <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
             <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
             <property name="hibernate.connection.username">root</property>
             <property name="hibernate.connection.password">123</property>
             <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
            <!-- 3个选选 -->
             <!-- 设置sql语句打印在控制台上 -->
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
    
            <!-- 自动建表 -->
            <property name="hibernate.hbm2ddl.auto">update</property>
    
            <!-- 引入映射文件 -->
            <mapping resource="cn/test/domain/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
    

代码测试

@Test
//测试框架搭建是否成功
public void test(){
    Configuration conf = new Configuration().configure();
    SessionFactory sf = conf.buildSessionFactory();
    Session session = sf.opensession();
    //开启事务
    Transaction tx = session.beginTransaction();
    //执行操作
    session.sace(new User("测试"));
    //提交事务
    tx.commit();
    //关闭资源
    session.close();
    sf.close();
}

整合spring与hibernate

整合方式一:使用原生Hibernate配置文件

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

整合方式二:将Hibernate配置转移到spring中

<!--将Hibernate配置转移到spring中-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!--指定可选|必选属性-->
    <property name="hibernateProperties">
        <props>
            <!--必选配置-->
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql:///hibernate</prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">123</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>
    <!--引入映射文件-->
    <property name="" value=""></property>
</bean>

将c3p0连接池配置到SessionFactory中

准备db.properties

jdbc.jdbcUrl=jdbc:mysql:///hibernate
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123

读取db.properties

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

配置连接池对象,注入连接配置

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

将连接池对象注入到SessionFactory中

<!--将Hibernate配置转移到spring中-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!--将连接池注入SessionFactory-->
    <property name="dataSource" ref="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>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <!--引入映射文件-->
    <property name="" value=""></property>
</bean>

将Dao&Hibernate模板配置到spring

书写Dao类

public Class UserDaoImpl implements UserDao {
    private HibernateTemplate ht;

    public void setHt(HibernateTemplate ht){
        this.ht = ht;
    }

    public void save(User user){
        ht.save(user);
    }
}

配置Hibernate模板到spring

<!--配置Hibernate模板-->
<bean name="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate" >
    <property name="dataSource" ref="dataSource"></property>
</bean>

配置dao到spring

<bean name="userDao" class="cn.it.dao.impl.UserDaoImpl" >
    <property name="ht" ref="hibernateTemplate"></property>
</bean> 

整合AOP事务

完成Service

public Class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    public void regist(User user){
        userDao.regist(user);
    }
}

配置核心事务管理器

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

事务配置

xml配置
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
        <tx:method name="update*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
        <tx:method name="delete*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
        <tx:method name="find*" propagation="REQUIRED" read-only="true" isolation="REPEATABLE_READ"/>
        <tx:method name="*" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
    </tx:attributes>
</tx:advice>
<!--配置切面-->
<aop:config>
    <aop:pointcut experssion="execution(* cn.it.service.*serviceImpl.*(..))" id="txPC" />
    <aop:advice advice-ref="txAdvice" pointcut-ref="txPC" />
</aop:config>
注解配置
<!--开启注解管理事务开关-->
<tx:annocation-driven transaction-manager="transactionManager" />

Service中使用注解

@Transactional(propagation=Propagation.REQUIRED,readOnly=true,isolation=Isolation.REPEATABLE_READ)
public class UserServiceImpl implements UserService {

    @Transactional(propagation=Propagation.REQUIRED,readOnly=false,isolation=Isolation.REPEATABLE_READ)
    @Override
    public void regist(User user) {
        //1.判断注册名是否重复
        User existUser = userDao.getByUserCode(user.getUser_code());
        if (existUser != null) {
            throw new RuntimeException("用户名已经存在!");
        }
        //保存用户
        userDao.save(user);

    }
}

解决no-session问题

配置扩大session作用范围的过滤器

<!--注意:所有除struts2以外的过滤器都应配置到strut2过滤器之前-->
<!--解决no-session过滤器:OpenSessionInViewFilter-->
<filter>
    <filter-name>OpenSession</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>OpenSession</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值