(二)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校验器的介绍就到此结束,好好学习,以此共勉!
- (二)Struts1.x校验器
- Struts1.x(二)
- struts1.x初来乍到(二)
- Struts1.x环境搭建(二)
- Struts1.x(一)
- Struts1.x(三)
- Struts1.X校验validator,并国际化资源文件message
- Struts1.x教程(二) Struts进阶使用
- Struts1.x 总结 (转)
- struts1.x
- Struts1.x
- Struts1.x
- Struts1的校验方式
- Struts2校验器(二)之注解
- Validation校验(二)
- Struts1.x系列教程(13):国际化
- Struts1.x 总结(很全面)
- FreeMarker技巧(与Struts1.X)
- scrapy newspaper bug
- UIButton的titleEdgeInsets和imageEdgeInsets属性
- Unity使用shareSDK做微信登录时无法实现的解决办法
- cad导入max线是错位的
- 常用css初始化样式(淘宝)
- (二)Struts1.x校验器
- hive -- stddev , stddev_pop , stddev_samp , var_pop , var_samp(计算方差标准差等)
- 超文本打印编辑工具TRichView V16.15发布 | 附下载
- 构建高可用分布式Key-Value存储服务
- 现代信号处理总结(进行中)
- UNIX再学习 -- 守护进程(转)
- SLA常用追溯子模块SQL
- 软raid创建
- 正在改变的程序员的习惯