频道栏目
首页 > 资讯 > Java > 正文

SSH框架手动整合——Struts2+Hibernate4+Spring4

16-08-23        来源:[db:作者]  
收藏   我要投稿

最近遇到过一些框架方面的问题,其中有MyBatis、SSH、SpringMVC,其中SSH的一些配置有些忘的差不多了,也有一些同事问了这些问题,前几个月也整合过SSH框架,那个时候是直接拿别人的Jar包直接整合框架,好像是Struts2+Hibernate3+Spring4,这次是相关的Jar从相关的官网下的。

我整合的环境:
——Win 64
——MySQL 5.6
——MyEclipse 2014
——Jar包:struts-2.3.28、spring-framework-4.0.4.RELEASE-dist、hibernate-release-4.3.5.Final

接下来整合的主要步骤是:
1.本文提纲:本文通过一个用户注册的实例讲解SSH的整合。创建Struts项目,整合Hibernate,整合Spring。最后总结如何熟练创建SSH项目。
2.本整合SSH项目,可以进一步扩展例如Struts的国际化,Hibernate的缓存优化,Spring的AOP等,本次博文暂时没有。
3.本次使用的是Tomcat 8.0,MySQL 5.6下的test数据库。
4.创建user表的sql。

create table user(  
userId int auto_increment,  
userName varchar(16) not null,  
password varchar(16) not null,  
gender int not null,  
primary key(userId)  
); 

5.在此博主的基础上解决了所遇到的问题。

接下来开始整合框架:
——创建Struts项目
——创建工程
1.在MyEclipse中创建一个Dynamic Web Project,本文项目名称为SSHShop。
2.把Struts内apps文件夹下的struts2-blank war包用压缩工具解压,然后把WEB-INF/lib内的jar包和WEB-INF下的web.xml文件分别复制到SSHShop项目下的WEB-INF/lib内和WEB-INF下。
3.在src目录下创建相应package。
4.在WebContent下创建Register.jsp文件,并分别创建注册成功和注册失败的Success.jsp和Fail.jsp。

建完后Struts2的目录

接下来整合Struts2和参考博主一样;

web.xml 代码
  
  

    SSH Project  

      
        SSH  
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
      
  
        config
        struts-default.xml,struts-plugin.xml,struts.xml
    
      
        SSH  
        /*  
      


      
        index.jsp  
      

  
Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<%@ taglib prefix="s" uri="/struts-tags"%>  
  
UserForm.java
package com.zeb.ssh.beans;  

public class UserForm {  

    private String username;  
    private String password;  
    private int gender;  

    public String getUsername() {  
        return username;  
    }  

    public void setUsername(String username) {  
        this.username = username;  
    }  

    public String getPassword() {  
        return password;  
    }  

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

    public int getGender() {  
        return gender;  
    }  

    public void setGender(int gender) {  
        this.gender = gender;  
    }  

}  

接下相关的Java,只要按照参考博主的Struts2就没有问题。

RegisterAction-validation.xml








    
    
        true
            用户名不能为空
        
        
            用户名输入不合法,必须为长度在6~16中间的数字或字母
        
    

    
    
        true
            密码不能为空
        
        
            密码输入不合法,必须为长度在6~16之间的数字或者字母
        
    

注意:如果使用validator1.0.3的话,在接下来的整合会报错说是validator 已经转到Struts2那了,先试试1.0.3吧,增加下印象

struts.xml

 

  

      
      
          
            /Register.jsp  
            /Success.jsp  
            /Fail.jsp  
          
      

 

个人觉得这个可以去掉,有兴趣的可以去试试

相关整合Struts2后的截图与我参考博主的效果一致


接下来整合Hibernate4:

将Hibernate内的lib/required下的jar包和lib/jpa下的jar包复制到SSHProject项目的lib目录下。 在上面Struts项目的基础上添加com.zeb.ssh.dao和com.zeb.ssh.daoImpl包。分别创建BaseDao接口和UserDao类。 在数据库test中创建对应的表user,sql 在上边。 创建user表的Hibernate映射文件。因为这里要创建user表对应的POJO类,所以我这里把之前com.ynwi.ssh.beans包改成com.ynwi.ssh.forms包,用来存放页面传过来的表单数据,新创建com.ynwi.ssh.beans包,用来创建POJO对象来对应数据库中的表。路径:POJO类同目录。 建立Hibernate配置文件。路径:src目录下。 编写Session工厂类。整合Spring后,数据源的创建和SessionFactory的创建都交给Spring去管理,就无需这个工厂类了,所以这里我临时创建在daoImpl包里面。 修改业务逻辑实现类。

注:整合Hibernate4的步骤与参考博主一致

整合Hibernate4结构图见:
参考博主整合第二步

接口类BaseDao.java的内容。注意:接口里的两个get/set方法是为了让实现类覆盖。这样使用BaseDao dao = new UserDao()的时候,dao实体中有这两个方法。

package com.zeb.ssh.dao;  

import org.hibernate.HibernateException;  
import org.hibernate.Session;  

public interface BaseDao {  

    public void saveObject(Object obj) throws HibernateException;  

    public Session getSession();  

    public void setSession(Session session);  
}  
实现类UserDao.java的内容
package com.zeb.ssh.daoImpl;  

import org.hibernate.HibernateException;  
import org.hibernate.Session;  

import com.zeb.ssh.dao.BaseDao;  

public class UserDao implements BaseDao {  

    private Session session;  

    @Override  
    public Session getSession() {  
        return session;  
    }  

    @Override  
    public void setSession(Session session) {  
        this.session = session;  
    }  

    @Override  
    public void saveObject(Object obj) throws HibernateException {  
        session.save(obj);  
    }  

}  
表user的POJO类User.java的内容,因为跟UserForm.java内容差不多,所以不再列出。这个比UserForm.java多一个userId属性,因为在表user里面有userId的column。在POJO类里需要跟这个column有映射。

POJO类User.java的Hibernate映射文件User.hbm.xml的内容。代码说明将根据本地数据库的设置来创建userId,如MySQL中将表user的userId设置为自动增长,则在保存记录是,userId将自动增长。对于需要在程序中指定主键的值,则将generator的class属性设置为assigned。

User.hbm.xml

  
  

  
      
          
              
          
          
          
          
      
 
Hibernate.cfg.xml
  
  

  
    
      
    com.mysql.jdbc.Driver  
    jdbc:mysql://localhost:3306/project  
    root  
    root  

      
      

      
    org.hibernate.dialect.MySQLDialect  

      
      

      
      

      
    true  

      
      
      
    
SessionFactory.java
package com.zeb.ssh.daoImpl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateSessionFactory {

    private static final String CFG_FILE_LOCATION = "/Hibernate.cfg.xml";

    private static final ThreadLocal threadLocal = new ThreadLocal();

    private static final Configuration cfg = new Configuration()
            .configure(CFG_FILE_LOCATION);

    private static ServiceRegistryBuilder builder = new ServiceRegistryBuilder()
            .applySettings(cfg.getProperties());

    private static ServiceRegistry registry;

    private static SessionFactory sessionFactory;

    public static Session currentSession() throws HibernateException {
        Session session = threadLocal.get();

        if (session == null || session.isOpen() == false) {

            if (sessionFactory == null) {
                try {
                    registry = builder.buildServiceRegistry();
                    sessionFactory = cfg.buildSessionFactory(registry);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            session = sessionFactory.openSession();
            threadLocal.set(session);

        }

        return session;
    }

    public static void closeSession() throws HibernateException {
        Session session = threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
            session.close();
        }
    }

}
UserManagerImpl.java:
package com.zeb.ssh.serviceImp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zeb.ssh.beans.User;
import com.zeb.ssh.dao.BaseDao;
import com.zeb.ssh.daoImpl.HibernateSessionFactory;
import com.zeb.ssh.daoImpl.UserDao;
import com.zeb.ssh.forms.UserForm;
import com.zeb.ssh.service.UserManager;

public class UserManagerImpl implements UserManager {

    private BaseDao dao;

    private Session session;

    public UserManagerImpl() {
        dao = new UserDao();
    }

    @Override
    public void regUser(UserForm userForm) throws HibernateException {
        session = HibernateSessionFactory.currentSession();
        dao.setSession(session);
        // 获取事务
        Transaction ts = session.beginTransaction();
        // 构造User对象
        User user = new User();
        user.setUsername(userForm.getUsername());
        user.setPassword(userForm.getPassword());
        user.setGender(userForm.getGender());
        // 保存User对象
        dao.saveObject(user);
        // 提交事务
        ts.commit();
        // 关闭Session
        HibernateSessionFactory.closeSession();
    }

}

整合后的系统截图:
请参考
运行截图、数据库插入数据截图、Hibernate-show_sql


接下来到了最为关键的一点——整合Spring4,其中有Spring与Struts2的整合、Spring4和Hibernate4的整合,相关的Jar包,其中有jdbc-jar包,但不保证个个用到了。


接下来的步骤: 1.将Spring内libs目录下包含所有的jar包(不需要复制结尾为sources和javadoc的jar包)到SSHProject项目的lib目录下。 2.编写Spring的配置文件applicationContext.xml。路径:src目录下,需要在web.xml配置context-param指定路径,或者把该文件放在WEB-INF下,跟web.xml同目录。这里由于Spring配置数据源的需要,需要把Hibernate内lib/optional/c3p0下的c3p0-0.9.1.jar复制到lib下。 3.修改BaseDao和UserDao。在引入Spring后,需要用Spring进行统一的事务管理,数据源和sessionFactory都交给Spring去生成,因此接口类和实现类BaseDao和UserDao都需要做相应的修改。Spring提供了HibernateDaoSupport类来完成对数据的操作,因此UserDao在实现BaseDao的同时还需要继承HibernateDaoSupport;类。并将先前获取session的操作修改为getSessionFactory().openSession()方法。(这个好像没有关系到Spring事务管理) 4,修改业务逻辑实现类。在没有加入Spring之前,业务逻辑实现类的Session的获得,dao的实例化,以及事务的管理都是该类执行管理的。加入Spring后,这些都交给Spring去管理。该类的dao的实例化由Spring注入。 5.修改用户注册的RegisterAction类。同样,RegisterAction类中的userManager的实例化也由Spring注入。 6.删除Hibernate的配置文件Hibernate.cfg.xml和工厂类HibernateSesseionFactory类。他们的工作已经交给Spring去做,已经不再有用。(整合Spring、Hibernate) 7.修改web.xml,加载Spring。要想启动时加载Spring的配置文件,需要在web.xml中配置对应的监听器(listenser),并制定Spring的配置文件。

8.修改Struts的配置文件struts.xml。把原来指定的名为register的action的class由原来的路径变为applicationContext.xml文件中该Action的id。

本人整合后的结果图:

这里写图片描述 这里写图片描述
applicationContext.xml
  
  

      
      
          
            com.mysql.jdbc.Driver  
          
          
            jdbc:mysql://localhost/test  
          
          
            root  
          
          
            123456  
          
          
            80  
          
          
            1  
          
          
            1  
          
          
            20  
          
      

      
      
      
      
          
              
          
          
              
                com/zeb/ssh/beans/User.hbm.xml  
              
          
        
            
                org.hibernate.dialect.MySQLDialect
                true
                false
                update
            
         
      

    
        
    

      
          
              
          
      

      
      
          
              
          
      

      
      
          
              
          
      

      

  
修改后的接口类Dao和实现类UserDao的内容。
BaseDao.java
package com.zeb.ssh.dao;

import org.hibernate.HibernateException;

public interface BaseDao {

    public void saveObject(Object obj) throws HibernateException;

}
UserDao.java
package com.zeb.ssh.daoImpl;

import org.hibernate.HibernateException;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

import com.zeb.ssh.dao.BaseDao;

public class UserDao extends HibernateDaoSupport implements BaseDao {

    @Override
    public void saveObject(Object obj) throws HibernateException {
        getSessionFactory().openSession().save(obj);
    }

}

4.修改后的业务逻辑实现类UserManagerImpl的内容。

package com.zeb.ssh.serviceImpl;

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

import com.zeb.ssh.beans.User;
import com.zeb.ssh.dao.BaseDao;
import com.zeb.ssh.forms.UserForm;
import com.zeb.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);
    }

}

5.修改后的用户注册Action类RegisterAction的内容。

package com.zeb.ssh.action;

import com.opensymphony.xwork2.ActionSupport;
import com.zeb.ssh.forms.UserForm;
import com.zeb.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;
        }
    }

}
修改后的web.xml的内容
  
  

    SSH Project  

      
        SSH  
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
      
  
        config
        struts-default.xml,struts-plugin.xml,struts.xml
    
      
        SSH  
        /*  
      

    
        org.springframework.web.context.ContextLoaderListener
    

    
        contextConfigLocation
        classpath:applicationContext.xml
     

      
        index.jsp  
      

  
修改后的Struts配置文件struts.xml的内容




    

      
          
            /Register.jsp  
            /Success.jsp  
            /Fail.jsp  
          
      



运行结果:
这里写图片描述
这里写图片描述
这里写图片描述
数据库截图:
这里写图片描述

总结

一开始遇到过整合时Jar缺少,在遇到错误时,直接搜问题,补充Jar包。 Hibernate3与Hibernate4之间的区别,Hibernate3是getHibernateTemplate()来获取Session,Hibernate4用getSessionFactory().openSession() 检验,RegisterAction-validation.xml validator-1.0.2-dtd 的改变 定义Bean-sessionFactory,Bean-transactionManager所调用的class

struts.xml试试这句话的效果,有可能导致Spring无法管理Struts(I Guess).

Spring整合Hibernate时:有可能找不到cfg文件

contextConfigLocation
classpath:applicationContext.xml

Spring整合Struts时,有可能没找到Struts-default.xml:

config
struts-default.xml,struts-plugin.xml,struts.xml

最后:
框架玩的就是Jar包、配置,对初学者可能会有挑战性。希望本人的项目SSHShop对有需要的人有所帮助。


May-The-Good-Luck-Be-With-You

相关TAG标签
上一篇:JDBC实现客户关系管理系统模块
下一篇:千万不要在VMWare的NAT模式下使用nmap
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站