Struts2学习笔记(六)校验框架

来源:互联网 发布:康奈尔大学学费知乎 编辑:程序博客网 时间:2024/05/22 06:24

Struts2的校验框架,是一个有效的xml文件。

接下来,我们对之前的register.jsp中的输入字段,使用校验框架来进行验证。

定义校验文件

我们在RegisterAction类所在的包下新建一个RegisterAction-validation.xml文件。首先,加载xwork的dtd文件。具体内容如下所示。

<!DOCTYPE validators PUBLIC        "-//Apache Struts//XWork Validator 1.0.2//EN"        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

那我们加载的xwork-validator-1.0.2.dtd文件中都包含什么内容呢?我们具体来分析一下。

dtd文件的语法

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>

声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>

声明出现零次或一次的元素

<!ELEMENT 元素名称 (子元素名称?)>

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

以下是属性类型的选项:

类型描述CDATA值为字符数据 (character data)(en1|en2|..)此值是枚举列表中的一个值ID值为唯一的 idIDREF值为另外一个元素的 idIDREFS值为其他 id 的列表NMTOKEN值为合法的 XML 名称NMTOKENS值为合法的 XML 名称的列表ENTITY值是一个实体ENTITIES值是一个实体列表NOTATION此值是符号的名称xml:值是一个预定义的 XML 值

默认值参数可使用下列值:

值解释值属性的默认值#REQUIRED属性值是必需的#IMPLIED属性不是必需的#FIXED value属性值是固定的

详细内容见:http://www.w3school.com.cn/dtd/index.asp

xwork-validator-1.0.2.dtd内容分析

<?xml version="1.0" encoding="UTF-8"?><!--  XWork Validators DTD.  Used the following DOCTYPE.    <!DOCTYPE validators PUBLIC   "-//Apache Struts//XWork Validator 1.0.2//EN"  "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">--><!ELEMENT validators (field|validator)+>//元素validators中可以包含一到多个field或validator元素<!ELEMENT field (field-validator+)>//field中至少包含一个field-validator元素<!ATTLIST field                    //field属性name是必须的,类型是字符串name CDATA #REQUIRED><!ELEMENT field-validator (param*, message)>//元素field-validator包含零个或多个param、每个param之后必须有一个message属元素(如果有param,必须在message之前)<!ATTLIST field-validator    //field-validator有两个属性值,第一个是type必须存在,第二个属性是short-circuit,值为true或者false。默认值为falsetype CDATA #REQUIRED    short-circuit (true|false) "false"><!ELEMENT validator (param*, message)>//元素validator包含零个或多个param、每个param之后必须有一个message属元素(如果有param,必须在message之前)<!ATTLIST validatortype CDATA #REQUIRED          //同上    short-circuit (true|false) "false"><!ELEMENT param (#PCDATA)>   //表示只有 PCDATA 的元素,PCDATA表示会被解析的字符,比如param代表年龄,<param name='age'>18</param>那么这个18会被解析为整型<!ATTLIST param    name CDATA #REQUIRED   //param中的属性name必须存在,且是字符型><!ELEMENT message (#PCDATA)> <!ATTLIST message   //message中有key属性,可选,key代表国际化信息的表示。    key CDATA #IMPLIED>

分析完dtd文件,我们就清楚了xml文件中为什么要这样写。通过对validator.dtd文件的分析。我们看到校验框架可能存在的两种情况

<!ELEMENT validators (field|validator)+>

一种是字段优先校验

另一种是校验器优先校验

1、字段优先校验

在xml文件配置完成校验,最根本的还是通过配置获得的参数进行代码校验,而代码校验就封装在xwork2.validator.validators的包下。


通过学习default.xml文件,我们可以了解到type有哪些对应的值,分别用于什么样的校验,对应的校验是由哪个类来实现的。而param所对应的值则来源于这些类。


效验RegisterAction-validator.xml文件内容如下所示:

校验的功能如下:

1、username字符在4和6之间

2、password字符在4和6之间

3、repassword等于password

4、age在10和50之间

5、birthday在2000-1-1和2015-1-1之间

5、graduate日期在birthday之后

<!DOCTYPE validators PUBLIC        "-//Apache Struts//XWork Validator 1.0.2//EN"        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"><validators><field name="username"><!-- name属性值对应的是需要校验RegisterAction的变量名 --><field-validator type="requiredstring"><!--对username进行何种校验 --><message>username can't be blank</message><!-- 当校验失败时,需要给用户提供什么样的错误提示 --></field-validator><field-validator type="stringlength"><!--字符长度校验 --><param name="minLength">4</param><param name="maxLength">6</param><message>length should be between ${minLength} and ${maxLength}</message></field-validator></field><field name="password"><field-validator type="requiredstring"><!--对username进行何种校验 --><message>password can't be blank</message><!-- 当校验失败时,需要给用户提供什么样的错误提示 --></field-validator><field-validator type="stringlength"><!--字符长度校验 --><param name="minLength">4</param><param name="maxLength">6</param><message>length should be between ${minLength} and ${maxLength}</message></field-validator></field><field name="repassword"><field-validator type="requiredstring"><message>param can't be blank</message></field-validator><field-validator type="fieldexpression"><param name="expression"><![CDATA[(repassword==password)]]></param><message>password should be equal to repassword</message></field-validator></field><field name="age"><field-validator type="required"><message>age can't be blank</message></field-validator><field-validator type="int"><param name="min">10</param><param name="max">50</param><message>age should be between ${min} and ${max}</message></field-validator></field><field name="birthday"><field-validator type="required"><message>birthday can't be blank</message></field-validator><field-validator type="date"><param name="min">2000-1-1</param><param name="max">2015-1-1</param><message>birthday should be between ${min} and ${max}</message></field-validator></field><field name="graduate"><field-validator type="required"><message>graduate can't be blank</message></field-validator><field-validator type="date"><param name="min">2000-1-1</param><param name="max">2015-1-1</param><message>graduate should be between ${min} and ${max}</message></field-validator><field-validator type="fieldexpression"><param name="expression"><![CDATA[(graduate>birthday)]]></param><message>graduate should be after birthday </message></field-validator></field></validators>

2、校验器效验

<validators><validator type="requiredstring"><param name="fieldName">username</param><message>username can't be blank</message></validator><validator type="stringlength"><param name="fieldName">username</param><param name="minLength">4</param><param name="maxLength">6</param><message>username should be between 4 and 6</message></validator><validator type="requiedstring"><param name="fieldName">password</param><message>password can't be blank</message></validator><validator type="stringlength"><param name="fieldName">password</param><param name="mixLength">4</param><param name="maxLength">6</param><message>password should be between 4 and 6</message></validator></validators>

校验执行的先后顺序:

1)首先执行校验框架

2)然后执行自定义的校验框架(validateMyExecute)

3)执行action类中validate方法。


1 0