这是一个结合了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(包)时,要特别小心,有时因为版本的不同,你的项目也可能引发其它一系列异常