对于之前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的修改密码系统开发完毕