Struts2數據校驗


Struts2數據校驗

1.常見數據校驗方法

表單數據的校驗方式:
表單中的數據必須被效驗以后才能夠被使用,常用的效驗方式分為兩種:
前台校驗:也稱之為客戶端效驗,主要是通過JS編程的方式進行表單數據的驗證
后台校驗:也稱之為服務器端校驗,這里指的是使用Struts2通過xml配置的方式進行表單數據驗證

Struts2也提供了數據校驗的方式:
Struts2數據校驗通過攔截器完成:
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

Struts使用攔截器實現數據校驗的原理:jsp頁面中的表單數據提交之后是被Action類處理,例如登錄提交之后,action的中先進行validate()的一個方法來驗證數據,如果數據驗證成功,則繼續執行action的處理程序,如果數據驗證不成功,則補再執行action的處理程序。但是如果讓每一個的提交都先執行validate()呢?並且如何判斷validate()失敗之后不在執行處理程序呢?
這里就可以使用攔截器,因為攔截器是在action對象創建之后執行,執行攔截器之后再執行action類。所有,可以讓攔截器先執行validate()方法,如果校驗不成功,就不再執行action處理程序。

2.Struts數據校驗方式

2.1.代碼方式驗證Action中所有的方法

使用代碼方法校驗Action中的所有方法,只需要在Action中重寫一個固定方法:validate(),把校驗規則現在這里里面即可。攔截器會自動對Action中的所有處理方法執行這個驗證。
代碼示例:

package b_vaild;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 注意:如果要想使用Struts的數據校驗功能,就必須繼承ActionSupport
 */
public class UserAction extends ActionSupport{

    //封裝請求數據
    private User user;

    public User getUser() {
        return user;
    }

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

    //重寫數據驗證的方法
    @Override
    public void validate() {
       //用戶名非空
        if (user.getUserName()==null || "".equals(user.getUserName())){
            //保存錯誤信息
            super.addFieldError("userName","用戶名必須填寫!");
        }

        //密碼
        if (user.getPwd()==null || "".equals(user.getPwd())){
            super.addFieldError("pwd","密碼必填");
        }
    }

    //業務方法
    public String register(){
        System.out.println(user);
        return SUCCESSuu;
    }
}

需要注意兩點:
1.必須要繼承ActionSupport。
2.驗證方法的名字必須是validate().

2.2.代碼方式驗證Action中指定的方法

上面的方法會對Action中的所有處理程序執行數據校驗,但是很多時候只需要對個別處理程序校驗,其他方法不需要校驗,例如對數據表單的提交處理程序就必須提供校驗,但是對轉發或者列表展示等是不需要數據校驗的。
這個時候就需要對Action中指定的方法進行數據校驗,具體操作方法只需要修改驗證方法的名字,原本是validate()修改為:validate()+要驗證的方法

例如:
public void validateRegister() {……}
只會驗證當前action的register方法!

2.3.XML方式驗證Action中所有的方法

使用上面的代校驗Action方法非常的繁瑣,需要重復寫校驗邏輯,例如:非空驗證,數值驗證,email驗證,日期等

更推薦的是使用Struts的xml方式驗證,因為這種方式驗證時Struts已經對常用的驗證進行了封裝,即提供了一些常用的驗證器,直接使用即可

常用驗證器的位置:
xwork-core-2.3.4.1.jar/com/opensymphony/xwork2/validator/validators/default.xml

常用的驗證器:

<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

required:

確保某給定字段的值不是空值 null

requiredstring:

確保某給定字段的值既不是空值 null, 也不是空白.
trim 參數. 默認為 true, 表示 struts 在驗證該字段值之前先剔除前后空格.

stringlength:

驗證一個非空的字段值是不是有足夠的長度.
minLength: 相關字段的最小長度. 若沒有給出這個參數, 該字段將沒有最小長度限制
maxLength:相關字段的最大長度. 若沒有給出這個參數, 該字段將沒有最大長度限制
trim: 在驗證之前是否去除前后空格

int:

檢查給定字段的值是否可以被轉換為一個整數且在一定范圍
min: 相關字段的最小值. 若沒給出這個參數, 該字段將沒有最小值限制
max: 相關字段的最大值. 若沒給出這個參數, 該字段將沒有最大值限制

date:

確保某給定日期字段的值落在一個給定的范圍內
max:相關字段的最大值. 若沒給出這個參數, 該字段將沒有最大值限制
min:相關字段的最小值. 若沒給出這個參數, 該字段將沒有最小值限制

email:

檢查給定 String 值是否是一個合法的 email

url:

檢查給定 String 值是否是一個合法的 url

regex:

檢查某給定字段的值是否與一個給定的正則表達式模式相匹配.
expresssion*: 用來匹配的正則表達式
caseSensitive: 是否區分字母的大小寫. 默認為 true
trim: 是否去除前后空格. 默認為 true

conversion:

轉換校驗器,指定在類型轉換失敗時,提示的錯誤信息

visitor:

用於校驗action中的復合屬性,它指定一個校驗文件用於校驗復合屬性中的屬性

expression:

OGNL表達式校驗器,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中

double:

雙精度浮點數校驗器,要求field的雙精度浮點數必須在指定范圍內,min指定最小值,max指定最大值 `

具體配置方法:
1.創建配置文件,文件名命名語法:ActionClassName-validation.xml

注意:此xml需要與當前要驗證的action在同一個目錄
舉例:UserAction-validation.xml

2.寫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>
    <!--驗證的每一個字段用filed表示-->

    <!--驗證用戶名-->
    <field name="user.userName">
        <!--指定使用的驗證器,此處選擇非空驗證-->
        <field-validator type="requiredstring">
            <!--驗證失敗的錯誤提示信息-->
            <message>用戶名不能為空</message>
        </field-validator>
    </field>

    <!--驗證pwd-->
    <field name="user.pwd">
        <!--密碼非空-->
        <field-validator type="requiredstring">
            <message>密碼不能為空</message>
        </field-validator>

        <!--密碼長度驗證-->
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">8</param>
            <message>密碼必須為6-8位!</message>
        </field-validator>
    </field>

    <!--驗證日期-->
    <field name="user.birth">
        <field-validator type="date">
            <message>日期格式不對!</message>
        </field-validator>
    </field>

    <!--驗證email-->
    <field name="user.email">
        <field-validator type="email">
            <message>郵箱格式錯誤!</message>
        </field-validator>
    </field>
</validators>

2.4.XML方式驗證Action中指定的方法

驗證Action中指定方法與上面xml驗證方式大致相同:驗證xml內容不變,修改文件名:
語法:ActionClassName-ActionName-validation.xml
舉例只驗證UserAction中的register方法,則文件命名為:UserAction-user_register-validation.xml,user_register是xml中action的name

2.5.驗證總結

代碼:
重寫validate(),驗證action所有方法
validate(),驗證指定“方法名”的方法

XML:
驗證所有方法:ActionClassName-validation.xml
驗證指定方法:ActionClassName-actionName-validation.xml

代碼驗證:
比較靈活,可以滿足所有要求
比較繁瑣,要寫重復的驗證判斷邏輯
適合:表單字段較少的情況用!

XML驗證:
通用,但不夠靈活,可以驗證特定簡單的業務
適合:驗證表單字段較多,可以大大簡化代碼!(配置文件過多)

3.驗證錯誤處理

Struts2在進行數據校驗的時候,驗證失敗,會返回input視圖,要求我們要在struts.xml中配置input視圖對應的錯誤頁面!

struts.xml中配置:

<!-- 注冊失敗跳轉到注冊頁面,顯示失敗信息 -->
		<global-results>
			<result name="input">/register.jsp</result>
		</global-results>

``
**JSP頁面顯示錯誤:**
方式1:顯示所有錯誤:
```jsp
<%@taglib prefix="s" uri="/struts-tags" %>
<%--顯示的是struts在運行時期間產生的所有錯誤--%>
<s:fielderror fieldName="user.userName"/>
<s:fielderror fieldName="user.pwd"/>
<s:fielderror fieldName="user.email"/>
<s:fielderror fieldName="user.birth"/>

方式2:顯示指定的錯誤:
方式1 中會在表單砂上面顯示,一般我們希望的是能夠在表單后面顯示錯誤信息,但是驗證器又默認是帶有換行操作的,所以可以通過css來取消換行操作,然后把錯誤信息放在每個表單后面:

<!-- 修改struts標簽默認的樣式: 不讓換行 --> 
	<style type="text/css">
	ul{
		display: inline;
	}
	ul li{
		display: inline;
		color: red;
	}
	</style>

顯示指定錯誤信息:

<s:fielderror fieldName="user.userName"></s:fielderror>

方式3:
既然默認是帶有換行操作的,那么也可以修改源碼取消換行,這樣就不用寫css了
具體操作方式是:
找到fielderror標簽定義的模板文件:
Struts-core.jar\template\simple\ fielderror.ftl

把修改后的fielderror.ftl文件,放到src/ template/ simple/ fielderror.ftl

這樣標簽顯示的樣式就修改了!


免責聲明!

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



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