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 | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 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。默认值为false
type CDATA #REQUIRED
short-circuit (true|false) "false"
>
<!ELEMENT validator (param*, message)>//元素validator包含零个或多个param、每个param之后必须有一个message属元素(如果有param,必须在message之前)
<!ATTLIST validator
type 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方法。