一、没有使用框架情况下,在目标方法处,通过手动的编写代码来进行验证
二、Struts2
1.支持声明式验证,即通过配置的方式来验证。需要实现接口 ValidationAware,依赖于两个拦截器 validation 和 workflow 拦截器。
validation 拦截器:进行验证和创建字段错误列表
workflow 拦截器:检查 validation 拦截器发现的错误,如果发现,返回 "input"(默认)result。
如果没有指定 name=input 对应的 result ,则返回一个错误消息告诉我们 "there's no "input" result defined for the action"。
2. Struts2 默认的验证器
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/> </validators>
3.验证规则配置文件
(1)位置:在需要验证的 Action 同包下。
(2)当前 Action 类所有 action 使用同样的验证规则:Action简单类名-validation.xml
(3)当前 Action 类某个 action 使用具体的验证规则:Action简单类名-ActionName-validation.xml
4. 验证分类
(1)字段验证(Field Validator Syntax)
e1:验证 myPurchaseCode 字段长度必须为10
<validators> <field name="myPurchaseCode"> <field-validator type="stringlength"> <param name="minLength">10</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>Your purchase code needs to be 10 characters long</message> </field-validator> </field> </validators>
e1:验证 age 必须在 20 到 50 之间
<validators> <field name="age"> <field-validator type="int"> <param name="min">20</param> <param name="max">50</param> <message>Age needs to be between ${min} and ${max}</message> </field-validator> </field> </validators>
(2)类型验证(Plain Validator Syntax)
e1:验证 myPurchaseCode 字段长度必须为10:
<validators> <validator type="stringlength"> <param name="fieldName">myPurchaseCode</param> <param name="minLength">10</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>Your purchase code needs to be 10 characters long</message> </validator> </validators>
e2:验证 age 必须在 20 到 50 之间
<validators> <validator type="int"> <param name="fieldName">age</param> <param name="min">20</param> <param name="max">50</param> <message>Age needs to be between ${min} and ${max}</message> </validator> </validators>
(3)表达式验证
e:判断密码和确认密码输入是否一致
<validators> <validator type="expression"> <param name="expression"><![CDATA[pwd==pwdConfirm]]></param> <message>密码和确认密码不一致</message> </validator> </validators>
其中:<param name="expression"> 标签体中的内容会自动进行 OGNL 解析。
5.短路验证:
对于同一个字段进行多个规则验证,如果第一个验证没有通过,则后续的规则不进行验证。
只需要在 validator 或 field-validator 标签内加入 short-circuit 属性并设置为 true 即可。
如:

<validators> <field name="email"> <field-validator type="stringlength" short-circuit="true"> <param name="minLength">4</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>email length must between ${minLength} and ${maxLength}</message> </field-validator> <field-validator type="email"> <message>Must provide a valid email</message> </field-validator> </field> </validators>
6.类型转换失败提示与验证出错提示消息
struts2 默认的拦截器栈为 defaultStack,规定了 conversionError 拦截器在 validation 拦截器之前执行。但是 conversionError 拦截器拦截到类型转换出错的消息,并不会返回 "input",而是继续让proxy调用后续的拦截器。
这里的源码我们不能进行更改,但是我们可以仿造一个,类的加载顺序是采取的就近原则。所以我们在项目的 src 目录下,新建与 conversionError 拦截器对应的目录结构,然后修改 conversionError 拦截器代码。
7.对 Action 类的要求
要验证的字段,必须提供 getXxx() 和 setXxx() 方法,getXxx() 方法用于 validate 拦截器进行比较验证。
8.一个简单的例子:

<s:form action="/validateNum"> <s:textfield name="age" label="age"/> <s:submit label="submit"/> </s:form>

<!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="age"> <field-validator type="int"> <param name="min">20</param> <param name="max">50</param> <message>Age needs to be between ${min} and ${max}</message> </field-validator> </field> </validators>

<struts> <package name="default" namespace="/" extends="struts-default"> <action name="validateNum" class="com.nucsoft.struts.ValidateAction"> <result>/success.jsp</result> <result name="input">/index.jsp</result> </action> </struts>
9.自定义验证器
(1)普通的验证器继承 ValidatorSupport 类,字段验证程序继承 FieldValidatorSupport。如需要提供参数,提供 setXxx() 方法,如错误消息要获取验证器类中的属性,提供对应的 getXxx() 方法。
(2)注册验证器类:在类路径根目录下新建 validators.xml ,内容可以参考 default.xml 文件里的配置信息。(验证框架首先在根目录下查找validators.xml文件,找不到则调用默认的验证设置)
(3)正常使用
10.编程式验证:
Struts2提供了一个 Validateable 接口,Action 类可以实现这个接口中的 validate() 方法,在其中编写验证逻辑。ActionSupport 类已经实现了 Validateable 接口。
未完,待续