关于ssh框架的搭建问题,记录详细流程

新手入门,记录下在使用Struts时遇到的问题,以防忘记。以下内容以登录功能为例。

代码内容为转载,文章内容主要是为记录本人遇到的问题。

1、建立Struts工程

1.首先要下载Struts2.5.13需要用的包,网上许多地方可以下载,就不赘言。下载完后,将其中的如下所示的包直接复制到自己的工程中的WEB-INF/lib中
  关于ssh框架的搭建问题,记录详细流程_第1张图片
2.在src新建RegisterAction类,内容如下
package com.ssh.action;

import com.opensymphony.xwork2.ActionSupport;
import com.ssh.beans.UserForm;
import com.ssh.service.UserManager;
import com.ssh.serviceImpl.UserManagerImpl;

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 UserManager getUserManager() {
        return userManager;
    }


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


    public String execute() {
        try {
            this.setUserManager(new UserManagerImpl());
            userManager.regUser(user);
            System.out.println("success");
            return SUCCESS;


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


}
此处要注意自己将该类放置的包路径,因为接下来的struts.xml配置文件中需要用到,如果错了,会出现如

Unable to load configuration

这样的错误,本人在此处纠结了很久

3.在src目录下创建struts.xml文件,文件内容如下

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">



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

   




4.用户表单类UserForm.java的内容
package com.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;
    }

}

5.业务逻辑接口UserManager.java的内容
package com.ssh.service;

import com.ssh.beans.UserForm;

public interface UserManager {

    public void regUser(UserForm user);

}

6.业务逻辑实现类UserManagerImpl.java的内容
package com.ssh.serviceImpl;

import com.ssh.beans.UserForm;
import com.ssh.service.UserManager;

public class UserManagerImpl implements UserManager {

    @Override
    public void regUser(UserForm user) {

    }

}
7.接着定义web.xml文件,配置过滤器
 
 
  SSHTest  
 

struts-prepare
org.apache.struts2.dispatcher.filter.StrutsPrepareFilter


struts-execute
org.apache.struts2.dispatcher.filter.StrutsExecuteFilter


struts-prepare
/*


struts-execute
/*

  
   
    index.html  
    index.htm  
    index.jsp  
    default.html  
    default.htm  
    default.jsp  
 
 
 

8.最后是三个jsp页面文件
Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>




User Register Page



   
       
       
                    name="user.gender" label="性别" value="1">
       
   




Fail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


failure!




Success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


success!




附完成以上操作后的程序目录图如下
关于ssh框架的搭建问题,记录详细流程_第2张图片
注意细节,按照上述流程将工程内容配置好,Struts框架就可以跑起来。

2、在Struts基础上整合Hibernate
1.操作步骤:
1.整合hibernate,我使用的是hibernate5.2.5,此处要注意版本问题,和文章不同版本的hibernate可能会出现运行错误。hibernate的jar包如下:
关于ssh框架的搭建问题,记录详细流程_第3张图片

2.接着在上面项目的基础上添加com.ssh.dao和com.ssh.daoImpl包。分别建立BaseDao接口和UserDao类
3.在数据库中创建对应的表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)
);

  • 创建user表的Hibernate映射文件。因为这里要创建user表对应的POJO类,所以我这里把之前com.ssh.beans包改成com.ssh.forms包,用来存放页面传过来的表单数据,新创建com.ssh.beans包,用来创建POJO对象来对应数据库中的表。路径:POJO类同目录
  • 建立Hibernate配置文件。路径:src目录下
  • 编写Session工厂类整合Spring后,数据源的创建和SessionFactory的创建都交给Spring去管理,就无需这个工厂类了,临时创建在daoImpl包里面。
  • 修改业务逻辑实现类。  
2.修改后项目视图:
关于ssh框架的搭建问题,记录详细流程_第4张图片

3.编写代码
3.1BaseDao.java的内容如下:
package com.ssh.dao;

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

public interface BaseDao {
    public Session getSession();
    public void setSession(Session session);
    public void saveObject(Object obj)throws HibernateException;
}

3.2实体类User.java的内容
package com.ssh.beans;

public class User {
    private String username;
    private String password;
    private int gender;

    private int userId;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    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;
    }

}

3.3POJO类UserDao.java的内容
package com.ssh.daoimpl;  

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

import com.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);  
    }  

}  

3.4POJO类User.java的Hibernate映射文件User.hbm.xml的内容

代码说明将根据本地数据库的设置来创建userId,如MySQL中将表useruserId设置为自动增长,则在保存记录是,userId将自动增长。对于需要在程序中指定主键的值,则将generator的class属性设置为assigned。   


                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >


   
       
           
       

                    not-null="true" length="16">
                    not-null="true" length="16" />
       
   



3.5Hibernate的配置文件hibernate.cfg.xml的内容,放在src目录下

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


 
   
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/test
    root
    密码?
    org.hibernate.dialect.MySQLDialect
    true
     
 



3.6工厂类SessionFactory的内容。
不同的hibernate版本编写有些不同,这里我用hibernate5.2.5配置的时候按照hibernate配置的出了经典的问题 unknown entity 请看这篇文章-传送门,下面附上正确的代码

package com.ssh.daoimpl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateSessionFactory {

    private static final ThreadLocal threadLocal = new ThreadLocal<>();
    //加载默认的src下的hibernate.cfg.xml
    private static final Configuration cfg = new Configuration().configure();

    private static  SessionFactory sessionFaction;
    public static Session currentSession()throws HibernateException{

        // 创建Session
        Session session = threadLocal.get();
        if (session == null||session.isOpen()==false) {

            if (sessionFaction==null) {
                try {
                        sessionFaction = cfg.buildSessionFactory();
                    //System.out.println("HibernateSessionFactory---sessionfactory:"+sessionFaction);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
            }
        session=sessionFaction.openSession();
        //System.out.println("HibernateSessionFactory--session:"+session);
        threadLocal.set(session);
        }
        return session;
    }
    public static void closeSession()throws HibernateException{
        Session session= threadLocal.get();
        threadLocal.set(null);
        if (session!=null) {
            session.close();
        }
    }
    //public static void main(String []args){
    //  Session session = currentSession();
    //  System.out.println("session:"+session);
    //}
}   

3.7修改后的业务逻辑实现类UserManagerImpl的内容。
package com.ssh.serviceImpl;

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

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

public class UserManagerImpl implements UserManager {
    private UserDao dao;
    private Session session;

    public UserManagerImpl() {
        // TODO Auto-generated constructor stub
        dao=new UserDao();
    }

    @Override
    public void regUser(UserForm userForm) {
        session = HibernateSessionFactory.currentSession();
        System.out.println("UserManegerImpl---session:" + session);
        dao.setSession(session);
        // 获取事务
        Transaction transaction = session.beginTransaction();
        // 构造uer对象
        User user = new User();
        user.setUsername(userForm.getUsername());
        user.setPassword(userForm.getPassword());
        user.setGender(userForm.getGender());
        // 保存对象
        dao.saveObject(user);
        // 提交事务
        transaction.commit();
        HibernateSessionFactory.closeSession();
    }

    public static void main(String[] args) {
        User userForm = new User();
        userForm.setGender(1);
        userForm.setPassword("12121212");
        userForm.setUsername("zjz");
        HibernateSessionFactory.currentSession().save(userForm);
        // new UserManagerImpl().regUser(userForm);
    }
}

按上述流程走完,运行Register.jsp页面进行注册,跳转到成功页面,查看数据库中数据,数据增加了。此外我不小心把其中一个包daoimpl命名城小写了,大家最好改成大写daoImpl,还有有一些代码好像又是daoImpl,代码不一致导致的错误大家就看着修改了。
还有一个问题,在按上述流程走完,且代码没有提示错误,运行时会出错,具体错忘了是什么,是关于UserDao的,即你的代码UserDao改完了,可是运行时UserDao却是没修改前的,那是因为你的JVM里运行的UserDao没改变。运行代码时记得按project的clean一下,清除一下JVM即可。

3.在Struts + Hibernate项目中整合Spring整合Spring
  • 接下来【参考博主】整合Spring的步骤:
  • 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。

本人觉得在这里最主要的是jar包问题,导入正确的包才能使程序正确运行,本人大多数遇到的问题其实都是jar包没导入的问题,在反复测试后,得出需要导入的jar包。除spring目录下的jar包外,还需增加Struts的struts2-spring-plugin-2.5.13.jar和hibernate的c3p0-0.9.2.1.jar加mchange-commons-java-0.2.3.4.jar

总的jar包如下:
关于ssh框架的搭建问题,记录详细流程_第5张图片
关于ssh框架的搭建问题,记录详细流程_第6张图片

  1. applicationContext.xml

  2.  
  3.     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">  

         
                destroy-method="close">  
             
                com.mysql.jdbc.Driver  
           
     
             
                jdbc:mysql://localhost/test  
           
     
             
                root  
           
     
             
                密码?  
           
     
             
                80  
           
     
             
                1  
           
     
             
                1  
           
     
             
                20  
           
     
       
     

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

           
     
       
     

       
           
       


         
             
                 
           
     
       
     

         
         
             
                 
           
     
       
     

         
         
             
                 
           
     
       
     

         

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

import org.hibernate.HibernateException;

public interface BaseDao {

    public void saveObject(Object obj) throws HibernateException;

}

  1. UserDao.java
package com.ssh.daoImpl;  

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

import com.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.ssh.serviceImpl;

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

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

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

struts-prepare
org.apache.struts2.dispatcher.filter.StrutsPrepareFilter


struts-execute
org.apache.struts2.dispatcher.filter.StrutsExecuteFilter


struts-prepare
/*


struts-execute
/*

  
 
        org.springframework.web.context.ContextLoaderListener
   


   
        contextConfigLocation
        classpath:applicationContext.xml
   
 

     
        index.jsp  
   
 
 


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

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">


   

     
         
            /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对有需要的人有所帮助。

附整个项目目录结构图如下:
关于ssh框架的搭建问题,记录详细流程_第7张图片
关于ssh框架的搭建问题,记录详细流程_第8张图片

此外声明,本文章内容为在转载基础上进行的修改。

你可能感兴趣的:(关于ssh框架的搭建问题,记录详细流程)