struts2手動驗證:
* 首先要從頁面中獲取對應的標籤name屬性的值,在動做類action中聲明同名的屬性,提供get和set方法
* 要繼承ActionSupport類或者實現Validateable接口
* 重寫Validateable接口的validate()方法
* 前提是:要保證setUsername()、validate()、login()方法要按照這個前後順序執行
* 若是登陸失敗,如何處理:
* this.addFieldError( key, value);
* key:錯誤提示字段
* value:錯誤提示信息
* 何時纔是驗證經過?
* 驗證經過:一、map集合不存在;二、map集合存在併爲空
* 驗證不經過:map集合存在而且不爲空
* 分析需求:
* 用戶名不能爲null ,""
* 密碼不能爲null, "" ,而且密碼的長度6-12之間
* 針對全部業務方法進行驗證仍是針對某個指定業務方法進行驗證?
* 重寫的validate()方法,針對全部業務方法進行驗證
* 重寫的validate()方法加上要驗證的指定的業務方法名(業務方法名的首字母大寫),實現針對某個指定的業務方法進行驗證
* 爲何要這樣進行拼接?由於struts2框架底層拼接,若是不這樣寫,底層就找不到對應方法名
java
package cn.itcast.validate;框架
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;this
import com.opensymphony.xwork2.ActionSupport;繼承
@SuppressWarnings("serial")
public class ValidateAction extends ActionSupport {接口
private String username;
private String psw;
public void setUsername(String username) {
System.out.println("ValidateAction ************ setUsername()");
this.username = username;
}
/*
* 驗證方法:
* * 該動做類action必須繼承ActionSupport或者實現Validateable接口
* * 必須重寫Validateable接口提供的validate()方法
*
* * 必需要保證setUsername()、validate()、login()方法的執行順序以下:
* * setUsername()
* * validate()
* * login()
*
* * 若是登陸失敗,如何處理:
* * this.addFieldError( key, value);
* * key:錯誤提示字段
* * value:錯誤提示信息
*
* * 經過底層代碼說明:
* public synchronized void addFieldError(String fieldName, String errorMessage) {
final Map<String, List<String>> errors = internalGetFieldErrors(); //聲明一個map集合
List<String> thisFieldErrors = errors.get(fieldName); //聲明一個list集合,放入對應錯誤提示信息
if (thisFieldErrors == null) { //若是list集合爲空
thisFieldErrors = new ArrayList<String>(); //從新建立一個list集合
errors.put(fieldName, thisFieldErrors); //把list集合放入到map集合中
}
thisFieldErrors.add(errorMessage); //把錯誤提示信息放入到list集合中
}
*
* * 何時纔是驗證經過?
* * 驗證經過:一、map集合不存在;二、map集合存在併爲空
* * 驗證不經過:map集合存在而且不爲空
*
* * 分析需求:
* * 用戶名不能爲null ,""
* 密碼不能爲null, "" ,而且密碼的長度6-12之間
*
* * 針對全部業務方法進行驗證仍是針對某個指定業務方法進行驗證?
* * 重寫的validate()方法,針對全部業務方法進行驗證
* * 重寫的validate()方法加上要驗證的指定的業務方法名(業務方法名的首字母大寫),實現針對某個指定的業務方法進行驗證
* * 爲何要這樣進行拼接?由於struts2框架底層拼接,若是不這樣寫,底層就找不到對應方法名
*
*/
public void validateLogin() {
System.out.println("ValidateAction ************ validate()");
if(username==null||username.equals("")){
this.addFieldError("error", "用戶名不能爲空!");
}
if(psw==null||psw.equals("")){
this.addFieldError("error", "密碼不能爲空!");
}else{
String pattern = "^[0-9a-zA-Z]{6,12}$";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(psw);
boolean b = m.matches();
if(!b){
this.addFieldError("error", "密碼的長度必須在6至12之間!");
}
}
}
public String login(){
System.out.println("ValidateAction ********* login()");
System.out.println("username = "+username);
System.out.println("password = "+psw);
return "success";
}
public String test(){
System.out.println("ValidateAction ********* test()");
return "success";
}get
public String getUsername() {
return username;
}it
public String getPsw() {
return psw;
}io
public void setPsw(String psw) {
this.psw = psw;
}
}ast