struts2:数据校验,通过XWork校验框架实现(validation.xml)
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种。服务器端验证目前有两种方式:
第一种:
参考:struts2:数据校验,通过Action中的validate()方法实现校验,图解
第二种:
使用validate()方法校验时,如果Web应用中存在大量Action就需要多次重写validate()方法,这使得代码非常繁琐。由于Struts2的校验框架本质上是基于XWork的validato框架,因此可以使用XWork的validator框架来对Struts2进行数据校验,以减少代码量。本文即讨论此种校验方式。
1. 前台页面加入错误提示标签(registerX.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page isELIgnored="false"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:fielderror/> <s:form action="registerX" method="post"> 账号:<s:textfield name="username"></s:textfield> <br/> 密码:<s:password name="password"></s:password> <br/> 重复密码:<s:password name="repassword"></s:password> <br/> 年龄:<s:textfield name="age"></s:textfield> <br/> 身高:<s:textfield name="height"></s:textfield> <br/> <s:submit value="提交"></s:submit> <br/> </s:form> </body> </html>
2. 后台action继承ActionSupport(RegisterXAction.java)
package com.clzhang.ssh.demo1; import com.opensymphony.xwork2.ActionSupport; public class RegisterXAction extends ActionSupport { public static final long serialVersionUID = 1; private String username; private String password; private String repassword; private Integer age; private Double height; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getHeight() { return height; } public void setHeight(Double height) { this.height = height; } @Override public String execute() { System.out.println(username + "|" + age + "|" + height + " register finished!"); return "register"; } }
3. 增加校验配置文件(RegisterXAction-validation.xml)
3.1 命名规范
校验文件命名规则:ActionName-validation.xml,其中ActionName就是需要校验的action的类名。
如果需要在Action中对某个特定的方法进行校验,则需要为此特定方法专门定义一个校验文件(否则,调用默认的)。该文件命名规则为:actionNme-methodNae-validation.xml;同时,还需要在struts.xml文件配置action时指定其method属性(否则,调用默认的)。
3.2 位置规范
该文件应该与action类的文件位于同一个路径下。
3.3 该文件的定义
参考:struts-2.3.x\lib\xwork-core-2.3.x.jar包中xwork-validator-1.0.x.dtd文件的描述。
3.4 该文件中validator的种类
参考:xwork-core-2.3.x.jar\com\opensymphony\xwork2\validator\validators中的default.xml文件。
3.5 进行数据校验遵循的步骤
- Struts2框架中的类型转换器对HTTP请求的数据进行数据类型转换,得到符合类型的值,比如本例中age被转换为int。
- 使用Struts2的XWork校验框架进行校验,即根据actionName-validation.xml文件和actionName-methodName-validation.xml文件校验数据。
- 调用validateX()方法来进行数据校验。
- 调用validate()方法进行数据校验。
- 如果数据校验发生错误,就会返回名为input的result,进入指定的视图资源而不会调用本该被调用的业务逻辑处理方法。如果数据校验过程中未出现错误,则会调用相应Action中的业务逻辑处理方法。
3.6 配置校验文件的方式
Struts2框架提供了两种方式来配置校验文件,一种是字段校验配置方式;另一种是非字段校验配置方式。
字段校验方式(field-validator)
<!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"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>请输入用户名</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">2</param> <param name="maxLength">16</param> <message>用户名长度在${minLength}到${maxLength}位之间!</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>请输入密码</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[\w{6,12}]]></param> <message>密码必须在6-12位之间,且只能为字母和数字</message> </field-validator> </field> <field name="repassword"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>请输入确认密码</message> </field-validator> <field-validator type="fieldexpression"> <param name="expression"><![CDATA[repassword==password]]></param> <!--这里也可以用repassword.equals(password)//--> <message>两次密码不相等</message> </field-validator> </field> <field name="age"> <field-validator type="required"> <param name="trim">true</param> <message>年龄不能为空!</message> </field-validator> <field-validator type="int"> <param name="min">1</param> <param name="max">60</param> <message>年龄取值范围在${min}到${max}之间</message> </field-validator> </field> <field name="height"> <field-validator type="double"> <param name="min">1.10</param> <param name="max">2.10</param> <message>身高取值范围在${min}到${max}米之间</message> </field-validator> </field> </validators>
非字段校验方式(non-fild validator),下面这个只是个示范,非本例所用。
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- age域 --> <field name="age"> <!--域类型为int--> <field-validator type="int"> <param name="min">10</param> <param name="max">40</param> <message>the age must be from 10 to 40!</message> </field-validator> </field> <!-- name域 --> <field name="name"> <!-- 域类型为requiredstring类型 --> <field-validator type="requiredstring"> <message>the age must be from 10 to 40!</message> </field-validator> </field> </validators>
3.7 校验器简介
- required校验器,要求字段非空;
- requiredstring校验器,要求字段值非空且长度大于0;
- int校验器,表示整数,可以通过min/max参数指定范围;
- date校验器,要求日期,可以通过min/max参数指定范围;
- email校验器,要求电子邮件格式;
- stringlength校验器,通过minLength/maxLength参数指定字段长度范围。
4. 在struts.xml文件中配置错误返回页面地址
<action name="registerX" class="com.clzhang.ssh.demo1.RegisterXAction"> <result name="register">/ssh/demo1/success.jsp</result> <result name="input">/ssh/demo1/registerX.jsp</result> </action>
5. 测试
打开IE,输入地址:http://127.0.0.1:8080/st/ssh/demo1/registerX.jsp
结果如下:
直接提交,结果如下: