[SSH] Eclipse+Struts2+Hibernate4+Spring4的整合


在前面Struts2Hibernate4的整合基礎上,對Spring4進行整合,網上參考的大概都是Spring4+Hibernate3或者基於MyEclispe的,這里把自己研究后的配置和大家分享一下。

本次相關的版本如下:

Spring : spring-framework-4.0.1.RELEASE

1.將相關的jar包導入:

1.1libs目錄下包含所有的jar包(不需要復制結尾為sources和javadoc的jar包)到SSHProject項目的lib目錄

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

 

 

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.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost/ss3h</value>
        </property>
        <property name="user">
            <value>root</value>
        </property>
        <property name="password">
            <value>root</value>
        </property>
        <property name="maxPoolSize">
            <value>80</value>
        </property>
        <property name="minPoolSize">
            <value>1</value>
        </property>
        <property name="initialPoolSize">
            <value>1</value>
        </property>
        <property name="maxIdleTime">
            <value>20</value>
        </property>
    </bean>

    <!--定義Hibernate的SessionFactory -->
    <!-- SessionFactory使用的數據源為上面的數據源 -->
    <!-- 指定了Hibernate的映射文件和配置信息 -->
    <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.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </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>

    <!-- 用戶注冊的Action -->
    <bean id="regAction" class="com.tiny.ssh.action.RegisterAction">
        <property name="userManager">
            <ref bean="userManager" />
        </property>
    </bean>

    <!-- more bean definitions go here -->

</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)配置<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>

(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 Project</display-name>

    <filter>
        <filter-name>SSH</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

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

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>Register.jsp</welcome-file>
    </welcome-file-list>

</web-app>

5.最終的層次結構

 

6.在期間有一些ClassNotFound的錯誤,按照網上的提示多導入了一些包,最終所引用的所有的包(共50個包)

       

7.結果

 

 

 

總結:至此,大概的環境都已經完事,希望大家在配置的時候用自己的名字,這樣能更好的找到其中的映射文件已經功能,更快的上手,有疑問的歡迎留言一起交流 (^.^)

 

參考鏈接:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM