首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

eclipse开发J2EE项目系列(二)——Struts2+Hibernate3+mysql5

2012-10-25 
eclipse开发J2EE项目系列(2)——Struts2+Hibernate3+mysql5??? 继续在前一节的基础上将登录的数据保存到数据

eclipse开发J2EE项目系列(2)——Struts2+Hibernate3+mysql5

??? 继续在前一节的基础上将登录的数据保存到数据库中,数据持久化用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;//主键idpublic int getId() {return id;};public void setId(int id) {this.id = id;}

? ? ?

User.hbm.xml的代码如下:注意<generator name="code"><?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 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"/><%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"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"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"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"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、整个工程的目录结构如下:

eclipse开发J2EE项目系列(二)——Struts2+Hibernate3+mysql5

?

?

至此,我们的项目已经可以简单运行了,大家也自己动手尝试一下。

?

热点排行