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

来源:互联网 发布:网络作家协会好加入吗 编辑:程序博客网 时间:2024/06/05 22:33

    • SSH框架搭建
      • 项目环境
      • 创建Structs工程
        • 操作步骤
        • 操作完成后项目结构如图
        • 编写代码
        • 运行效果
      • 在Struts基础上整合Hibernate整合Hibernate
        • 操作步骤
        • 修改完成后如下所示
        • 编写代码
        • 运行效果
      • 在Struts Hibernate项目中整合Spring整合Spring
        • 操作步骤
        • 操作完成后项目结构图如下所示

第一次用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 操作完成后项目结构图如下所示

这里写图片描述

3 1
原创粉丝点击