一、什么是校验器(Validator)
在Struts1.x中,校验器能校验客户端提交的数据是否符合要求。如果不符合要求,则会跳转到struts配置文件的“action”标签中“input”属性指定的页面;对于是否进行校验,可以通过“action”标签中的“validate”属性指定,默认为true,即开启校验功能。
二、初识Struts1.x校验功能
前面的《一个简单的Struts程序》已经说过Struts1.x的基本模块如下:
- ActionServlet:Struts框架自带,在web.xml中配置,容器启动时初始化;
- struts配置文件(默认是/WEB-INF/struts-config.xml)
- ActionForm:封装客户端请求数据
- Action:处理业务逻辑,控制页面跳转。
1、从FormBean开始
此处我们先在ActionForm中动手脚,通过继承ActionForm的子类ValidateForm来实现自己的FormBean,通过覆盖validate方法以达到表单校验功能。写完代码后还要在struts配置文件中配置。ActionForm核心代码如下:
package com.struts.form;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.validator.ValidatorForm;
import javax.servlet.http.HttpServletRequest;
/**
* Created by 程序猿 on 2017/5/16 0016.
*/
public class UserForm extends ValidatorForm {
private String account;
private String name;
private int age;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(account == null){
errors.add("message", new ActionMessage("account.error.notnull", "account"));
return errors;
}
if(account.length() < 6){
errors.add("message", new ActionMessage("account.error.min", 6));
return errors;
}
if(account.length() > 9){
errors.add("message", new ActionMessage("account.error.max", 9));
return errors;
}
return super.validate(mapping, request);
}
}
2、properties文件
properties文件存放页面错误的显示信息,里面的数据以“key=value”的形式存在,上述代码中ActionMessage构造函数中的key就与properties文件中的key相对应。properties文件代码如下:
error.account= account is 6-9 number {0}
account.error.notnull={0}is not null
account.error.min=account is larger than {0}
account.error.max = account is letter than {0}
上述代码中的{0}对应ActionMessage构造函数中“Object[] values”属性的第一个Object。接下来就要将properties文件配置进struts的配置文件中(这里的properties文件是validation.properties)。代码如下所示:
<message-resources parameter="validation"></message-resources>
3、在jsp中显示错误信息
现在就到了最后一步,就是将错误信息在jsp文件中显示出来,代码如下:
<%--
Created by IntelliJ IDEA.
User: 程序猿
Date: 2017/5/16 0016
Time: 下午 12:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<html>
<head>
<title>Fail</title>
</head>
<body>
Fail Page<br>
<html:errors></html:errors>
</body>
</html>
效果如下图所示:
在这个校验程序中,需要配置struts配置文件,需要Action程序,这里就不赘述了,详情可以参考《一个简单的Struts程序》。
三、Struts1.x的校验器
我们先从它的默认校验器开始学起,Struts1.x中内置了一些校验功能,在它的核心代码org.apache.struts.validator包中有一个validator-rules.xml文件,里面就定义了很多我们常用的校验器。接下来我们就讲一下如何使用这些校验器。
“工欲善其事必先利其器”,我们先简述一下步骤:
- 首先是可以与上述校验功能重用的文件:properties文件和jsp文件,FormBean也可以重用,为了避免干扰要将validate方法去掉;如果使用动态Form的话,可以将org.apache.struts.validator.DynaValidatorForm配置在struts配置文件的“form-bean”标签中;
- 将validator-rules.xml文件复制到/WEB-INF/文件夹下,并配置struts配置,配置代码如下:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="stopOnFirstError" value="false"></set-property>
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"></set-property>
</plug-in>
- 接下来是最复杂的一步,配置validation.xml文件。说多无益,先放代码:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<formset>
<form name="userForm">
<field property="account" depends="required">
<arg key="${var:account}" name="required" position="0" resource="false"></arg>
<msg key="error.account" name="required"></msg>
<var>
<var-name>account</var-name>
<var-value>account</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
接下来我们解析一下它的含义:
- form标签:name属性对应我们在struts配置文件中配置的form-bean,指定对哪个FormBean进行校验。
- field标签:property指我们对哪个字段进行校验,depends是校验规则,在/WEB-INF/validator-rules.xml(拷贝自:org.apache.struts.validator.validator-rules.xml)中有定义。
- arg标签:传到properties文件中占位符的参数,key是指传过去的值(此处来自var标签),name是校验规则,resource=”false”指的是key中是传到properties中的值,而不是指代properties中的key。
- msg标签:name指校验规则,key指代properties中的key,意思就是在jsp页面中显示properties文件的哪条错误。
- var标签:var-name指的是一个key,即“${var:key}”中的key,var-value是一个值,即\${var:key}所取到的值。
以上,我们就成功地使用了一个Struts1.x内置的校验器,接下来我们自定义一个校验器,实现的还是同一个功能。
四、自定义校验器
1、校验逻辑
首先要搞定的是检验逻辑,一开始我觉得很奇怪,它居然没提供对应的接口来为我们自定义校验器,后来我就自己摸索,查看了org.apache.struts.validator.FieldChecks的代码才尝试自己定义,没想到还成功了。废话少说,代码如下:
package com.struts.validation;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;
import javax.servlet.http.HttpServletRequest;
/**
* Created by 程序猿 on 2017/5/16 0016.
*/
public class UserValidator {
public static boolean validateAccountMin(Object bean, ValidatorAction va, Field field, ActionMessages errors, Validator validator, HttpServletRequest request) {
String account = ValidatorUtils.getValueAsString(bean, field.getProperty());
if(account.length() < 6){
errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field));
return false;
}else {
return true;
}
}
public static boolean validateAccountMax(Object bean, ValidatorAction va, Field field, ActionMessages errors, Validator validator, HttpServletRequest request) {
String account = ValidatorUtils.getValueAsString(bean, field.getProperty());
if(account.length() > 9){
errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field));
return false;
}else {
return true;
}
}
}
2、配置校验规则
在/WEB-INF/validator-rules.xml文件中完成相应配置,代码如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<global>
<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="error.account"/>
<validator name="checkMin"
classname="com.struts.validation.UserValidator"
method="validateAccountMin"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="account.error.min"
/>
<validator name="checkMax"
classname="com.struts.validation.UserValidator"
method="validateAccountMax"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="account.error.max"
/>
</global>
</form-validation>
参数解析:
- name:定义校验器的名字,在接下来引用这个校验器的时候要用到。
- classname:定义了校验器具体校验逻辑的类,里面有一到多个校验方法,可以对不同参数进行校验。
- method:使用哪个方法作为校验逻辑
- msg:指向properties文件中的key,其实和校验文件中的“msg”标签功能相同。
3、配置校验文件
有了校验规则,接下来就是对某些属性运用这些校验规则进行校验,代码如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<formset>
<form name="userForm">
<field property="account" depends="required,checkMin,checkMax">
<arg key="${var:account}" name="required" position="0" resource="false"></arg>
<msg key="account.error.notnull" name="required"></msg>
<arg key="${var:min}" resource="false" position="0" name="checkMin"></arg>
<msg key="account.error.min" name="checkMin"></msg>
<arg key="${var:max}" name="checkMax" position="0" resource="false"></arg>
<msg key="account.error.max" name="checkMax"></msg>
<var>
<var-name>min</var-name>
<var-value>6</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>9</var-value>
</var>
<var>
<var-name>account</var-name>
<var-value>account</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
这里的校验文件和上述校验文件其实差不多,只是对校验字段增加了max和min两个自定义的校验规则。
Struts1.x校验器的介绍就到此结束,好好学习,以此共勉!