- 浏览: 140614 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
shantuijun:
不能下载啊
eclipse开发J2EE项目系列(2)——Struts2+Hibernate3+mysql5 -
q595153335:
十一月 20, 2013 2:00:41 下午 org.apa ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
frand_feng:
为什么我的Eclipse添加完struts2的框架就开始报错呀 ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
dingyushuang:
为什么我的Eclipse添加完struts2的框架就开始报错呀 ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建 -
xp1056:
博主,不知道你的例子不行,还是我配置的IDE(Eclipse ...
eclipse开发J2EE项目系列(1)——Struts2框架搭建
继续在前一节的基础上将登录的数据保存到数据库中,数据持久化用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、整个工程的目录结构如下:
至此,我们的项目已经可以简单运行了,大家也自己动手尝试一下。
- dianziStruts2Base.rar (7.8 MB)
- 下载次数: 215
相关推荐
《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》详细介绍了Java Web软件架构中的各种开发技术。主要内容包括:以MySQL为数据库、Tomcat为Web服务器、Eclipse为开发工具、CVS为版本控制工具...
在本文中,我们将探讨如何在Eclipse环境中搭建一个基于J2EE的SSH2应用,以及如何使用Struts2.3.16、Spring3.2.3和Hibernate4.1.11版本进行基本的增删改功能测试。 首先,我们需要从网络上下载这三个框架的对应版本...
根据提供的标题、描述以及部分内容,本文将详细解析与MYECLIPSE + STRUTS2 + SPRING4 + HIBERNATE4 + STRUCTS2S+OGNL + MYSQL_5.7.12相关的技术栈及其应用。这些技术在企业级开发中非常常见,能够帮助开发者构建高效...
程序天下 J2EE struts+spring+Hibernate源码 光 盘 介 绍 1.系统运行环境 数据库:MySQL 5.0.20。 技术平台:J2SE 6.0、Eclipse 3.2.2、Log4j1.2.14、Ant1.7.0、JUnit4.3、CVSNT2.5.03.2382。 服务器软件:Tomcat...
- 配置开发环境:参照“Struts+Spring+Hibernate之搭建Eclipse+MyEclipse开发环境”的指南,确保所有必要的库(如struts、spring、hibernate的jar文件)已经添加到项目的类路径中。 2. **添加框架支持** - **...
"BBS.rar_Eclipse_J2EE_bbs_struts_hibernate_struts" 暗示了一个基于Java EE(以前称为J2EE)的BBS(Bulletin Board System,电子公告板)应用程序开发项目,该程序使用了Eclipse IDE,以及Struts、Hibernate和...
《开发者突击:Java Web主流框架整合开发(第2版)(含CD光盘1张)》是畅销书《开发者突击:Java Web主流框架整合开发(J2EE+Struts+ Hibernate+Spring)》的第2版,全面地讲解了Java Web开发中的流行技术和软件架构,...
3. **开发工具选择**:开发环境基于MyEclipse 6.01 GA,集成JDK 1.6和Eclipse 3.3.1,Web服务器选用Tomcat 6.0。 ##### 1.2.2.4 开发技术简介 在技术选型方面,系统采用了J2EE标准、Struts、Spring、Hibernate等...
该框架是一个简单的SSH框架,仅含一个简单的测试对象...运行环境:eclipse+Tomcat7.0.82+SQL Server 2012。可自行选择Mysql数据库。具体使用注意事项请前往http://blog.csdn.net/bujiangdaoli/article/details/78721303
工具详尽:包括JDK、Tomcat、Eclipse、MySQL、Log4j、Ant、JUnit、CVS、解析XML文件等; 由浅入深:每章从简单示例入手,最后给出一个详细示例加深理解; 实战性强:书中提供了大量典型的应用案例,实战性很强; ...
《精通J2EE--ECLIPSE、STRUTS、HIBERNATE及SPRING整合应用案例代码》是由mystuman提供的一个深度学习J2EE技术的资源包,旨在帮助开发者掌握如何在Eclipse集成开发环境中整合Struts、Hibernate和Spring这三大主流框架...
Struts2和Hibernate是两种非常重要的Java开源框架,它们在企业级Web开发中扮演着核心角色。Struts2是一款强大的MVC(Model-View-Controller)框架,它为构建基于J2EE的Web应用程序提供了结构化的支持。而Hibernate则...
在Java Web开发领域,MyEclipse、Struts和Hibernate是三个非常重要的组件。MyEclipse是一款强大的集成开发环境,Struts是MVC框架的代表,而Hibernate则是流行的ORM(对象关系映射)框架。本文将详细介绍如何在...
本书《精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例》的第3章专注于Hibernate框架的起航,即介绍如何整合Hibernate与其他J2EE技术,并通过具体实例加深理解。 Hibernate是一个开源的ORM(对象关系...
### 精通J2EE--Eclipse、Struts...以上知识点构成了《精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例》这本书的核心内容,对于希望深入学习和掌握J2EE开发技术的专业人士来说,是一本非常宝贵的参考资料。
【标题】中的“毕业设计&课设--大二J2EE课程设计 毕业设计选题系统(架构:spring+struts+hibernate)”指的是一个基于Java企业级应用平台(J2EE)的项目,这个项目是针对大二学生的毕业或课程设计任务。系统的核心...