【Struts2+Hibernate】数据校验功能+修改密码系统

对于之前Struts2的数据校验学习进一步深化,但是还有当Struts2在数据校验的时候,涉及类型转换的部分的坑还没有填,就是本该输入整型的文本框,当用户输入了一个字符串,这样的问题处理还没有进行深究。本篇的用户名与密码的文本框都是输入容纳字符串的文本框,基本输入任何东西都不会出错。

对于用户输入的用户名与密码进行校验,不允许其为空,新密码长度必须在4到25个字符之间,两次输入密码的情况必须一致。

同时把Hibernate对于数据库的修改Update操作进行最后的填坑,加上之前的查表与插入,对于Hibernate操纵数据库的情况也算是研究完毕了。删除就不进行研究了,一般设置一个删除位。不然随便删除一列就会出现如下的情况,自增列的某几项永远是残缺的。


一、基本功能

首先在数据库里面存有一张用户基本信息表,如下,


创造一个修改密码系统,



所有文本框不允许输入空值,否则出现错误信息


两次输入的密码必须一致,否则出现错误信息,同时由于是密码文本框,输入错误系统会自动抹去让用户重填


之后如果在用户基本信息表,没有这个用户,则出现错误信息


如果有此用户,但是原来密码输入错误,同样会出现错误信息


只有当用户名输入正确,原来的密码输入正确,新密码与确认的新密码输入一致时,才会显示修改密码成功的提示,同时刷新一下用户基本信息表,能够发现用户的密码确实修改了。



二、基本思想


数据库的链接hibernate.cfg.xml与映射配置Usr.hbm.xml略,同之前《【Hibernate】最简单的Hibernate工程——账号注册系统》一文(点击打开链接


三、具体实现

1.前台的功能不再赘述。

贴出前台的validation_update.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>修改密码</title>

		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

	</head>

	<body>
	<h1>修改密码</h1>
	<strong><font color="red"><s:property value="error"/></font></strong>
		<s:form action="update" method="post">
			<s:textfield name="username" label="用户名" />
			<s:password name="password" label="密码" />
			<s:password name="p2" label="请再次输入密码" />
			<s:password name="newpassword" label="新密码" />
			<s:password name="np2" label="请再次输入密码" />
			<s:submit value="修改密码" />
		</s:form>
	</body>
</html>

与Struts.xml,这里注意不像以前简单的数据校验功能,成功返回值可以不指定为"go",由于同时使用了Hibernate,在实践中,亲测,不加入对成功返回值的处理,不会跳转到成功页面!

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<package name="struts2" extends="struts-default">
		<action name="update" class="com.hibernate.dao.Update">
			<result name="go">/WEB-INF/updatesucc.jsp</result>
			<result name="input">/validation_update.jsp</result>
		</action>
	</package>
</struts>

给各位看官,相关技术请参照之前的《【Struts2】创造一个最简单、最基本的Struts2工程》( 点击打开链接

如基本思想所述,本系统关键写好Update-validation.xml与Update.java两个文件,下面进行详细的叙述


2.Update-validation.xml

<?xml version="1.0" encoding="utf-8"?>
	<!-- 指定校验配置文件的DTD信息 -->
<!DOCTYPE validators PUBLIC 
	"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
	"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
	<!-- 校验文件的根元素 -->
<validators>
	<!-- 要对哪一个参数进行检验,就要写出<field>标签,且设置其name值对应此参数 -->
	<field name="username">
		<!-- 必填校验器,检查其输入是否为空 -->
		<field-validator type="requiredstring" short-circuit="true">
			<param name="trim">true</param>
			<message>必须输入用户名</message>
		</field-validator>
	</field>

	<field name="password">
		<field-validator type="requiredstring" short-circuit="true">
			<param name="trim">true</param>
			<message>必须输入密码</message>
		</field-validator>
	</field>
	<field name="p2">
		<!-- 意思为表达式校验器,检查其password是否等于p2 -->
		<field-validator type="fieldexpression" short-circuit="true">
			<param name="expression"><![CDATA[(password==p2)]]></param>
			<message>两次输入密码不一致</message>
		</field-validator>
	</field>

	<field name="newpassword">
		<field-validator type="requiredstring" short-circuit="true">
			<param name="trim">true</param>
			<message>必须输入密码</message>
		</field-validator>
	</field>
	<field name="np2">
		<field-validator type="fieldexpression" short-circuit="true">
			<param name="expression"><![CDATA[(newpassword==np2)]]></param>
			<message>两次输入密码不一致</message>
		</field-validator>
		<!-- 意思为正则表达式校验器,检查其输入的内容是否符合要求 -->
		<field-validator type="regex">
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<message>您输入的新密码只能是字母和数字,且长度必须在4到25之间</message>
		</field-validator>
	</field>
</validators>

同时,这个文件必须与所属的动作文件形成呼应。Struts2规定改校验文件的文件名应该遵守如下规则:

<Action 名字>-validation.xml

且该文件应该被保存在与Action calss文件相同的路径下,也就是Action所在的包里,

例如,Update-validation.xml应该与Update.java同处于com.hibernate.dao.*;包中


3.Update.java

主体的思想是,想查表看是否有这个用户,然后看这个用户在表的密码是否与其输入的旧密码相一致,再用新密码替换旧密码。如果其中有一步不过关则不进行替换。

package com.hibernate.dao;

import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.*;
import com.hibernate.po.*;
import com.opensymphony.xwork2.*;

public class Update extends ActionSupport {
	//用到了校验功能,必须在Update-validation.xml相应的动作之中继承com.opensymphony.xwork2.*包中的ActionSupport
	private String username;
	private String password;
	private String p2;
	private String newpassword;
	private String np2;
	private String error = null;
	//在这里虽然p2,np2都没有在本Action用到,但在校验文件Update-validation.xml中用到,所以同样需要引入,
	//否则这两个值会永远是null
	
	//以下为相应的成员变量注入相应的GETTER与SETTER,不赘述
	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 getError() {
		return error;
	}

	public void setError(String error) {
		this.error = error;
	}

	public String getNewpassword() {
		return newpassword;
	}

	public void setNewpassword(String newpassword) {
		this.newpassword = newpassword;
	}
	
	public String getP2() {
		return p2;
	}

	public void setP2(String p2) {
		this.p2 = p2;
	}

	public String getNp2() {
		return np2;
	}

	public void setNp2(String np2) {
		this.np2 = np2;
	}
	
	public String execute() throws Exception {
		//以下判定的逻辑与注册系统,与用户注册系统判定是否存在此用户的方法是一致的,不赘述
		SessionFactory sf = new Configuration().configure()
				.buildSessionFactory();
		Session sess = sf.openSession();
		Transaction tx = sess.beginTransaction();
		List list = sess
				.createQuery("from Usr as u where u.username=:username")
				.setString("username", getUsername()).list();
		if (!(list.size() > 0)) {
			setError("无此用户");
			tx.commit();
			sess.close();
			sf.close();
			//不成功,这次统一返回input,而不是error,与校验文件默认的返回值相一致
			return "input";

		}

		else {
			list = sess.createQuery("from Usr as u where u.password=:password")
					.setString("password", getPassword()).list();
			if (!(list.size() > 0)) {
				setError("密码错误");
				tx.commit();
				sess.close();
				sf.close();
				return "input";

			} 
			else {
				Usr u = new Usr();
				//以下为Hibernate中修改Update语句的用法,如果设置到两个输入变量,则在后面同时接两个setString的方法
				//不同于查询Select语句的用法最后接.list()方法,同时还要用一个list去接查询结果
				//直接用.executeUpdate()方法去实施对数据库的操作
				sess
						.createQuery(
								"update Usr as u set u.password=:newpassword where u.username=:username")
						.setString("newpassword", getNewpassword()).setString(
								"username", getUsername()).executeUpdate();
				tx.commit();
				sess.close();
				sf.close();
				// 成功,则返回一个go给前台
				return "go";
			}
		}
	}
}

某些没有注释的不再注释,相应的技术,请看之前的两篇《【Hibernate】最简单的Hibernate工程——账号注册系统》(点击打开链接

《【Hibernate】把Hibernate在后台查询到的数据通过Struts标签在前台进行输出》(点击打开链接

至此,整个Struts2的数据校验功能与Hibernate的修改密码系统开发完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值