(二)Struts1.x校验器

本文介绍Struts1.x中的表单验证功能,包括校验器的基本概念、使用内置校验器的方法以及如何自定义校验器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值