1. 程式人生 > >【Struts2+Hibernate】資料校驗功能+修改密碼系統

【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的修改密碼系統開發完畢