为了和前台基于JavaScript的开源验证框架RapidValidation使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便.

https://blog.csdn.net/autojoke/article/details/5192534

本框架依赖于:

Struts 2

Java 5或者更高版本

GET/POST协议(支持带文件上传的表单, 依赖于Commons-Upload组件)

整合步骤
1. 将文件struts2-quickvalidation-plugin-1.0.jar 放入WEB-INF/lib目录下;

2. 修改您自己的代码的src/struts.xml中的package定义继承自quickValidation;

示例代码:

3. 使用注解加入验证规则表达式;

在每个需要调用的Action的入口方法处, 加入@FormValidator 注解.

注解的完整语法如下:

@common.validation.FormValidator(input="出错时需要返回的result别名", enabled=true/false , value="表单参数名称1,表单参数中文提示信息1,规则1 规则2…; 表单参数名称2,表单参数中文提示信息2,规则1 规则2…;更多字段验证信息")

input 参数: 可选 . 如果不指定, 则出错时仍然继续进入到Action方法中; 如果指定, 则在表单验证出错时, 返回到给定的result中, 例如: 原始表单输入页面或者统一的错误输出页面;

enabled 参数: 可选 . 是否启用此验证规则, 如果不指定, 则忽略解析注解, 不进行任何验证;

value 参数: 必填选项 , 可输入一个或者多个表单参数验证规则. 简单说就是: [字段1验证配置];[字段2验证配置];…. 虽然不建议, 然而字段验证配置可以留空, 此时不会进行任何验证处理.

而每个验证配置 的格式如下:

表单参数名称: 必填选项 . 指向输入的表单控件的名称(input的name);

表单参数中文提示信息: 可选 . 如果为空, 则和表单参数名称相同. 不为空时, 则显示在出错时的信息提示的开头位置;

规则1 规则2…: 可选. 理论上可加入任意多个验证规则, 以单个空格 隔开. 在验证开始后, 依次进行每个规则的验证并加入提示信息. 需要注意的是, 除required规则之外的所有规则只有当用户输入的字段值非空时, 才进行有效性验证, 如此便可避免所有字段都成为必填字段的问题发生.

每个规则 本身则由两部分组成: 规则名-规则子名-参数1-参数2-参数3-….

规则名和规则子名是固定名称, 不能任意填写, 这两个名称对应一个具体的规则实现类.

其中参数 是必填选项 , 参数的意义则需要参考下一节的验证规则表达式 中的说明. 下面举例说明若干验证规则:

required 这是特殊规则, 不带规则子名;

float-range-1-20 其中float-range分别是规则名和规则子名, 而1和20则分别是两个参数.

特别需要注意的是有负数时的情况此时参数列表变为: float-range--1 --20, 此时参数值分别为-1和-20.

如果需要给另一字段加入验证规则, 则以分号 隔开.

下面是若干验证的示例及其解释:

规则

解释

@FormValidator

空的验证规则, 不进行任何操作

@FormValidator("username,用户名,required min-length-5")

对username字段进行验证, 规则为 必填, 最小长度为5; 出错时分别提示:

用户名不能为空

用户名的长度不能小于5, 当前长度为1.

由于没有指定input参数, 所以当验证失败时, 仍然会继续进入到业务逻辑处理, 相关的错误信息则存入request的attribute中.

@FormValidator("username, ,required min-length-5")

由于没有指定字段的中文提示, 因此出错时将提示:

username的长度不能小于5, 当前长度为1.

@FormValidator(input="index" ,value=" username,用户名,required min-length-5”)

这大概是最常用格式的验证规则的写法了. 此例和上例的区别为: 所以当验证失败时, 将进入input参数所指定的出错信息显示页面.

@FormValidator(input="index",enabled=false, value=" username,用户名,required min-length-5”)

忽略所有验证规则处理, 常用于调试阶段.

@FormValidator(input="index",value=" username,用户名,required min-length-5;password2,重复密码 ,required equals-password-原始密码 ;”)

此规则加入了对重复密码字段的验证, 出错时将提示:

重复密码 和原始密码 的输入不一致

@FormValidator(input="index",value="username,用户名,required min-length-5;password2,重复密码 ,required equals-password;”)

此规则省略了另一字段的中文描述, 出错时将提示:

重复密码 和前面 的输入不一致

以下为一个完整的Action类示例代码:

4. 修改前台显示验证结果.

根据Action的不同, 前台的显示划分为两类:

普通的错误显示:

所有错误信息: ${validationErrors}

返回的内容是一个字符串, 显示了所有的出错信息, 而出错字体的颜色则需要用户自己去设置.

出错信息的显示格式是以<br>分开的, 例如:

用户名不能为空<br>密码不能为空<br>重复密码不能为空<br>性别必须至少选中一项<br>

另一种推荐的做法是让Action继承自Struts2中的ActionSupport, 此时则可用Struts 2的标签来显示出错信息, 可定位到具体的字段:

或者使用纯JSP来编写页面来定位到单条错误:

用户名: <input name=username value=${param.username}> ${errors.username[0]}

下面给出这两种写法的完整示例:

<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<mce:style><!--
.errorMessage {color:red;}
.errorLabel {font-weight:bold}
--></mce:style><style mce_bogus="1">.errorMessage {color:red;}
.errorLabel {font-weight:bold}</style>
<title>测试页面</title>
</head>
<body>
<s:actionerror />
<form action="helloworld.action" method=post enctype="multipart/form-data">
用户名: <input name=username value=${param.username}> ${errors.username[0]} <br>
年龄: <input name=age value=${param.age}><br>
密码: <input name=password><br>
密码重复: <input name=password2><br>
邮件: <input name=email><br>
性别: <input type=checkbox name=a>男 <input type=checkbox name=a>女<br>
IP地址: <input name=ip><br>
数字1: <input name=num1> 数字2: <input name=num2> <br>
日期:<input name=date><br>
附件: <input name=file type=file><br>
<input type=submit value="提交">
</form>
<span class="errorMessage">
${validationErrors}
</span>
Struts 2表单标签示例:
<s:fielderror/>
<s:form action="helloworld.action" method="post">
<s:textfield name="username" label="用户名" />
<s:password name="password" label="密码" />
<s:submit/>
</s:form>
</body>
</html>

验证规则表达式详解
说明: 加红色背景的部分是目前尚不支持的验证规则; 加黄色背景的是增加了第二个可选参数的规则.

验证表达式

描述

示例

required

非空域,全部空格也算空

validate-number

一个有效数

validate-digits

只能包含0-9任意个数字

validate-alpha

只能是字母a-z, A-Z

validate-alphanum

只能是字母和数字的组合

validate-email

只能是有效的email

validate-url

只能是有效的url地址

validate-one-required

至少有一个被选中,例如一组checkbox, radiobutton,它们最好包含在一个div和span中

validate-integer

只能是整数,可以有正负号

validate-ip

有效的IP地址

min-length-$number

最小长度是$number ( 此处$some表示一个特定的值)

最小长度为8: min-length-8

max-length-$number

最大长度是$number

最大长度为8: max-length-8

max-value-$number

输入域的最大值是$number

最大值为8.1: max-value-8.1

min-value-$number

输入域的最小值是$number

最大值为-8.1: max-value--8.1

equals-$otherInputId-$otherInputLabel

必须和某个input field相等,用于密码两次输入验证等,$otherInputLabel是可选项,用来描述另一字段信息

equals-password

重复密码和原始密码输入不一致:

equals-password-原始密码

less-than-$otherInputId-$otherInputLabel

小于某个input field less-than-otherInputId,多用于结束日期不能小于开始日期的需求,$otherInputLabel是可选项,用来描述另一字段信息

注:相等时也不能通过

great-than-$otherInputId-$otherInputLabel

大于某个input field less-than-otherInputId,$otherInputLabel是可选项,用来描述另一字段信息

validate-date-$dateFormat

只能是日期,$dateFormat为日期格式,$dateFormat的可选,默认格式为yyyy-MM-DD

validate-date-yyyy年MM月dd日

validate-file-$type1-$type2-$typeX

验证文件输入域选择的文件类型只能为声明的$type1 – $typeX中的一种

validate-file-png-jpeg

float-range-$minValue-$maxValue

必须是$minValue到$maxValue的一个浮点数

1至20: float-range-1-20

int-range-$minValue-$maxValue

必须是$minValue到$maxValue的一个整数

length-range-$minLength-$maxLength

输入字符串的长度必须在$minLength到$maxLength之间

validate-pattern-$RegExp

通过自定义正则表达式$RegExp来验证输入域的正确性

vaidate-pattern-/a/gi

validate-chinese

只能是中文(以下为中国的相关验证)

validate-phone

有效的电话

validate-mobile-phone

有效的手机号

validate-id-number

验证是否有效的身份证号码

validate-zip

验证邮政编码

validate-qq

验证QQ号码

和RapidValidation 配合实现前后台一致验证
RapidValidation是专注于前台的验证框架, 例如下面的例子:

<!-- 为form增加required-validate class,标识需要验证form -->
<form id='helloworld' action="#" class='required-validate'>
helloworld:</br>
<!--通过class添加验证: required表示不能为空,min-length-15表示最小长度为15 -->
<textarea name='content' class='required min-length-15'>

其对应的后台验证规则为:

@FormValidator(input="index" ,value=" content ,helloworld ,required min-length-15 ”)

请注意比较异同, 不同部分已经以红色粗体 进行了区分, 相同部分则以绿色粗体 标识.

大家可以看到, 两者很容易就实现了一致的前后台验证规则.

如何扩展验证规则?
要扩展验证只需要实现IValidator即可即可, 并将实现类放入包 common.quickvalid.validators 下. 下面是IValidator 接口定义:

package common.quickvalid.validators;
import java.util.Map;
/**
* 验证器接口.
* @author beansoft
* 日期: 2009-12-20
*/
public interface IValidator {
/**
* 实现验证方法.
* @param fieldName 字段name
* @param fieldDescription 出错时的字段描述信息
* @param params 参数列表 <String key, String[] values> 表单参数Map
* @param args 参数列表
* @return 验证信息, 为空时表示没有任何出错信息, 通过验证
*/
public String doValidation(String fieldName, String fieldDescription, Map<String, String[]> params, String... args) ;
public String[] getArgs();
/**
* 设置参数列表
* @param args
*/
public void setArgs(String[] args);
public String getExpression();
/**
* 设置原始表达式, 用于日期, 正则等验证方式, 避免和 - 号冲突.
* @param Expression
*/
public void setExpression(String expression);
}

类名有一定规则, 将第一个减号替换为下划线即可, 例如:

length-range-$minLength-$maxLength 对应的类名是: length_range .

下面则给出一个实现类, 供参考:

package common.quickvalid.validators;
import java.util.Map;
/**
* 单个表单域验证
*
* 非空域时才进行字符串验证.
* 最大长度验证
* @author beansoft
*
*/
public class max_length implements IValidator {
public String doValidation(String fieldName, String fieldDescription,
Map<String, String[]> params, String... args) {
super.setParams(params);
String value = params.getValue(fieldName)[0];
int length = 0;
try {
length = Integer.parseInt(args[0]);
} catch(Exception ex) {}
if(value != null && value.length() > 0 && value.trim().length() > 0) {
if(value.trim().length() > length) {
return fieldDescription + "的长度不能大于" + length + ", 当前长度为" + value.trim().length();
}
}
return null;
}
/**
忽略getter和setter,和普通Java类无区别.
getXx();
setXxx();
*/
}

Struts2快速后台验证 使用的更多相关文章

  1. (5)表单Action后台验证

    /day31/src/cn/itcast/web/struts2/user/UserAction.java package cn.itcast.web.struts2.user; import com ...

  2. (转)Struts2快速入门

    http://blog.csdn.net/yerenyuan_pku/article/details/66187307 Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架, ...

  3. 【转】Struts2 表单验证与验证框架

    版权声明:好笔头不如烂记性 https://blog.csdn.net/zsbgood/article/details/81114038 表单数据验证是很常见的功能,通常前端页面会有一次 js验证,但 ...

  4. SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码

    在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...

  5. ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证

    ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...

  6. Struts2的输入验证

    一.概述: ① Struts2的输入验证 –基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于 XWork Validation Framework的内 ...

  7. c#后台验证

    #region 后台验证 panda /// 验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System. ...

  8. (转)jquery.validate.js 的 remote 后台验证

    之前已经有一篇关于jquery.validate.js验证的文章,还不太理解的可以先看看:jQuery Validate 表单验证(这篇文章只是介绍了一下如何实现前台验证,并没有涉及后台验证remot ...

  9. 表单数据验证方法(二)——ASP.NET后台验证

    昨天写了一下关于如何在前台快捷实现表单数据验证的方法,今天接着昨天的,把后台实现数据验证的方法记录一下.先说明一下哈,我用的是asp.net,所以后台验证方法也是基于.net mvc来做的. 好了,闲 ...

随机推荐

  1. 兵器簿之cocoaPods的安装和使用

    以前添加第三方库的时候总是直接去Github下载然后引入,但是如果这些第三方库发生了更新,我们还需要手动去更新项目,所以现在引入之前一直想弄都一直没有弄的cocoaPods,现在演示一把过程 其实非常 ...

  2. Spark2 加载保存文件,数据文件转换成数据框dataframe

    hadoop fs -put /home/wangxiao/data/ml/Affairs.csv /datafile/wangxiao/ hadoop fs -ls -R /datafiledrwx ...

  3. 基于Spring-Boot框架的Elasticsearch搜索服务器配置

    一.相关包maven配置 <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elastic ...

  4. 分享10款效果惊艳的HTML5图片特效【转】

    先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...

  5. CentOS7.5搭建Solr7.4.0单机服务

    一.Solr安装环境 1.官方参考文档 Solr教程参考指南:http://lucene.apache.org/solr/guide/7_4/solr-tutorial.html 2.Solr运行环境 ...

  6. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

  7. 安装coreseek与sphinx遇见的问题

    1.问题 using config file 'etc/csft.conf'...indexing index 'xml'...WARNING: source 'xml': xmlpipe2 supp ...

  8. mysql 数据库简介

    1. 什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文 ...

  9. GUID Partition Table (GPT)

    https://en.wikipedia.org/wiki/GUID_Partition_Table https://zh.wikipedia.org/wiki/全局唯一标识分区表 GUID Part ...

  10. 借用HTML5 插入视频。音频

    HTML5 规定了一种通过 video 元素来包含视频的标准方法. 插入视频 <video width="320" height="240" contro ...