继续在前一节的基础上将登录的数据保存到数据库中,数据持久化用Hibernate3,数据库用mysql5。
先声明如下:上节中,action放到了包com.dianzi.login.action中,如果有多个action包,并且还有其他诸如实体bean的包时,action层不能在视图中连续排列,不便于查看,现将com.dianzi.login.action包,改名为com.dianzi.action.login。此项修改还将影响到struts-login.xml文件中的两次引用,请自行修改,不详细累牍。由于修改博客时代码格式全部消失,故不再修改上节内容。
打开第一节的工程dianziStruts2Base。首先第一步,还是导入必备的jar包。
Hibernate下载:我下的版本是Hibernate3.3.1 ,解压后,一共有6个必备包:
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
mysql驱动包: 我下载的版本是mysql3.1.11 ,解压后找到:
mysql-connector-java-3.1.11-bin.jar
另外还有三个包是必备的,可以到findjar网站 搜索并下载,这个网站真的是很有用的一个工具网站 。
log4j-1.2.13.jar
slf4j-api-1.5.6.jar
slf4j-log4j12-1.5.6.jar
其次是安装mysql5,我安装的是5.0.18,有关mysql的安装请查看《mysql5全新安装手册》
环境都准备好了,下面我们开始正式的组装我们的代码了。
1、在 src 目录下建 "hibernate.cfg.xml" 文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- session-factory配置 --> <session-factory> <!-- 数据库url --> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/struts2 </property> <!-- 数据库jdbc驱动 --> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库用户密码 --> <property name="hibernate.connection.password">root</property> <!-- dialect,每个数据库都有其对应的dialect以匹配其平台特性 Hibernate2.0--> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <!-- 是否将运行期生成的sql输出到日志以供调试 --> <property name="hibernate.show_sql">TRUE</property> <!-- 是否使用数据库外连接 --> <property name="hibernate.user_outer_join">TRUE</property> <!-- 事务管理类型,这里使用JDBC Transaction <property name="hibernate.transation.factory_class"> org.hibernate.transaction.JDBCTransactionFactory </property>--> <!-- 映射文件配置,注意配置文件名必须包含其相对于根的全路径 --> <mapping resource="mapping/User.hbm.xml" /> </session-factory> </hibernate-configuration>
2、建立实体类 "com.dianzi.model.User.java" 及其映射文件 "User.hbm.xml" 放在 "mapping" 包下。
其中"User.java"的代码如下:
/**
*
*/
package com.dianzi.model;
/**
* 用户实体
*
* @author 点子二木
* @date 2009-1-4
* @version 1.0
*/
public class User extends SuperAModel {
private static final long serialVersionUID = -2135003197973935025L;
private String name;//用户名
private String password;//密码
private int roleId;//角色
public User() {
}
public User(String username, String password) {
this.name = username;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
其父类SuperAModel主要实现公共id:
protected int id;//主键id
public int getId() {
return id;
};
public void setId(int id) {
this.id = id;
}
User.hbm.xml的代码如下:注意<generator class="native"></generator>
Hibernate主键详解------Native
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
<?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.dianzi.model"> <class name="User" table="T_USER_TEST"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"></generator> </id> <property name="name" column="name" type="java.lang.String" length="100"> </property> <property name="password" column="password" type="java.lang.String" length="100"> </property> <property name="roleId" column="roleId" type="java.lang.Integer"> </property> </class> </hibernate-mapping>
3、建立"AutoExportDB.java"工具类,我们执行如下代码,就能轻松将User类导入数据库转变成数据库中的表。不过,前提是我们已经在MySQL中建立了一个名为"struts2"的数据库(根据配置文件hibernate.cfg.xml得来)。
有关Hibernate映射文件和数据库结构的互相转换问题请参见: Eclipse开发J2EE项目系列(3) --Hibernate映射文件和数据库表互转 。
/**
*
*/
package com.dianzi.util;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* 生成数据库表
*
* @author 点子二木
* @date 2009-1-7
* @version 1.0
*/
public class AutoExportDB {
static Session session;
static Configuration config = null;
static Transaction tx = null;
/**
* 运行此类,通过POJO类和配置文件,创建数据库结构
*
* @param args
*/
public static void main(String[] args) {
System.out.println("开始自动创建数据库结构...");
try {
config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
SchemaExport schemaExport = new SchemaExport(config);
schemaExport.create(true, true);
tx.commit();
System.out.println("数据库结构创建成功...");
} catch (HibernateException e) {
e.printStackTrace();
System.out.println("数据库结构创建失败...");
try {
tx.rollback();
} catch (HibernateException e1) {
e1.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("数据库结构创建失败...");
try {
tx.rollback();
} catch (HibernateException e1) {
e1.printStackTrace();
}
} finally {
System.out.println("结束...");
}
}
}
4、建立获取SessionFactory和管理Session的HibernateUtil.java类:
/**
*
*/
package com.dianzi.util;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Session管理类
* @author 点子二木
* @date 2009-1-7
* @version 1.0
*/
public class HibernateUtil {
// 声明Hibernate配置文件所在的路径
private static String configFile = "/hibernate.cfg.xml";
// 建Configuration对象
private static Configuration configuration = new Configuration();
// 建Session工厂对象
private static SessionFactory sessionFactory = null;
/**
* 单例模式,只初始化一次,只产生一个SessionFactory对象(线程安全)
*/
static {
try {
// 通过hibernate.cfg.xml配置数据库连接
configuration.configure(configFile);
// 建立一个Session工厂
sessionFactory = configuration.buildSessionFactory();
System.out.println("[标记]初始化SessionFactory");
} catch (Exception e) {
System.out.println("[异常]创建SessionFactory时发生异常,异常原因如下:");
e.printStackTrace();
}
}
/**
* getSession()方法
*
* @return Session对象
* @throws HibernateException
*/
public Session getSession() {
Session session = null;
try {
session = sessionFactory.openSession();
} catch (Exception e) {
System.out.println("[异常]开启Session时发生异常,异常原因如下:");
e.printStackTrace();
}
return session;
}
/**
* closeSession()方法
*
* @param session
* 要关闭的Session对象
*/
public void closeSession(Session session) {
try {
if (null != session)
session.close();
} catch (Exception e) {
System.out.println("[异常]关闭Session时发生异常,异常原因如下:");
e.printStackTrace();
}
}
}
5、DAO层设计:在"com.dianzi.dao" 包下建立两个类,一个是接口,一个是实现类,其中UserDaoImpl.java代码如下:
/**
*
*/
package com.dianzi.dao;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.dianzi.model.User;
import com.dianzi.util.HibernateUtil;
/**
*
* @author 点子二木
* @date 2009-1-6
* @version 1.0
*/
public class UserDaoImpl implements UserDao {
HibernateUtil util = new HibernateUtil();
public int add(User user) {
int result = 0;
Session session = util.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
session.save(user);
ts.commit();
result = user.getId();
} catch (Exception e) {
System.out.println("UserDaoImpl.add()方法发生异常:");
e.printStackTrace();
result = -1;
} finally {
util.closeSession(session);
}
return result;
}
public int login(User user) {
// int state = 0 ; //初始化状态变量
Session session = util.getSession();
try {
Query queryName = session
.createQuery("from User u where u.name = ?");
queryName.setString(0, user.getName());
List listName = queryName.list();
if (null == listName ||listName.isEmpty()) {
return -1; // 用户名不存在
}
Query queryNamePswd = session
.createQuery("from User u where u.name = ? and u.password = ?");
queryNamePswd.setString(0, user.getName());
queryNamePswd.setString(1, user.getPassword());
List listNamePswd = queryNamePswd.list();
if (null == listNamePswd ||listNamePswd.isEmpty()) {
return -2; // 密码不正确
}
Iterator it = listNamePswd.iterator();
User userquery = (User) it.next();
return userquery.getId(); // 验证成功,取ID值
} catch (Exception e) {
System.out.println("UserDaoImpl.isExist()方法发生异常:");
e.printStackTrace();
return 0; // 异常时返回0
} finally {
util.closeSession(session);
}
}
}
UserDao.java代码如下:
package com.dianzi.dao;
import com.dianzi.model.User;
/**
*
* @author 点子二木
* @date 2009-1-6
* @version 1.0
*/
public interface UserDao {
/**
* 增加用户
*
* @param user增加用户。0:异常; >0:成功(即返回该记录ID)
*/
public int add(User user);
/**
* 系统登录验证
*
* @param user
* @return -1:不存在用户名 ; -2:密码不正确 ;0:异常; >0:登录成功(即返回该记录ID)
*/
public int login(User user);
}
6、在web.xml中修改Struts 2.0配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>login</display-name> <!-- 用过滤器配置Struts2支持 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>jsp/login/login.jsp</welcome-file> </welcome-file-list> </web-app>
7、登录页面login.jsp、 注册页register.jsp都放在WebContent/jsp/login下。
注意<a href="preRegisterAction.action"> ,其中“.action”不可省略。
并注意验证码调用一句:<img src="jsp/login/makeCertPic.jsp" height="30">
登录页面login.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ 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=gbk">
<title>登录</title>
</head>
<body>
<p><a href="preRegisterAction.action">用户注册</a>|用户登录</p>
<s:form action="loginAction" theme="simple">
<table>
<tr>
<td style="text-align: right">账号</td>
<td><s:textfield name="username" label="账号" /></td>
</tr>
<tr>
<td style="text-align: right">密码</td>
<td><s:password name="password" label="密码" /></td>
</tr>
<tr>
<td style="text-align: right">验证码</td>
<td><s:textfield name="inputCertCode" label="验证码"
cssStyle="width:100px" /> <img src="jsp/util/makeCertPic.jsp"
height="30"></td>
</tr>
<tr>
<td style="text-align: right"><s:submit value="登录" /></td>
<td style="text-align: left"><s:reset value="重置" /></td>
</tr>
<s:if test="#{printResult}!=null">
<tr>
<td align="center" colspan="2">${printResult }</td>
</tr>
</s:if>
<s:if test="#{result}!=null">
<tr>
<td align="center" colspan="2">${result }</td>
</tr>
</s:if>
</table>
</s:form>
<s:fielderror cssStyle="color:red" />
</body>
</html>
注册页register.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册</title>
</head>
<body>
<p><a href="preLoginAction.action">用户登录</a>|用户注册</p>
<s:form action="registerAction" theme="simple">
<table>
<tr>
<td style="text-align: right">请输入账号</td>
<td><s:textfield name="user.name" label="账号" /></td>
</tr>
<tr>
<td style="text-align: right">请输入密码</td>
<td><s:password name="user.password" label="密码" /></td>
</tr>
<tr>
<td style="text-align: right">请再次输入密码</td>
<td><s:password name="repwd" label="重复密码" /></td>
</tr>
<tr>
<td style="text-align: right">请输入验证码</td>
<td><s:textfield name="inputCertCode" label="验证码"
cssStyle="width:100px" /> <img src="jsp/util/makeCertPic.jsp"
height="30"></td>
</tr>
<tr>
<td style="text-align: right"><s:submit value="注册" /></td>
<td style="text-align: left"><s:reset value="取消" /></td>
</tr>
</table>
</s:form>
<s:fielderror cssStyle="color:red" />
</body>
</html>
登录成功页面success.jsp,也在同一文件夹下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@ 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=GBK">
<title>登录成功</title>
</head>
<body>
<table align="center">
<tr>
<td>登录成功!</td>
</tr>
<tr>
<td>用户名:(EL表达式)</td>
<td>${username}</td>
</tr>
<tr>
<td>用户名:(s:property表达式)</td>
<td><s:property value="username" ></s:property></td>
</tr>
<tr>
<td><a href="logoutAction.action">退出</a>
</td>
</tr>
</table>
</body>
</html>
8、在JSP页中所用到的验证码的生成页面makeCertPic.jsp,放在WebContent/jsp/util下:
<%@page contentType="image/jpeg" pageEncoding="gbk"%>
<jsp:useBean id="image" scope="page"
class="com.dianzi.jspused.validate.MakeCertPic" />
<%
String str = image.getCertPic(0, 0, response.getOutputStream());
// 将验证码保存到Session中
try {
session.setAttribute("certCode", str);
////////以下两行必加,详见http://guoyiqi.iteye.com/blog/75929///////////////
out.clear();
out = pageContext.pushBody();
} catch (Exception e) {
System.out.println("服务器错误");
}
%>
其中,它调用了名为makeCertPic的Bean ,这个类主要用来生成彩色的验证图片,其代码如下:
/**
*
*/
package com.dianzi.jspused.validate;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
* 生成验证码图片
*
* @author 点子二木
* @date 2009-1-8
* @version 1.0
*/
public class MakeCertPic {
// 验证码图片中可以出现的字符集,可根据需要修改
// private char mapTable[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
// 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
// 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
// '9' };
private char mapTable[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9' };
/**
* 生成彩色验证码图片
*
* @param width生成的图片的宽度
* @param height生成的图片的高度
* @param os页面的输出流
* @return 返回生成的校验码
*/
public String getCertPic(int width, int height, OutputStream os) {
if (width <= 0)
width = 60;
if (height <= 0)
height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
// 画边框
g.setColor(Color.black);
g.drawRect(0, 0, width - 1, height - 1);
// 取随机产生的认证码
String strEnsure = "";
// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
for (int i = 0; i < 4; ++i) {
strEnsure += mapTable[(int) (mapTable.length * Math.random())];
}
// 将认证码显示到图象中,如果要生成更多位的认证码,增加drawString语句
g.setColor(Color.black);
g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
String str = strEnsure.substring(0, 1);
g.drawString(str, 8, 17);
str = strEnsure.substring(1, 2);
g.drawString(str, 20, 15);
str = strEnsure.substring(2, 3);
g.drawString(str, 35, 18);
str = strEnsure.substring(3, 4);
g.drawString(str, 45, 15);
// 随机产生10个干扰点
Random rand = new Random();
for (int i = 0; i < 10; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawOval(x, y, 1, 1);
}
// 释放图形上下文
g.dispose();
try {
// 输出图象到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
return "";
}finally{
}
return strEnsure;
}
}
9、此时,我们很有必要来配置一下struts-login.xml其全部代码如下:
其中需要注意:
(1).method="preLogin",表示对应于指定Action的preLogin方法。如果不指定该属性,则指定到execute方法
(2).<result name="success" type="redirect">preLoginAction.action</result> 可以用
<result name="success" type="chain">preLoginAction</result>替换。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configeration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="login" extends="struts-default"> <!-- 定向至用户登录 --> <action name="preLoginAction" class="com.dianzi.action.login.LoginAction" method="preLogin"> <result name="success">/jsp/login/login.jsp</result> <result name="input">/jsp/login/login.jsp</result> <result name="error">/jsp/error.jsp</result> </action> <!-- 用户登录 --> <action name="loginAction" class="com.dianzi.action.login.LoginAction" method="login"> <result name="success">/jsp/login/success.jsp</result> <result name="input">/jsp/login/login.jsp</result> <result name="error">/jsp/error.jsp</result> </action> <!-- 定向至用户注册 --> <action name="preRegisterAction" class="com.dianzi.action.login.RegisterAction" method="preRegister"> <result name="success">/jsp/login/register.jsp</result> <result name="input">/jsp/login/register.jsp</result> <result name="error">/jsp/error.jsp</result> </action> <!-- 用户注册 --> <action name="registerAction" class="com.dianzi.action.login.RegisterAction" method="register"> <result name="success">/jsp/login/login.jsp</result> <result name="input">/jsp/login/register.jsp</result> <result name="error">/jsp/error.jsp</result> </action> <!-- 用户登出 --> <action name="logoutAction" class="com.dianzi.action.login.LoginAction" method="logout"> <result name="success" type="redirect">preLoginAction.action</result> <result name="error">/jsp/error.jsp</result> </action> </package> </struts>
10、Action层设计:两个非常关键的类,其中LoginAction.java的代码如下:
/**
*
*/
package com.dianzi.action.login;
import java.util.Map;
import com.dianzi.dao.UserDao;
import com.dianzi.dao.UserDaoImpl;
import com.dianzi.model.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 登录
* @author 点子二木
* @date 2008-12-18
* @version 1.0
*/
public class LoginAction extends ActionSupport {
private UserDao userDao = new UserDaoImpl(); // 操纵数据库DAO类(Hibernate实现),通过Struts.xml注入值
private int id;
private String inputCertCode; // 验证码
private String username;// 用户名(值由struts注入)
private String password;// 密码(值由struts注入)
private String printResult;// 结果打印
/**
* 定向至登录
*
* @return
*/
public String preLogin() {
try {
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
/**
* 登录
*
* @return
*/
public String login() {
User user = new User(username, password);
int state = userDao.login(user);
System.out.println("state=" + state);
if (state == -1) {
this.addFieldError("username", "用户名不正确,请先注册!");
return INPUT;
} else if (state == -2) {
this.addFieldError("password", "密码不正确,请重新输入密码!");
return INPUT;
} else if (state > 0) {
System.out.println("[测试]登录成功!用户ID=" + state);
this.setId(state);
return SUCCESS;
} else {
this.addFieldError("username", "登录失败,请与管理员联系!");
return INPUT;
}
}
/**
* 登出
*
* @return
*/
public String logout() {
try {
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
/**
* 验证码验证login()
*/
public void validateLogin() {
if (null == inputCertCode || "".equals(inputCertCode)) {
this.addFieldError("inputCertCode", "验证码不能为空!");
} else {
Map session = ActionContext.getContext().getSession();
String certCode = session.get("certCode").toString();
if (!certCode.equals(this.inputCertCode)) {
this.addFieldError("inputCertCode", "验证码不正确!");
}
}
}
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 String getInputCertCode() {
return inputCertCode;
}
public void setInputCertCode(String inputCertCode) {
this.inputCertCode = inputCertCode;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrintResult() {
return printResult;
}
public void setPrintResult(String printResult) {
this.printResult = printResult;
}
}
RegisterAction.java的代码如下:
/**
*
*/
package com.dianzi.action.login;
import java.util.Map;
import com.dianzi.dao.UserDao;
import com.dianzi.dao.UserDaoImpl;
import com.dianzi.model.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 注册
* @author 点子二木
* @date 2009-1-8
* @version 1.0
*/
public class RegisterAction extends ActionSupport {
private UserDao userDao = new UserDaoImpl();
private User user; // 注册提交的用户对象
private String repwd; // 重复密码
private String inputCertCode; // 验证码
private String printResult; // 结果打印
/**
* 定向至注册
*
* @return
*/
public String preRegister() {
try {
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
/**
* 注册
* @return
* @throws Exception
*/
public String register() throws Exception {
int newId = userDao.add(user); // 保存注册的user对象
if(newId>0){
printResult = "注册成功,请登录!";
return SUCCESS;
}else{
return ERROR;
}
}
/**
* 验证码验证register()
*/
public void validateRegister() {
if (null == inputCertCode || "".equals(inputCertCode)) {
this.addFieldError("inputCertCode", "验证码不能为空!");
} else {
Map session = ActionContext.getContext().getSession();
String certCode = session.get("certCode").toString();
if (!certCode.equals(this.inputCertCode)) {
this.addFieldError("inputCertCode", "验证码不正确!");
}
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getRepwd() {
return repwd;
}
public void setRepwd(String repwd) {
this.repwd = repwd;
}
public String getInputCertCode() {
return inputCertCode;
}
public void setInputCertCode(String inputCertCode) {
this.inputCertCode = inputCertCode;
}
public String getPrintResult() {
return printResult;
}
public void setPrintResult(String printResult) {
this.printResult = printResult;
}
}
11、不要忘记配置校验框架,与上面两个Action同一个目录下。
注意命名规范:
(1).Action名-validation.xml,此规范表示对该Action所有方法进行验证。
(2).Action名-Struts配置文件中的Action标签的name属性-validation.xml,此规范表示对某一Action特定的方法进行验证。
遗留问题:
按照规范(1)给某一方法加入XXX-validation.xml文件后不能进入断点不知道是何种缘故。还望大侠指点。
LoginAction-loginAction-validation.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- 用户名验证 --> <field name="username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户名不能为空!</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,8})]]></param> <message>账号必须是长度为4-8的数字或字母!</message> </field-validator> </field> <!-- 密码验证 --> <field name="password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密码不能为空!</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,8})]]></param> <message>密码必须长度为4-8的数字或字母!</message> </field-validator> </field> </validators>
RegisterAction-registerAction-validation.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- 用户名验证 --> <field name="user.name" > <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户名不能为空!</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,8})]]></param> <message>账号必须是长度为4-8的数字或字母!</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="expression"><![CDATA[(\w{4,8})]]></param> <message>密码必须长度为4-8的数字或字母!</message> </field-validator> </field> <field name="repwd"> <field-validator type="requiredstring" short-circuit="true"> <param name="trim">true</param> <message>重复密码不能为空!</message> </field-validator> <field-validator type="fieldexpression"> <param name="expression"><![CDATA[(repwd==user.password)]]></param> <message>两次输入的密码要一致!</message> </field-validator> </field> </validators>
12、如果没有生成数据库,可以用如下sql代码:
DROP DATABASE IF EXISTS `struts2`;
CREATE DATABASE `struts2` /*!40100 DEFAULT CHARACTER SET gbk */;
USE `struts2`;
#
# Table structure for table t_user_test
#
CREATE TABLE `t_user_test` (
`Id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`roleId` int(11) NOT NULL default '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
13、整个工程的目录结构如下:
至此,我们的项目已经可以简单运行了,大家也自己动手尝试一下。