隨筆-61  評論-159  文章-0  trackbacks-0
                    在struts2中如果action繼承ActionSupport,就可以重寫public void validate() 方法,如果是想校驗某個方法則如下:
          public String login() throws Exception {....................};則校驗方法為public void validateLogin() ,也就是validate+要被校驗的方法名(注意頭字母要大寫),這樣就可以實現所謂的服務器端的字段校驗。
                   struts2給我們提供了一個功能比較強大的validation校驗框架。
                   以下介紹struts2校驗框架的使用:
                   在一個action中,例如:
           1import java.util.Date;
           2
           3import com.opensymphony.xwork2.ActionSupport;
           4
           5@SuppressWarnings("serial")
           6public class RegisterAction extends ActionSupport {
           7    private String name;
           8    private int age;
           9    private Date birthday;
          10    
          11    @Override
          12    public String execute() throws Exception {
          13        // TODO Auto-generated method stub
          14        return SUCCESS;
          15    }

          16    @Override
          17    
          18    public String getName() {
          19        return name;
          20    }

          21    public void setName(String name) {
          22        this.name = name;
          23    }

          24    
          25    public int getAge() {
          26        return age;
          27    }

          28    public void setAge(int age) {
          29        this.age = age;
          30    }

          31    public Date getBirthday() {
          32        return birthday;
          33    }

          34    public void setBirthday(Date birthday) {
          35        this.birthday = birthday;
          36    }

          37    
          38}
                  在action類的同一個包里面加入相關RegisterAction-validation.xml文件,命名規則為:action名-validation.xml

                  首先要些校驗框架的的xml文件先從xml文件的dtd入手,用firefox或者chrome打開dtd(IE不可以正常打開),地址為:http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd,以下是校驗框架的dtd:
           1<?xml version="1.0" encoding="UTF-8"?>
           2
           3<!--
           4  XWork Validators DTD.
           5  Used the following DOCTYPE.
           6  
           7  <!DOCTYPE validators PUBLIC 
           8          "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
           9          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
          10-->
          11
          12
          13<!ELEMENT validators (field|validator)+>
          14
          15<!ELEMENT field (field-validator+)>
          16<!ATTLIST field
          17    name CDATA #REQUIRED
          18>
          19
          20<!ELEMENT field-validator (param*, message)>
          21<!ATTLIST field-validator
          22    type CDATA #REQUIRED
          23    short-circuit (true|false) "false"
          24>
          25
          26<!ELEMENT validator (param*, message)>
          27<!ATTLIST validator
          28    type CDATA #REQUIRED
          29    short-circuit (true|false) "false"
          30>
          31
          32<!ELEMENT param (#PCDATA)>
          33<!ATTLIST param
          34    name CDATA #REQUIRED
          35>
          36
          37<!ELEMENT message (#PCDATA)>
          38<!ATTLIST message
          39    key CDATA #IMPLIED
          40>
          PS:看不懂dtd的,google一下dtd一些資料即可。

          通過校驗框架的dtd的規范來寫校驗框架的xml配置文件,配置文件如下:
           1<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
           2"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
           3<validators>
           4    <field name="name">
           5        <field-validator type="requiredstring">
           6            <param name="trim">true</param>
           7            <message>the name shouldn't be blank!</message>
           8        </field-validator>
           9        <field-validator type="stringlength">
          10            <param name="minLength">5</param>
          11            <param name="maxLength">10</param>
          12            <message>name's length should be between ${minLength} and ${maxLength}!</message>
          13        </field-validator>
          14    </field>
          15    <field name="age">
          16        <field-validator type="required">
          17            <message>age should not be blank!</message>
          18        </field-validator>
          19    
          20        <field-validator type="int">
          21            <param name="min">1</param>
          22            <param name="max">150</param>
          23            <message>age should be between ${min} and ${max}</message>
          24        </field-validator>
          25    </field>
          26    <field name="birthday">
          27        <field-validator type="required">
          28            <message>birthday should not be blank!</message>
          29        </field-validator>
          30        
          31        <field-validator type="date">
          32            <param name="min">2001-01-01</param>
          33            <param name="max">2003-12-31</param>
          34            <message>birthday should be between ${min} and ${max}</message>
          35        </field-validator>
          36    </field>
          37</validators>

          其中校驗框架的xml配置文件里面的一些參數不是隨意的,是根據以下類里面來的
           1<?xml version="1.0" encoding="UTF-8"?>
           2<!DOCTYPE validators PUBLIC
           3        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
           4        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
           5<!-- START SNIPPET: validators-default -->
           6<validators>
           7    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
           8    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
           9    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
          10    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
          11    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
          12    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
          13    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
          14    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
          15    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
          16    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
          17    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
          18    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
          19    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
          20</validators>
          21<!--  END SNIPPET: validators-default -->

           1、先從 requiredstring入手,找到com.opensymphony.xwork2.validator.validators.RequiredStringValidator
           1public class RequiredStringValidator extends FieldValidatorSupport {
           2
           3    private boolean doTrim = true;
           4
           5
           6    public void setTrim(boolean trim) {
           7        doTrim = trim;
           8    }

           9
          10    public boolean getTrim() {
          11        return doTrim;
          12    }

          13
          14    public void validate(Object object) throws ValidationException {
          15        String fieldName = getFieldName();
          16        Object value = this.getFieldValue(fieldName, object);
          17
          18        if (!(value instanceof String)) {
          19            addFieldError(fieldName, object);
          20        }
           else {
          21            String s = (String) value;
          22
          23            if (doTrim) {
          24                s = s.trim();
          25            }

          26
          27            if (s.length() == 0{
          28                addFieldError(fieldName, object);
          29            }

          30        }

          31    }

          32}

          33

          注:其中trim就是此類中的一個聲明布爾類型的變量。

          2、校驗框架中的stringLength,對應的類是com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator

           1public class StringLengthFieldValidator extends FieldValidatorSupport {
           2
           3    private boolean doTrim = true;
           4    private int maxLength = -1;
           5    private int minLength = -1;
           6
           7
           8    public void setMaxLength(int maxLength) {
           9        this.maxLength = maxLength;
          10    }

          11
          12    public int getMaxLength() {
          13        return maxLength;
          14    }

          15
          16    public void setMinLength(int minLength) {
          17        this.minLength = minLength;
          18    }

          19
          20    public int getMinLength() {
          21        return minLength;
          22    }

          23
          24    public void setTrim(boolean trim) {
          25        doTrim = trim;
          26    }

          27
          28    public boolean getTrim() {
          29        return doTrim;
          30    }

          31
          32    public void validate(Object object) throws ValidationException {
          33        String fieldName = getFieldName();
          34        String val = (String) getFieldValue(fieldName, object);
          35
          36        if (val == null || val.length() <= 0{
          37            // use a required validator for these
          38            return;
          39        }

          40        if (doTrim) {
          41            val = val.trim();
          42            if (val.length() <= 0
          43                // use a required validator
          44                return;
          45            }

          46        }

          47
          48        if ((minLength > -1&& (val.length() < minLength)) {
          49            addFieldError(fieldName, object);
          50        }
           else if ((maxLength > -1&& (val.length() > maxLength)) {
          51            addFieldError(fieldName, object);
          52        }

          53    }

          54}

          55
          注:xml文件里面的兩個minLengthmaxLength對應的怪了中聲明的兩個變量對應,其中xml中的${minLength}${maxLength}就是調用類中的getter方法。
          總結:xml文件中其他屬性,比如required、date等也可以通過以上的方法來分析,就清楚整個校驗框架的原理,使用就很簡單啦。

          PS:現在使用的是field校驗,是field錯誤級別,詳細參考:struts2中action和field級別錯誤處理


          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
          posted on 2008-11-28 22:56 apple0668 閱讀(3734) 評論(2)  編輯  收藏 所屬分類: struts2

          評論:
          # re: 深入struts2中validation校驗框架的原理和使用(一) 2008-12-01 11:13 | 楊愛友
          這個validation干嘛用的?能不能舉個具體例子?  回復  更多評論
            
          # re: 深入struts2中validation校驗框架的原理和使用(一)[未登錄] 2009-01-01 12:06 | apple0668
          validation,主要是在服務器端對數據進行校驗的。  回復  更多評論
            
          主站蜘蛛池模板: 中方县| 达日县| 多伦县| 黎城县| 安徽省| 江口县| 哈巴河县| 海盐县| 古交市| 廊坊市| 西安市| 珠海市| 通河县| 手游| 宜都市| 衢州市| 小金县| 萝北县| 阿图什市| 广州市| 平安县| 铁岭市| 台江县| 广河县| 航空| 禹州市| 筠连县| 抚松县| 万安县| 万年县| 大渡口区| 息烽县| 大姚县| 贵阳市| 上思县| 东平县| 怀远县| 郯城县| 搜索| 洪洞县| 甘南县|