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