Eclipse+Struts2+Hibernate4+Spring4的整合

在前面Struts2和Hibernate4的整合基础上,对Spring4进行整合,网上参考的大概都是Spring4+Hibernate3或者基于MyEclispe的,这里把自己研究后的配置和大家分享一下。

本次相关的版本如下:

Spring : spring-framework-4.0.1.RELEASE

1.将相关的jar包导入:

1.1libs目录下包含所有的jar包(不需要复制结尾为sources和javadoc的jar包)到SSHProject项目的lib目录

Eclipse+Struts2+Hibernate4+Spring4的整合_第1张图片

1.2 Hibernate内lib/optional/c3p0下的c3p0-0.9.2.1.jar复制到lib不目下

 Eclipse+Struts2+Hibernate4+Spring4的整合_第2张图片

 

2.添加Spring的配置信息,放在WEB-INF下(都为Spring4的配置和Spring3的参数不同,大家注意一下相应的class名字)。

applicationContext.xml:

复制代码
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>com.mysql.jdbc.Drivervalue>
        property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost/ss3hvalue>
        property>
        <property name="user">
            <value>rootvalue>
        property>
        <property name="password">
            <value>rootvalue>
        property>
        <property name="maxPoolSize">
            <value>80value>
        property>
        <property name="minPoolSize">
            <value>1value>
        property>
        <property name="initialPoolSize">
            <value>1value>
        property>
        <property name="maxIdleTime">
            <value>20value>
        property>
    bean>

    
    
    
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource" />
        property>
        <property name="mappingResources">
            <list>
                <value>com/tiny/ssh/beans/User.hbm.xmlvalue>
            list>
        property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialectprop>
                <prop key="show_sql">trueprop>
                <prop key="hibernate.jdbc.batch_size">20prop>
            props>
        property>
    bean>

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

    <bean id="baseDao" class="com.tiny.ssh.daoImpl.UserDao">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        property>
    bean>

    
    <bean id="userManager" class="com.tiny.ssh.serviceImp.UserManagerImpl">
        <property name="dao">
            <ref bean="baseDao" />
        property>
    bean>

    
    <bean id="regAction" class="com.tiny.ssh.action.RegisterAction">
        <property name="userManager">
            <ref bean="userManager" />
        property>
    bean>

    

beans>
复制代码

3.删除Hibernate的配置文件Hibernate.cfg.xml和工厂类HibernateSesseionFactory类。他们的工作已经交给Spring去做,已经不再有用。

4.修改相应的类

接口类BaseDao.java:

复制代码
package com.tiny.ssh.dao;

import org.hibernate.HibernateException;

public interface BaseDao {

    public void saveObject(Object obj) throws HibernateException;

}
复制代码

实现类UserDao.java (注意下面注释中不一样的地方,由于Hibernate4的默认配置不在有getCurrentSession()方法,要用openSession()来代替):

##刚写博文的时候,这里有点弄的不是太清楚##根据 @galison 的提议修改##

如果替换为openSession(),则事务的管理由Hibernate来处理,Hibernate4与3不一样的地方,管理不是很方便,可以应用原来的getCurrentSession()来获取,此时由spring来管理事务,有如下两种方式(更详细的资料可以参考网络中的说明和文档)

(1)配置<propkey="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContextprop>

(2)添加事务注解 @Transactional 

复制代码
package com.tiny.ssh.daoImpl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.tiny.ssh.dao.BaseDao;

public class UserDao implements BaseDao {
    
    private SessionFactory sessionFactory;  
      
    public SessionFactory getSessionFactory() {  
        return sessionFactory;  
    }  
  
    @Autowired  
    public void setSessionFactory(SessionFactory sessionFactory) {  
        this.sessionFactory = sessionFactory;  
    }  
  
    private Session getCurrentSession() {  
        return sessionFactory.openSession();  
       // return sessionFactory.getCurrentSession();
    
    }
    
    @Override
    public void saveObject(Object obj) throws HibernateException {
        this.getCurrentSession().save(obj);  
    }

}    
复制代码

 

业务逻辑实现类UserManagerImpl.java:

复制代码
package com.tiny.ssh.serviceImp;

import org.hibernate.HibernateException;
import org.springframework.beans.BeanUtils;

import com.tiny.ssh.beans.User;
import com.tiny.ssh.dao.BaseDao;
import com.tiny.ssh.forms.UserForm;
import com.tiny.ssh.service.UserManager;

public class UserManagerImpl implements UserManager {

    private BaseDao dao;

    public void setDao(BaseDao dao) {
        this.dao = dao;
    }

    @Override
    public void regUser(UserForm userForm) throws HibernateException {
        User user = new User();
        BeanUtils.copyProperties(userForm, user);
        dao.saveObject(user);
    }

}
复制代码

用户注册Action类RegisterAction.java :

复制代码
package com.tiny.ssh.action;

import com.opensymphony.xwork2.ActionSupport;
import com.tiny.ssh.forms.UserForm;
import com.tiny.ssh.service.UserManager;

public class RegisterAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private UserForm user;

    private UserManager userManager;

    public UserForm getUser() {
        return user;
    }

    public void setUser(UserForm user) {
        this.user = user;
    }

    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }

    public String execute() {
        try {
            userManager.regUser(user);
            return SUCCESS;

        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }

}
复制代码

加入Listener后的web.xml

复制代码
xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>SSH Projectdisplay-name>

    <filter>
        <filter-name>SSHfilter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
    filter>

    <filter-mapping>
        <filter-name>SSHfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    <welcome-file-list>
        <welcome-file>Register.jspwelcome-file>
    welcome-file-list>

web-app>
复制代码

5.最终的层次结构

 Eclipse+Struts2+Hibernate4+Spring4的整合_第3张图片

6.在期间有一些ClassNotFound的错误,按照网上的提示多导入了一些包,最终所引用的所有的包(共50个包)

Eclipse+Struts2+Hibernate4+Spring4的整合_第4张图片

        Eclipse+Struts2+Hibernate4+Spring4的整合_第5张图片

7.结果

Eclipse+Struts2+Hibernate4+Spring4的整合_第6张图片

 

 

Eclipse+Struts2+Hibernate4+Spring4的整合_第7张图片

 

总结:至此,大概的环境都已经完事,希望大家在配置的时候用自己的名字,这样能更好的找到其中的映射文件已经功能,更快的上手,有疑问的欢迎留言一起交流 (^.^)

 

参考链接:

http://blog.csdn.net/yeohcooller/article/details/9316923

标签:  SSH
好文要顶  关注我  收藏该文   
可爱的波儿胖
关注 - 4
粉丝 - 7
+加关注
0
0
(请您对文章做出评价)
« 上一篇: [SSH] Eclipse+Struts+Hibernate的简单应用
» 下一篇: [SSH] Eclipse+Struts2+Hibernate4+Spring4的手动入门配置流程
posted @  2015-07-27 11:50  可爱的波儿胖 阅读( 380) 评论( 4)  编辑  收藏

  
#1楼   2015-12-27 16:23  galison   
请问一下博主,hibernate4里假如自己opensession()之后还会交给spring管理吗?
支持(0) 反对(0)
  
#2楼 [ 楼主2015-12-28 11:25  可爱的波儿胖   
@galison
用opensession()的话,不是spring来管理。
我在网上查了一下,如果需要spring管理的话,需要配置hibernateProperties中的属性
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
支持(0) 反对(0)
  
#3楼   2015-12-28 12:34  galison   
@可爱的波儿胖
所以说,这没有说清楚,建议博主改一下那个内容,本来ssh框架的session就是要交给spring去管理的,据我查的资料显示@transactional也可以实现这个功能。
支持(0) 反对(0)
  
#4楼 [ 楼主2015-12-28 17:33  可爱的波儿胖   
@galison
好的 多谢提醒
支持(0) 反对(0)
刷新评论 刷新页面 返回顶部
【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】融云即时通讯云-专注为 App 开发者提供IM云服务
【推荐】百度开放云-三月超低价促销
最新IT新闻:
·  Android N beta可能开放给更多设备测试
·  去哪儿起诉票代公司索赔105万元 称提供无法使用机票
·  电影《魔兽》新海报:十大主角凑齐
·  微软发全新Win10无线显示适配器:499元
·  博纳影业完成私有化 阿里影业占股8.29%
»  更多新闻...
最新知识库文章:
·  我是一个线程
·  为什么未来是全栈工程师的世界?
·  程序bug导致了天大的损失,要枪毙程序猿吗?
·  如何运维千台以上游戏云服务器
·  架构漫谈(一):什么是架构?
»  更多知识库文章...

你可能感兴趣的:(J2EE开发基础)