这是一个结合了Struts、Spring、Hibernate的登录完整

来源:互联网 发布:金冠网络创业平台 编辑:程序博客网 时间:2024/04/28 01:12

这是一个结合了Struts、Spring、Hibernate的登录完整项目,所用数据库为MySQL。其中Spring负责全局管理,Hibernate负责数据库查询操作,Struts负责逻辑处理。步骤如下:
第一步:创建一个名为SSHLoginTest的 Web工程。
第二步:在项目的构造路径中添加Spring、Struts、Hibernate使用到的包。在此不做介绍,有关详细步骤你可参考我之前在的Struts、Spring、Hibernate三个分类文章下的发贴,其中我应该有详细讲述的。
第三步:工程文件详细构造步骤如下,请仔细实施。
建立工程所需要用到的数据库:
create database if not exits 'ssh';
use 'ssh'
drop table if exits 'ssh'.'user';
CREATE TABLE 'user'
(
'ID' int(11) NOT NULL auto_increment,
'USERNAME' varchar(50) NOT NULL,
'PASSWORD' varchar(50) NOT NULL,
PRIMARY KEY('id')
)

默认主页的创建,index.jsp:
<%@ page language="java" pageEncoding="gbk"%>

<html>
<head>
    <title>My JSP 'index.jsp' starting page</title>
</head>

<body>
<% response.sendRedirect("login.jsp"); %>
</body>
</html>

登录页面的创建,login.jsp:
<%@ page language="java" pageEncoding="gbk"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:html lang="true">
<head>
    <title> Jsp for loginForm form </title>
</head>

<body>

<html:form action="/login">
   用户名:<html:text property="username" /><html:errors property="username" /> <br/>
   密 码:<html:password property="password" /> <html:errors property="password" /> <br/>
   <html:submit value="提交"/><html:cancel value="取消" />
</html:form>

</body>
</html:html>

登录成功提示页面的创建,success.jsp:
<%@ page language="java" pageEncoding="gbk"%>

<html>
<head>
    <title>My JSP 'index.jsp' starting page</title>
</head>

<body>
<% response.getWriter().print("<H1> Welcome !"); %>
</body>
</html>

在WEB-INF目录下添加 validator-rules.xml文件(系统可能会自动生成,没有时注意添加):

在WEB-INF目录下添加 validator.xml文件(系统可能会自动生成,没有时注意添加),修改如下,这是一个验证规则:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation >
<formset>
<form name="loginForm">
    <field property="username" depends="required">
      <arg0 key="prompt.username" />
    </field>
    <field property="password" depends="required">
      <arg0 key="prompt.password" />
    </field>
</form>
</formset>
</form-validation >

打开Struts配置文件 struts-config.xml,修改成如下(注意:action的validate属性要设为true和 action的type属性的设置):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />

<form-beans>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
   <form-property name="password" type="java.lang.String" />
   <form-property name="username" type="java.lang.String" />
</form-bean>
</form-beans>

<global-exceptions />

<global-forwards>
   <forward name="indexGo" path="/success.jsp"></forward>
</global-forwards>

<action-mappings >
    <action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy"
      validate="true" />
</action-mappings>


<message-resources parameter="com.ascent.struts.ApplicationResources" />

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

<!--

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
   <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>

--></struts-config>

建立一个包名为 com.ascent.struts的包,在这个包下添加消息资源文件,文件的详细配置如下,ApplicationResources.properties:
prompt.username=User Name
prompt.password=User Password
errors.required={0} is required.

在 com.ascent.struts包中添加另一个中文支持消息资源文件,文件的配置如下,ApplicationResources_zh_CN.properties:
prompt.username=/u7528/u6237/u540d/u79f0
prompt.password=/u767b/u5f55/u5bc6/u7801
errors.required={0} /u5fc5/u987b/u586b/u5199/uff01

在 com.ascent.struts包中添加 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">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.ascent.struts.User" table="user">
        <id name="id" type="integer">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="username" type="string">
            <column name="USERNAME" length="50" not-null="true" />
        </property>
        <property name="password" type="string">
            <column name="PASSWORD" length="50" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

在 com.ascent.struts包中添加持久化类,AbstractUser.java:
package com.ascent.struts;

public abstract class AbstractUser implements java.io.Serializable {

private int hashValue=0;
private Integer id;
private String username;
private String password;

public AbstractUser() {
}

public AbstractUser(String username, String password) {
   this.username = username;
   this.password = password;
}

public AbstractUser(Integer id)
{
   this.setId(id);
}

public void setId(Integer id) {
   this.id = id;
}

public Integer getId(){
   return this.id;
}

public String getUsername() {
   return this.username;
}

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

public String getPassword() {
   return this.password;
}

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

public boolean equals(Object rhs)
{
   if(rhs == null)
    return false;
   if(!(rhs instanceof User))
    return false;
  
   User that = (User) rhs;
   if(this.getId() == null || that.getId() == null)
    return false;
   return (this.getId().equals(that.getId()));
}

public int hashCode()
{
   if(this.hashValue == 0)
   {
    int result = 17;
    int idValue = this.getId() == null ? 0 : this.getId().hashCode();
    result = result * 37 + idValue;
    this.hashValue = result;
   }
  
   return this.hashValue;  
}
}

在 com.ascent.struts包中添加由抽象类AbstractUser派生出的 User.java类,代码如下:
package com.ascent.struts;

@SuppressWarnings("serial")
public class User extends AbstractUser implements java.io.Serializable {

public User() {
}

public User(Integer id) {
   super(id);
}
}

接下来进行关键的一步:Spring的配置。在WEB-INF下添加 applicationContext.xml文件,文件的所有代码如下(你要特别注意它的构建步骤,当你的环境不同时你要做出相应的更改):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframword.org/dtd/spring-beans.dtd">

<beans>  
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

   <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
   </property>
  
   <property name="url">
    <value>jdbc:mysql://localhost/ssh</value>
   </property>
  
   <property name="username">
    <value>root</value>
   </property>
  
   <property name="password">
    <value>root</value>
   </property>
  
</bean>


<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref local="dataSource" />
   </property>
   <property name="mappingResource">
    <list>
     <value>com/ascent/struts/User.hbm.xml</value>
    </list>
   </property>
   <property name="hibernateProperties">
    <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
     <prop key="hibernate.show_sql">true</prop>
    </props>
   </property>
</bean>


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


<bean id="userDAO" class="com.ascent.Hibernate.UserDAO">
   <property name="sessionFactory">
    <ref local="sessionFactory" />
   </property>
</bean>


<bean name="/login" class="com.ascent.struts.action.LoginAction" singleton="false">
   <property name="userDAO">
    <ref bean="userDAO" />
   </property>
</bean>

</beans>

建立一个包名为 com.ascent.Hibernate的包,在这个包下创建 DAO文件,UserDAO.java文件的代码如下(这是一个很重要的类,是整个项目的操作核心):
package com.ascent.Hibernate;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.criterion.Example;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.ascent.struts.User;

public class UserDAO extends HibernateDaoSupport{
private static final Log log = LogFactory.getLog(UserDAO.class);
private static String hql = "from User u where u.username=? and password=?";

protected void initDao()
{}

public boolean isValidUser(String username, String password)
{
   System.out.println("In UserDAO IsValid!");
   String[] userlist = new String[2];
   userlist[0] = username;
   userlist[1] = password;
  
   List userList = this.getHibernateTemplate().find(hql, userlist);
   if(userList.size() == 0)
   {
    return true;
   }
   return false;
}

public void sava(User transientInstance)
{
   log.debug("saving User instance");
   try
   {
    getHibernateTemplate().saveOrUpdate(transientInstance);
    log.debug("save successful");
   }catch(RuntimeException re)
   {
    log.error("save failed",re);
    throw re;
   }
}

public void delete(User persistentInstance)
{
   log.debug("deleting User instance");
   try
   {
    getHibernateTemplate().delete(persistentInstance);
    log.debug("delete successful");
   }catch(RuntimeException re)
   {
    log.error("delete failed", re);
    throw re;
   }
}

public User findById(java.lang.Integer id)
{
   log.debug("getting User instance with id:" + id);
   try
   {
    User instance = (User) getHibernateTemplate().get("User",id);
    return instance;
   }catch(RuntimeException re)
   {
    log.error("get failed", re);
    throw re;
   }
}

public List findByExample(User instance)
{
   log.debug("finding User instance by example");
   try
   {
    List results = getSession().createCriteria("User").add(Example.create(instance)).list();
    log.debug("find by emplae successful, result size:" + results.size());
    return results;
   }catch(RuntimeException re)
   {
    log.error("find by example failed", re);
    throw re;
   }
}

public User merge(User detachedInstance)
{
   log.debug("merging User instance");
   try
   {
    User result = (User) getHibernateTemplate().merge(detachedInstance);
    log.debug("merge successful");
    return result;
   }catch(RuntimeException re)
   {
    log.error("merge failed", re);
    throw re;
   }
}

public void attachDirty(User instance)
{
   log.debug("attaching dirty User instance");
   try
   {
    getHibernateTemplate().saveOrUpdate(instance);
    log.debug("attach successful");
   }catch(RuntimeException re)
   {
    log.error("attach failed", re);
    throw re;
   }  
}

public void attachClean(User instance)
{
   log.debug("attaching clean User instance");
   try
   {
    getHibernateTemplate().lock(instance, LockMode.NONE);
    log.debug("attach successful");
   
   }catch(RuntimeException re)
   {
    log.error("attach failed" ,re);
    throw re;
   }
}

public static UserDAO getFromApplicationContext(ApplicationContext ctx)
{
   return (UserDAO) ctx.getBean("UserDAO");
}
}

最后一步,创建 action(动作的开始).建立一个包名为 com.ascent.struts.action的包,在这个包下创建 LoginAction.java文件,代码如下:
package com.ascent.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;

import com.ascent.Hibernate.UserDAO;

public class LoginAction {
private UserDAO userDAO;

public UserDAO getUerDAO()
{
   return userDAO;
}

public void setUseDAO(UserDAO userDAO)
{
   this.userDAO = userDAO;
}

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
{
   DynaValidatorForm loginForm = (DynaValidatorForm) form;
   String username = loginForm.getString("username");
   String password = loginForm.getString("password");
   if(userDAO.isValidUser(username, password))
   {
    return mapping.findForward("indexGo");
   }
   else
   {
    return mapping.getInputForward();
   }
}
}

    整个项目所牵涉到的文件前前后后在15个左右,在这里每一个文件都是重要和必不可少的,少了一个,或一个有错误就可能导致整个项目不能正常运行。对初学者来说构造这样的实例可能会有一点难度,但当你熟悉整个流程和链转机制时,其实你会发现,它并不是你所想像中的那么难。前面我有学后有感一类文章当中也说过,程序的严谨性是很强的,只要你对项目的整个流程有了一定的了解,你会然后发现其它不但不难,而且它还是很有意思的。项目测试实施还在验证中,在这里你还必须要特别注意的是在添加相应的 jar(包)时,要特别小心,有时因为版本的不同,你的项目也可能引发其它一系列异常