[Spring实战系列] - No.13 Spring4 + Struts2 + Hibernate4 实现登陆例子

这篇文章主要来源于 Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程,主要是实现了文章中的这个小例子,然后分享最后SSH搭建的过程,并且解决了搭建过程中各种缺少jar包以及jar包冲突的问题。最后,对作者表示感谢!

一、使用Eclipse新建一个Dynamic Web Project


创建过程省略,注意的是在最后一步要勾选web.xml生成选项:


项目创建完成以后,创建项目结构,最后如图所示:


创建以上文件,完成目录结构。然后需要在lib中引入Struts2,Spring4,Hibernate4,以及Mysql-connector-Java等51个jar包。将jar包拷贝到lib文件夹,然后刷新文件夹,右键Build path 添加jar包。jar包下载传送门

二、编写相关Bean:

1. com.yanming.ssh.action:

主要有两个文件:RegisterAction.java 和RegisterAction-validation.xml。 RegisterAction定义Struts中的action,RegisterAction-validation.xml定义验证方式。这种方式就是使用validate框架来实现输入校验,是基于XML的验证。结果如下:


RegisterAction.java

package com.yanming.ssh.action;

import com.opensymphony.xwork2.ActionSupport;
import com.yanming.ssh.forms.UserForm;
import com.yanming.ssh.service.UserManager;
import com.yanming.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 void setUserManager(UserManager userManager) {  
        this.userManager = userManager;  
    }  
  
    public String execute() {  
        try {  
            userManager.regUser(user);  
            return SUCCESS;  
  
        } catch (Exception e) {  
            e.printStackTrace();  
            return ERROR;  
        }  
    }  
  
}  

代码逻辑是,在获取了User信息以后,调用UserManager中的regUser函数,保存用户信息,返回状态。

RegisterAction-validation.xml:

<!DOCTYPE validators PUBLIC
 "-//Apache Struts//XWork Validator 1.0.2//EN" 
 "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
    <!-- 添加对用户名的校验 -->
    <field name="user.username">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="regex"><![CDATA[(\w{6,16})]]></param>
            <message>用户名输入不合法,必须为长度在6~16中间的数字或字母</message>
        </field-validator>
    </field>

    <!-- 添加对密码的校验 -->
    <field name="user.password">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密码不能为空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="regex"><![CDATA[(\w{6,16})]]></param>
            <message>密码输入不合法,必须为长度在6~16之间的数字或者字母</message>
        </field-validator>
    </field>
</validators>
2.com.yanming.ssh.beans:

主要有两个文件User.java 和User.hbm.xml。User.java定义了与数据库中相对应的类。User.hbm.xml则是Hibernate 与User之间的映射。

User.java:

package com.yanming.ssh.beans;


public class User {
		private int userId;
	 	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;  
	    }

		public int getUserId() {
			return userId;
		}

		public void setUserId(int userId) {
			this.userId = userId;
		}  
	  
}
User.hbm.xml:

<?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.yanming.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>  
3.com.yanming.ssh.dao:

主要是BaseDao接口,定义saveObj()函数,用于保存User实体

4.com.yanming.ssh.daoImpl:

在UserDao.java 实现BaseDao接口。UserDao.java内容如下:

package com.yanming.ssh.daoImpl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

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

}  
解释一下这里Session的用法。Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:
自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联
游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。

在UserDao中,我们创建一个SessionFactory(设计模式中的工厂模式),从SessionFactory获取一个Session,然后调用行save()函数,保存实体。

5.com.yanming.ssh.forms:

这个主要是UserForm.java文件。这个java文件和User几乎一样,只是缺少了userId。在我们实际的注册的时候,我们获取的用户名密码,组成UserForm,然后调用UserManagerImpl中的BeanUtils.copyProperties,将UserForm转换成User(添加了自增的id这个字段),然后才能持久化用户信息。这里不再列出。

6.com.yanming.ssh.service:

在UserManager.java中定义regUser方法,用于保存用户。

7.com.yanming.ssh.serviceImpl

在UserManagerImpl中实现保存用户的方法:将前面得到的UserForm转换为User,然后调用UserDao,进行持久化。

UserManagerImpl.java:

package com.yanming.ssh.serviceImpl;

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

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

}
到此为止,登录流程中所有使用到的Bean就编写完毕了,接下来就是编写配置文件,整合Struts2、Spring和Hibernate

三、Struts2、Spring和Hibernate整合:

1.web.xml:定义Struts拦截器,加载Spring中的应用上下文(配置Bean)applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  
  <display-name>MySSH</display-name>
  <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>
  
    <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>  
    
    
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml</param-value>
    </context-param>
  
</web-app>
2.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:3306/shixun</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/yanming/ssh/beans/User.hbm.xml</value>  
            </list>  
        </property>  
        <property name="hibernateProperties">
            <props>
                <prop key="hiberante.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property> 
    </bean>  

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="baseDao" class="com.yanming.ssh.daoImpl.UserDao">  
        <property name="sessionFactory">  
            <ref bean="sessionFactory" />  
        </property>  
    </bean>  

    <!--用户注册业务逻辑类 -->  
    <bean id="userManager" class="com.yanming.ssh.serviceImpl.UserManagerImpl">  
        <property name="dao">  
            <ref bean="baseDao" />  
        </property>  
    </bean>  

    <!-- 用户注册的Action -->  
    <bean id="registerAction" class="com.yanming.ssh.action.RegisterAction">  
        <property name="userManager">  
            <ref bean="userManager" />  
        </property>  
    </bean>  

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

</beans>  
配置数据源、数据库连接池、配置Hibernate中的SessionFactory以及映射关系以及各种Bean注入

3.配置Struts拦截器:

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" />  
<constant name="struts.devMode" value="true" />
 <constant name="struts.objectFactory" value="spring" />
    <package name="yanming" namespace ="/" extends="struts-default" >  
       <action name="register" class="registerAction">  
   			<result name="input">/Register.jsp</result>  
            <result name="success">/Success.jsp</result>  
            <result name="error">/Fail.jsp</result>
        </action>  
    </package>  
    
    <package name="default"  namespace="/" extends="struts-default">
      <action name="welcome" >
            <result>/Register.jsp</result>
      </action>
   </package>
  
</struts>  
4. 四个jsp文件:

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>
Fail
</body>
</html>
index.jsp (做了重定向到Register.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv='refresh'   content='2;url=/MySSH/welcome.action'>
<title>Insert title here</title>
</head>
<body>
<h1>你好<h1>
<h3>即将跳转到注册界面······<h3>
</body>
</html>
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=UTF-8"  
    pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags"%> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
</head>
<body>
注册成功!<s:property value="user.username"/>
</body>
</html>

四、运行结果:

主页:


注册:


注册成功:



参考文章:

1.SSH框架整合

2.Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程

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


本文Github源码下载

(Jar包可能出现问题,请重新bulid path)


P.S.文章不妥之处还望指正












  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值