Struts2(十二)使用驗證框架驗證數據較驗


一、數據驗證

1.1、為什么要進行數據驗證

對數據的合法性進行檢查,只允許合法的數據進入應用程序

1.2、在哪里實現數據驗證

客戶端驗證:

數據提交前在客戶端驗證

可使用JavaScript或者JQuery實現

特點:減少客戶等待時間,減小服務器壓力

服務器端驗證:

在數據提交后服務器端驗證

特點:防止“繞過”客戶端驗證提交非法數據

   可以在服務器端處理數據前確保數據的合法性

1.3、Struts2有兩種方式實現服務器端數據驗證

  • 使用ActionSupport編碼實現驗證
  • 使用驗證框架實現驗證

二、使用ActionSupport實現驗證

  •  在Action類的業務方法中直接驗證
  • 重寫Validate()方法
  • 使用validateXxx()方法

2.1、添加錯誤信息

addFieldError(String fieldName,String errorMessage),添加字段的錯誤信息

addActionError(String anErrorMessage),添加與Action所處理業務相關的錯誤信息

2.2、在頁面輸出驗證結果

  • <s:fielderror/>輸出一個或者所胡字段的錯誤信息
  • <s:actionerror/>輸出所有Action的錯誤信息

2.3、action的配置

<result name="input">xxx.jsp</result>

三、ActionSupport驗證簡單實現

3.1、業務方法中較驗

 實體類

package com.pb.entity;
/*
 * 用戶類
 */
public class User {
    private String username;    //用戶名
    private String password;    //密碼
    private Integer age;        //年齡
    private String email;        //郵箱
    
    
    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 Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注冊頁面</title>
</head>
<body>

<!--  判斷字段是否有錯誤信息-->
<s:if test="hasFieldErrors()">
<h1 align="center">輸出錯誤字段信息</h1>
<div align="center" style="color:blue;">
使用s:fielderror輸出一個指定的錯誤信息
<s:fielderror name="user.username" />
使用s:fielderror輸出全部的錯誤信息
<s:fielderror />
</div>
</s:if>
<!-- 判斷action是否有錯誤 -->
<s:if test="hasActionErrors()">
<h1 align="center">輸出錯誤Action信息</h1>
<div  align="center" style="color:gray;">
使用s:actionerror輸出action相關的錯誤信息
<s:actionerror/>
</div>
</s:if>
<h1>使用execute業務方法直接較驗</h1>
<s:form action="register.action" method="post" >
<s:textfield label="用戶名"  name="user.username"/>
<s:password  label="密碼" name="user.password"/>
<s:textfield label="年齡" name="user.age" />
<s:textfield  label="郵箱" name="user.email"/>
<s:submit  value="提交" /><s:reset value="重置" /><br/>
</s:form>
<s:debug/>
</body>
</html>

UserAction

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;


public class UserAction extends ActionSupport {
    private User user;

    @Override
    public String execute() throws Exception {
        if(null==user.getUsername() || "".equals(user.getUsername())){
            this.addFieldError("user.username", "用戶名不能為空!");
        }
        if(null==user.getPassword() || "".equals(user.getPassword())){
            this.addFieldError("user.password", "密碼不能為空!");
        }
        String ageStr="^\\d{1,3}$";
        Pattern ageReg=Pattern.compile(ageStr);
        Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
        if(!ageMatcher.matches()){
            this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!");
        }
        if(null==user.getAge()){
            this.addFieldError("user.age", "年齡不能為空!");
        }
    
        String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
        Pattern emailReg=Pattern.compile(emaString);
        Matcher emailMatcher=emailReg.matcher(user.getEmail());
        if(!emailMatcher.matches()){
            this.addFieldError("user.email", "郵箱格式不正確");
        }
        if(this.hasErrors()){
            this.addActionError("輸入的注冊信息有誤");
            return INPUT;
        }
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
    

}

struts.xml

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/" extends="struts-default">
    <action name="register" class="com.pb.web.action.UserAction">
    <result name="input">/register.jsp</result>
    <result name="success">/registerSuccess.jsp</result>
    </action>    
    </package>
</struts>

 

四、在Validate()方法中實現驗證

  • 重寫ActionSupport類的validate()方法
  •  在validate()方法中實現驗證
  • 將數據驗證和業務處理分離
  • 添加與顯示錯誤信息的方式不變

接收參數時,數據轉換失敗也會調用validate()方法

validate()方法驗證不通過不會執行業務方法

4.1、更改之前實現validate()驗證

 

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;


public class UserAction1 extends ActionSupport {
    private User user;

    @Override
    public String execute() throws Exception {
        System.out.println("=========完成注冊信息======");
        if(this.hasErrors()){
            this.addActionError("輸入的注冊信息有誤");
            return INPUT;
        }
        return SUCCESS;
    }
    
    
    

    @Override
    public void validate() {
        if(null==user.getUsername() || "".equals(user.getUsername())){
            this.addFieldError("user.username", "用戶名不能為空!");
        }
        if(null==user.getPassword() || "".equals(user.getPassword())){
            this.addFieldError("user.password", "密碼不能為空!");
        }
        String ageStr="^\\d{1,3}$";
        Pattern ageReg=Pattern.compile(ageStr);
        Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
        if(!ageMatcher.matches()){
            this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!");
        }
        if(null==user.getAge() || "".equals(user.getAge())){
            this.addFieldError("user.age", "年齡不能為空!");
        }else{
            if(0>user.getAge() || 200<user.getAge()){
                this.addFieldError("user.age", "年齡1-200之間!!");
            }
        }
        
    
        String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
        Pattern emailReg=Pattern.compile(emaString);
        Matcher emailMatcher=emailReg.matcher(user.getEmail());
        if(!emailMatcher.matches()){
            this.addFieldError("user.email", "郵箱格式不正確");
        }
        super.validate();
        
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
    

}

如果Action中有validate()方法,會先執行驗證,驗證后才執行業務方法,不通過不執行業務方法

五、針對一個業務方法進行數據驗證

 使用validateXxx()方法

  • Struts2支持validateXxx()方法針對xxx()方法進行數據驗證
  • 使用validateRegister()方法實現針對register()方法的數據驗證
  • 注冊時通過validateRegister()方法驗證年齡和郵箱等其它字段
  • 注冊和登錄時在validate()方法中驗證用戶名和密碼非空等其它驗證

validate()方法和validateXxx()方法同時存在時都會起作用

ValidateXxx()方法的調用要先於validate()方法

5.1、使用針對注冊的驗證方法

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;


public class UserAction2 extends ActionSupport {
    private User user;

    public String register() throws Exception {
        System.out.println("=========完成注冊信息======");
        if(this.hasErrors()){
            return INPUT;
        }
        return SUCCESS;
    }
    
    
    

    @Override
    public void validate() {
        System.out.println("====執行validate方法驗證====");
        if(null==user.getUsername() || "".equals(user.getUsername())){
            this.addFieldError("user.username", "用戶名不能為空!");
        }
        if(null==user.getPassword() || "".equals(user.getPassword())){
            this.addFieldError("user.password", "密碼不能為空!");
        }


    }

public void validateRegister(){
    System.out.println("====執行validateRegister方法驗證====");
    String ageStr="^\\d{1,3}$";
    Pattern ageReg=Pattern.compile(ageStr);
    Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
    if(!ageMatcher.matches()){
        this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!");
    }
    if(null==user.getAge() || "".equals(user.getAge())){
        this.addFieldError("user.age", "年齡不能為空!");
    }else{
        if(0>user.getAge() || 200<user.getAge()){
            this.addFieldError("user.age", "年齡1-200之間!!");
        }
    }
    

    String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
    Pattern emailReg=Pattern.compile(emaString);
    Matcher emailMatcher=emailReg.matcher(user.getEmail());
    if(!emailMatcher.matches()){
        this.addFieldError("user.email", "郵箱格式不正確");
    }
}


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
    

}

struts.xml

<action name="register2" class="com.pb.web.action.UserAction2" method="register">
    <result name="input">/register2.jsp</result>
    <result name="success">/registerSuccess.jsp</result>
    </action>

 5.2、三種方法

 

六、驗證框架

 6.1、實現

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User;


public class UserAction3 extends ActionSupport {
    private User user;

    public String register() throws Exception {
        System.out.println("=========完成注冊信息======");
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
    

}

UserAction3-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!--  用戶名驗證-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶名不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message>
</field-validator>
</field>
<!--密碼  -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密碼不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格  -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message>
</field-validator>
</field>
<!--年齡  -->
<field name="user.age">
<field-validator type="required">
<param name="trim">true</param>
<message>年齡不能為空</message>
</field-validator>
<field-validator type="int">
<param name="trim">true</param>
<param name="min">1</param>
<param name="max">200</param>
<message>年齡為${min}---${max}歲之間</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>郵箱不能為空</message>
</field-validator>
<field-validator type="email">
<param name="trim">true</param>
<message>郵箱格式不正確!</message>
</field-validator>
</field>
</validators>

jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注冊頁面</title>
</head>
<body>

<!--  判斷字段是否有錯誤信息-->
<s:if test="hasFieldErrors()">
<h1 align="center">輸出錯誤字段信息</h1>
<div align="center" style="color:blue;">
使用s:fielderror輸出全部的錯誤信息
<s:fielderror />
</div>
</s:if>
<h1>ActionName-validation.xml較驗</h1>
<!-- 必須加上namespace不然不起作用-->
<s:form action="register3.action" method="post" namespace="/" >
<s:textfield label="用戶名"  name="user.username"/>
<s:password  label="密碼" name="user.password"/>
<s:textfield label="年齡" name="user.age" />
<s:textfield  label="郵箱" name="user.email"/>
<s:submit  value="提交" /><s:reset value="重置" /><br/>
</s:form>
<s:debug/>
</body>
</html>

struts.xml

<action name="register3" class="com.pb.web.action.UserAction3" method="register">
    <result name="input">/register3.jsp</result>
    <result name="success">/registerSuccess.jsp</result>
    </action>

 

七、針對一個業務編寫配置文件

 7.1、更改實現

將上面的年齡驗證和郵箱驗證獨立出來

struts.xml

<action name="register3" class="com.pb.web.action.UserAction3" method="register">
    <result name="input">/register3.jsp</result>
    <result name="success">/registerSuccess.jsp</result>
    </action>

 

UserAction3-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!--  用戶名驗證-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶名不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message>
</field-validator>
</field>
<!--密碼  -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密碼不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格  -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message>
</field-validator>
</field>
</validators>

UserAction3-register3-validation.xml   中間的名稱要與action名字相同

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!--  用戶名驗證-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶名不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message>
</field-validator>
</field>
<!--密碼  -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密碼不能為空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格  -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message>
</field-validator>
</field>
</validators>

 7.2、驗證順序

八、以上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM