(二)Struts1.x校验器

来源:互联网 发布:vue.js 如何防止xss 编辑:程序博客网 时间:2024/06/08 19:35

一、什么是校验器(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 nullaccount.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校验器的介绍就到此结束,好好学习,以此共勉!

原创粉丝点击