1. Struts2 的输入验证:
1.1 基于 XWork Validation Framework 的声明式验证:
Struts2 提供了一些基于 XWork Validation Framework 的内建验证程序。
使用这些验证程序不需要编程, 只要在一个 XML 文件里对验证程序应该如何工作作出声明就可以了.
需要声明的内容包括:
>哪些字段需要进行验证
>使用什么验证规则
>在验证失败时应该把什么样的出错消息发送到浏览器端
1.2 编程验证:通过编写代码来验证用户输入
2.声明式验证的详细介绍:
2.1 先明确对哪一个 Action 的哪一个字段进行验证: age
2.2 编写配置文件:
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件复制到
当前 Action 所在的包下.
> 把该配置文件改为: 把 Login 改为当前 Action 的名字.
> 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.
> 在配置文件中可以定义错误消息:
<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>
2.3 若验证失败, 则转向 input 的那个 result. 所以需要配置 name=input 的 result
<action name="testValidation" class="com.lishenhuan.Action.ValidationAction">
<result>/success.jsp</result>
<result name="input">/Validation.jsp</result>
</action>
2.4 如何显示错误消息:
> 若使用的是非 simple, 则自动显示错误消息.
> 若使用的是 simple 主题, 则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)
s:fielderror 标签:
<s:fielderror fieldName="age"></s:fielderror>
EL 表达式(使用 OGNL): ${fieldErrors.age[0] }
2.5 注意: 若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则:
> 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml
> 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用.
可以把各个 action 公有的验证规则 配置在其中.
但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了.
<action name="testValidation" class="com.lishenhuan.Action.ValidationAction">
<result>/success.jsp</result>
<result name="input">/Validation.jsp</result>
</action>
<action name="testValidation2" class="com.lishenhuan.Action.ValidationAction">
<result>/success.jsp</result>
<result name="input">/Validation.jsp</result>
</action>
2.6 声名式验证框架的原理:
> Struts2 默认的拦截器栈中提供了一个 validation 拦截器:struts-defult.xml文件中。
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
>每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了.
而实际上验证的是那个验证器.该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
<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>
配置文件和验证器属性之间的对应关系:
2.7 Struts2 内建的验证程序
2.7.1 conversion: 检查对给定 Action 属性进行的类型转换是否会导致一个转换错误.
该验证程序还可以在默认的类型转换消息的基础上添加一条自定义的消息.
<field-validator type="conversion">
<message>Conversion Error Occurred</message>
</field-validator>
2.7.2 date : 确保某给定日期字段的值落在一个给定的范围内
–max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
–min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
2.7.3 email: 检查给定 String 值是否是一个合法的 email
.....................................................................................
2.8 短路验证器:<validator …/> 元素和 <field-validator …/> 元素可以指定一个可选的 short-circuit 属性,
该属性指定该验证器是否是短验证器,默认值为 false。
对同一个字段内的多个验证器,如果一个短路验证器验证失败,其他验证器不会继续校验
short-circuit默认是false设置true后,此验证器即为短路验证器,失败后不会执行下面的验证。
<field name="age">
<field-validator type="int" short-circuit="true">
<param name="min">20</param>
<param name="max">50</param>
<message>Age needs to be between ${min} and ${max}</message>
</field-validator>
<field-validator type="conversion">
<message>Conversion Error Occurred</message>
</field-validator>
</field>
2.9 非字段验证: 不是针对于某一个字段的验证.
<validator type="expression">
<param name="expression"><![CDATA[password1==password2]]></param>
<message>Password is not equals to password2</message>
</validator>
显示非字段验证的错误消息, 使用 s:actionerror 标签: <s:actionerror/>
jsp文件
<s:debug></s:debug>
<s:actionerror/>
<s:form action="testValidation" >
<s:textfield name="age" label="Age"></s:textfield>
<s:password name="password1" label="Password1"></s:password>
<s:password name="password2" label="Password2"></s:password>
<s:submit></s:submit>
</s:form>
2.10 多个字段使用相同的验证信息,使用同一条响应消息。
jsp页面:age 和 count...多个字段使用相同的验证器。(int)
<field name="age">
<field-validator type="int" >
<param name="min">20</param>
<param name="max">50</param>
<message>${fieldName} needs to be between ${min} and ${max}</message>
</field-validator>
</field>
<field name="count">
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message>${fieldName} needs to be between ${min} and ${max}</message>
</field-validator>
</field>
可以通过 ${fieldName} needs to be between ${min} and ${max} 方法公用一条响应信息。
原理: