一.概述
Struts2框架的输入校验是服务器端的校验。校验方法完全有开发者自己编写,并添加错误提示信息,然后利用Struts2标签库在输入页面中显示出来(result为input所对应的页面,通常仍然是起初的输入页面)。
Struts2框架的输入校验分两大类:
(1)自定义校验(重写核心控制器里的validate()方法)
(2)基于校验框架
校验不通过就需要开发者自己添加错误提示信息,对于错误提示信息来说,Struts2框架有两个级别的错误信息,分别是:Action级别和Field级别,Action级别的错误信息主要针对自定义输入校验的,是开发者自己添加上去的,而Field级别的错误信息是系统的错误信息列表(包含类型转换错误信息和校验框架错误信息)。从中也可以知道,类型转换和输入校验是息息相关的,先进行类型转换,再进行输入校验。注意:如果只针对输入校验来说Action级别错误信息产生于自定义输入校验,Field级别的错误信息产生于校验框架。所以采用哪种校验方法,错误提示就采用哪种方法输出(通过Struts2标签输出)。
1.执行流程:
1)首先进行类型转换
2)然后进行输入校验(自定义校验或基于校验框架)
3)如果在上述过程中出现了任何错误,都不会再去执行execute方法,会转向struts.xml 中该action 的名为input 的result 所对应的页面。
2.Action级别错误信息List<String>:
ActionSupport 类的addActionError()方法的实现:首先创建一个ArrayList 对象,然后将错误消息添加到该ArrayList 对象中。
3.Field级别错误信息Map<String,List<String>>:
FieldError 级别的错误信息底层是用LinkedHashMap 实现的,该Map 的key 是String 类型,value 是List<String>类型,这就表示一个Field Name 可以对应多条错误信息,这些错误信息都放置在List<String>集合当中。
注意:从上面的介绍就应该知道,Action级别的错误信息只会产生于自定义校验,所以类型为List<String>
又因为Field级别的错误信息存放着类型转换的错误信息,如果开发者采用校验框架进行输入校验,那么同一个字段将会有两个错误信息,这也就不难明白,为什么Field界别的错误信息的底层类型是Map<String,List<String>>。
二.关键技术
1.自定义输入校验方法步骤:
(1)重写核心控制器里的validate()方法
(2)编写校验规则,并添加Action界别错误提示信息
(3)在页面采用Struts2标签<s:actionerror/>输出
工程:inputValidation->inputvalidation.jsp
2.基于校验框架的步骤:
(1)在核心控制器同目录建XXX-validation.xml文件。
(2)编写校验规则xml标签(字段优先或校验器优先)
<1>dtd文件目录:xwork-core-xxx.jar-->
xwork-validator-1.0.2.dtd
<2>校验器文件目录:xwork-core-xxx.jar-->
com.opensymphony.xwork2.validator.validators-->
Default.xml
(3)编写国际化校验提示信息
工程:inputValidation->inputvalidationFW.jsp
三.Demo工程
四.疑难解答
五.补充
1.我们知道可以自定义不同请求在核心控制器中执行不同的核心控制方法(例如:myexecute())(注意:多个核心控制方法,每次请求只会有一个核心控制方法被执行,通过在Struts.xml的action给标签中的method属性中指定),这样就可能会出现自定的校验方法(例如:validateMyexcute()),那么如果执行自定义核心控制方法,方法执行顺序为:
validateMyexcute()->validate()->myexecute()
如果执行默认核心控制方法,方法执行顺序为:
validate()->execute()
这说明了,只会有一个核心控制方法被执行,而validate()方法一定会被执行,自定义校验方法只有在调用自定义核心控制方法时才会被执行,而且是最先被执行。