Struts2的输入验证(一)-声明式验证之字段验证
一、概述
Struts2 的输入验证分为两种方式:
1)基于 XWork Validation Framework 的声明式验证:Struts2 提供了一些基于 XWork Validation Framework 的内建验证程序,使用这些验证程序不需要编程,只要在一个 XML 文件里对验证程序应该如何工作作出声明就可以了。需要声明的内容包括:
>对哪个 Action 或 Model 的那个字段进行验证;
>使用什么验证规则;
>在验证失败时应该把什么样的出错消息发送到浏览器端。
2)编程式验证:通过编写代码来验证用户输入。
其中声明式验证程序可以分为两类:
2)非字段验证:不只针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。例如:对再次输入密码的判断。
二、声明式验证的HelloWord
1、示例一:字段验证
1)JSP页面主要代码(JSP页面名称为:validation.jsp)如下:
1 <!-- 要求年龄必须在 20-60 之间 --> 2 <s:form action="testValidation" theme="simple"> 3 Age: <s:textfield name="age" label="Age"></s:textfield> 4 ${fieldErrors.age[0] } 5 <s:fielderror fieldName="age"></s:fielderror> 6 <s:submit></s:submit> 7 </s:form>
2)Action类的代码如下:
1 package com.atguigu.struts2.validation.app; 2 import com.opensymphony.xwork2.ActionSupport; 3 public class TestValidationAction extends ActionSupport { 4 private Integer age; 5 public Integer getAge() { 6 return age; 7 } 8 public void setAge(Integer age) { 9 this.age = age; 10 } 11 public String execute() throws Exception { 12 System.out.println("age: " + age); 13 return SUCCESS; 14 } 15 }
3)struts.xml中的基本配置如下:
<action name="testValidation" class="com.atguigu.struts2.validation.app.TestValidationAction"> <result>/success.jsp</result> <!-- 若验证失败转向的 input --> <result name="input">/validation.jsp</result> </action>
4)★★★编写验证程序配置文件,其名称为:TestValidationAction-validation.xml,配置内容如下:
<validators> <!-- 针对 age 属性进行验证. 基于字段的验证 --> <field name="age"> <field-validator type="int"> <param name="min">20</param> <param name="max">60</param> <message>Age needs to be between ${min} and ${max}</message> </field-validator> </field> </validators>
在Tomcat中部署后的运行结果如下图:
(由于在JSP页面中分别使用了EL表达式 ${fieldErrors.age[0] }和标签 <s:fielderror fieldName="age"></s:fielderror>输出验证失败的消息,因此会有两个提示信息。):
2、HelloWord总结
1)使用一个声明式验证程序的步骤★★★
Ⅰ. 先明确对哪一个 Action 的哪一个字段进行验证: age
Ⅱ. 编写一个验证程序配置文件。
> 把 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>
图解:
Ⅲ. 确定验证失败时的响应页面:若验证失败,则转向 name=input 的那个 result,所以需要配置在 struts.xml 文件中定义一个 <result name=“input”> 的元素。
2)验证错误错误消息可以国际化吗?
可以,方法如下:
Ⅰ. 将验证程序配置文件中的<message>节点中添加key属性:<message key="error.int"></message>;
Ⅱ. 再在国际化资源文件中加入一个键值对:error.int=Age needs to be between ${min} and ${max} 。
3)如何显示错误消息呢 ?
> 若使用的是非simple主题,则自动显示错误消息。
> 若使用的是simple 主题,则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)。
${fieldErrors.age[0] } OR <s:fielderror fieldName="age"></s:fielderror>
三、若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?
1、示例:
要求:同一个Action类响应两个action请求,每个action请求都对age字段进行验证,但是age的范围不一样。
1)JSP页面一个与HelloWord中的相同,另一个的form的action路径改为:testValidation2。
2)Action代码与HelloWord中相同。
3)struts.xml配置文件中添加一个action节点,其name属性值为:testValidation2,其它与HelloWord中testValidation相同。
4)★★★编写验证程序配置文件:为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml,因此,两个action请求对应的文件名分别为:TestValidationAction-testValidation-validation.xml 和 TestValidationAction-testValidation2-validation.xml。
5)配置文件的内容:
>TestValidationAction-testValidation-validation.xml的内容与HelloWorld中的相同(修改为国际化后的格式);
>TestValidationAction-testValidation2-validation.xml的内容中要求age的范围是“1~130”。
<validators> <!-- 针对 age 属性进行验证. 基于字段的验证 --> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">130</param> <message key="error.int"></message><!--对验证失败消息进行国际化处理--> </field-validator> </field> </validators>
因此部署后运行,当验证失败时,两个action分别对应各自的提示消息。
2、总结:验证程序配置文件的格式★★★
验证程序配置文件的文件名必须是以下两种格式之一:
>若一个 Action 类的多个 action 请求使用同样的验证规则: ActionClassName-validation.xml
>若一个 Action 类的多个 action 请求使用不同的验证规则: ActionClassName-alias-validation.xml, 例如 UserAction-User_create-validation.xml
注意:不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用。 可以把各个 action 公有的验证规则配置在其中,但需要注意的是,只适用于某一个 action 的请求的验证规则就不要在这里配置了。