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

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方法。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值