Spring(三)Spring整合Struts2、Hibernate

来源:互联网 发布:桐乡淘宝美工 编辑:程序博客网 时间:2024/09/21 08:16

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:///hibernatejdbc.driverClass=com.mysql.jdbc.Driverjdbc.user=rootjdbc.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>
0 0