准备工作
1. 登陆页面的表单:
<s:form id="loginForm" name="loginForm" method="post" namespace="/validate" action="validateAction_login.action" theme="simple">
用户名: <s:textfield name="username" /><br>
密 码: <s:textfield name="password" /><br>
年 龄: <s:textfield name="age" /><br>
<s:submit value="login" /><br>
</s:form>
2. 定义校验规则:
用户名不能为null, 或者空字符串;
密码不能为null或者空字符串, 密码中只能包含[0-9a-zA-Z], 不能存在非法字符, 且长度在6-8位之间;
年龄必须为整型, 且不能为负数.
采用基本验证的方式校验表单
1. 创建ValidateAction类, 继承ActionSupport并实现Validateable接口.
private String username;
private String password;
private Integer age;
public String login() {
return "success";
}
@Override
public void validate() {
if (username == null || "".equals(username.trim())) {
this.addFieldError("username", "用户名不能为空");
}
if (password == null || "".equals(password.trim())) {
this.addFieldError("password", "密码不能为空");
} else if (!password.matches("[0-9a-zA-Z]{6, 8}")) {
this.addFieldError("password", "密码的长度应该在6-8位之间");
}
if (age < 0 ) {
this.addFieldError("age", "年龄不能为负数");
}
}
// 省略getter和setter方法
}
validate()方法在业务方法之前执行. 通过查看底层源代码可以获知, this.addFieldError(String fieldName, String errorMessage)方法最终将在ValidationAwareSupport类的fieldErrors成员中添加一条记录 (fieldErrors是一个Map<String, List<String>>集合). validate()方法执行完成之后, 如果fieldErrors集合中不包含错误信息, 表示校验通过, 接下来将执行login方法. 否则表示校验没有通过, 不再执行login()方法.
默认情况下, validate()方法将对所有的业务方法进行验证, 如果只想验证login()方法, 将validate()改名为validateLogin()即可.
2. 配置ValidateAction:
<result name="success">/validate/success.jsp</result>
<result name="input">/validate/login.jsp</result>
</action>
表单校验的执行流程
1. 类型转换器对请求参数执行类型转换, 并把转换后的值赋给action中的属性.
2. 如果在执行类型转换的过程中出现异常, 系统会将异常信息保存到ActionContext, conversionError拦截器将异常信息封装到fieldErrors里, 然后执行第3步. 如果类型转换没有出现异常, 则直接进入第3步.
3. 系统通过反射技术调用action中的validateXxx()方法, Xxx为方法名.
4. 调用action中的validate()方法.
5. 经过上面4步, 如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0), 系统自动将请求转发至名称为input的视图. 如果系统中的fieldErrors没有任何错误信息, 系统将执行action中的业务方法.
基于XML配置方式实现输入校验
1. 创建Action类, 继承ActionSupport或实现Validateable接口:
private String username;
private String password;
private Integer age;
public String login() {
System.out.println("login");
return "success";
}
// 省略getter和setter方法
}
<result name="success">/validate/success.jsp</result>
<result name="input">/validate/loginxml.jsp</result>
</action>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!--
field:表示验证的字段名称, 对应的值是访问的action中的属性. 这里是ValidateXmlAction中的username属性
-->
<field name="username">
<!--
field-validator表示字段校验器, type属性指定使用的校验规则
-->
<field-validator type="requiredstring">
<!-- 调用RequiredStringValidator中setTrim(true) -->
<param name="trim">true</param>
<!-- 给出错误提示信息 -->
<message><![CDATA[用户名不能为空!!!]]></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message><![CDATA[密码不能为空!!!]]></message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^[a-zA-Z0-9]+$]]></param>
<message><![CDATA[密码中不能包含非法字符]]></message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^[a-zA-Z0-9]{6,8}$]]></param>
<message><![CDATA[密码的长度应该在6-8位之间]]></message>
</field-validator>
</field>
<field name="age">
<field-validator type="ageValidate">
<message><![CDATA[年龄不能为负数!!!]]></message>
</field-validator>
</field>
</validators><span style="white-space: normal; background-color: #ffffff;"> </span>
4. 上述xml文件中使用名称为ageValidate的校验规则对age字段进行校验. ageValidate是一个自定义的校验规则.
自定义校验规则首先需要创建一个类, 继承FieldValidatorSupport类:
/**
* @param object: 是Action对象, 其中封装了待验证的字段. 此例中object为ValidateXmlAction对象
*/
public void validate(Object object) throws ValidationException {
// 获取需要验证的字段的名称
String fielsName = this.getFieldName();
// 获取该字段的值
Object value = this.getFieldValue(fielsName, object);
// 判断表单提交的该字段的值是否为整型
if (value instanceof Integer) {
Integer ivalue = (Integer) value;
if (ivalue < 0) {
// 增加错误信息到fieldError集合中
this.addFieldError(fielsName, object);
}
}
}
}
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<!-- 注册自定义的验证器 -->
<validator name="ageValidate" class="cn.xing.validate.AgeValidate"></validator>
</validators>