最新的SSH框架(Spring4.3.3 +Struts2.5.2+Hibernate5.2.3)搭建

第一次用Markdown编写,排版还是比较舒服的

SSH框架搭建

1 项目环境


  1. Win7 x64环境,eclipse mars2,jdk1.8,tomcat8.0
    Mysql 5.0.45
  2. Struts2.5.2
    http://struts.apache.org/download.cgi
    新版本刚出不久,Structs2.5.中没strut-blank.war,也就没有struts.xml,没办法,只structs2.3.8.1中找的
    struts2.3.8.1下载地址:http://mirrors.cnnic.cn/apache/struts/2.3.28.1/struts-2.3.28.1-apps.zip
  3. Spring Framework 4.3.3
    http://repo.springsource.org/libs-release-local/org/springframework/spring/
  4. Hibernate 5.2.3
    [http://hibernate.org/orm/downloads/Hibernate 5.2.3](
    http://hibernate.org/orm/downloads/)
  5. mysql-connector-java-5.1.40(数据库驱动)
    我这里用的是mysql mysq-jdbc的驱动下载地址http://dev.mysql.com/downloads/connector/j/

2 创建Structs工程


1 操作步骤
  1. 在Eclipse中创建一个Dynamic Web Project,本文项目名称为SSHProject
  2. 把Struts内apps文件夹下的struts2-blank war包用压缩工具解压,然后把WEB-INF/lib内的jar包和WEB-INF下的web.xml文件分别复制到SSHProject项目下的WEB-INF/lib内和WEB-INF下。
  3. 在src目录下创建相应package。
  4. WebContent下创建Register.jsp文件,并分别创建注册成功和注册失败的Success.jspFail.jsp
2 操作完成后项目结构如图

这里写图片描述

3 编写代码
  • web.xml 的内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SSHProgect</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>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  • struts.xml的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <include file="struts-default.xml" />
       <package name="default" namespace="/" extends="struts-default">
        <action name="register" class="com.ssh.action.RegisterAction">
            <result name="input">/Register.jsp</result>
            <result name="success">/Success.jsp</result>
            <result name="error">/Fail.jsp</result>
        </action>
    </package>

</struts>
  • Register.jsp的内容。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Register Page</title>
</head>
<body>

    <s:form action="register">
        <s:textfield name="user.username" label="用户名"></s:textfield>
        <s:password name="user.password" label="密码"></s:password>
        <s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value"
            name="user.gender" label="性别" value="1"></s:select>
        <s:submit value="注册"></s:submit>
    </s:form>

</body>
</html>
  • Success.jsp的内容
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>success!</h1>
</body>
</html>
  • Fail.jsp的内容
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>failure!</h1>
</body>
</html>
  • 用户表单类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;
    }

}
  • 注册Action类RegisterAction.java的内容。
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;
        }
    }

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

import com.ssh.beans.UserForm;

public interface UserManager {

    public void regUser(UserForm user);

}
  • 业务逻辑实现类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) {

    }

}
4 运行效果

  • 浏览器地址中输入http://localhost:8080/SSHProgect/Register.jsp

这里写图片描述
- 注册成功后
-
这里写图片描述

3 在Struts基础上整合Hibernate整合Hibernate


1 操作步骤
  1. Hibernate内的lib/required下的jar包和lib/jpa下的jar包复制到SSHProject项目的lib目录下。
  2. 在上面Struts项目的基础上添加com.ssh.daocom.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 修改完成后如下所示

这里写图片描述

3 编写代码
  • BaseDao.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;
}
  • 实体类User.java的内容。
package com.ssh.beans;

public class User {
    private String username;
    private String password;
    private String 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 String getGender() {
        return gender;
    }

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

}
  • POJO类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() {
        // TODO Auto-generated method stub
        return session;
    }

    @Override
    public void setSession(Session session) {
        // TODO Auto-generated method stub
        this.session=session;
    }

    @Override
    public void saveObject(Object obj) throws HibernateException {
        // TODO Auto-generated method stub
        session.save(obj);
    }

}


  • POJO类User.javaHibernate映射文件User.hbm.xml的内容

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

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.ssh.beans">
    <class name="User" table="user">
        <id name="userId" column="userId">
            <generator class="native"></generator>
        </id>
        <property name="username" column="userName" type="java.lang.String"
            not-null="true" length="16"></property>
        <property name="password" column="password" type="java.lang.String"
            not-null="true" length="16" />
        <property name="gender" column="gender" type="java.lang.Integer" length="1" />
    </class>
</hibernate-mapping>
  • Hibernate的配置文件hibernate.cfg.xml的内容
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">root</property>
    <property name="connection.password"></property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
    <mapping class="com.ssh.beans.User"/>
  </session-factory>
</hibernate-configuration>


  • 工厂类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<Session> 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);
    //}
}   
  • 修改后的业务逻辑实现类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 BaseDao 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("male");
        userForm.setPassword("12121212");
        userForm.setUsername("zjz");
        HibernateSessionFactory.currentSession().save(userForm);
        // new UserManagerImpl().regUser(userForm);
    }
}
4 运行效果

这里写图片描述

查看数据

这里写图片描述

4 在Struts + Hibernate项目中整合Spring整合Spring

1 操作步骤
  1. 将Spring内libs目录下包含所有的jar包(不需要复制结尾为sourcesjavadoc的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. 修改BaseDaoUserDao

    在引入Spring后,需要用Spring进行统一的事务管理,数据源和sessionFactory都交给Spring去生成,因此接口类和实现类BaseDao和UserDao都需要做相应的修改。Spring提供了HibernateDaoSupport类来完成对数据的操作,因此UserDao在实现BaseDao的同时还需要继承HibernateDaoSupport类。并将先前session的操作修改成HibernateTemplate(可通过getHibernateTemplate()方法来获得)的操作。

  4. 修改业务逻辑实现类。在没有加入Spring之前,业务逻辑实现类的Session的获得,dao的实例化,以及事务的管理都是该类执行管理的。加入Spring后,这些都交给Spring去管理。该类的dao的实例化由Spring注入。

  5. 修改用户注册的RegisterAction类。同样,RegisterAction类中的userManager的实例化也由Spring注入。
  6. 删除Hibernate的配置文件Hibernate.cfg.xml和工厂类HibernateSesseionFactory类。他们的工作已经交给Spring去做,已经不再有用。
  7. 修改web.xml,加载Spring。要想启动时加载Spring的配置文件,需要在web.xml中配置对应的监听器listenser,并制定Spring的配置文件。
  8. 修改Struts的配置文件struts.xml。把原来指定的名为registeraction的class由原来的路径变为applicationContext.xml文件中该Action的id
2 操作完成后项目结构图如下所示

这里写图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值