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