這是一個結合了Struts、Spring、Hibernate的登錄完整

這是一個結合了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(包)時,要特別小心,有時因爲版本的不同,你的項目也可能引發其它一系列異常

發佈了106 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章