读书人

Struts2高速后台验证框架使用说明书

发布时间: 2012-08-21 13:00:21 作者: rapoo

Struts2快速后台验证框架使用说明书

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="test" namespace="" extends="quickValidation">

<action name="helloworld" 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类示例代码:

import com.opensymphony.xwork2.ActionSupport;

import common.validation.FormValidator;

public class HelloWorldAction extends ActionSupport {

@FormValidator(input="index", value="username,用户名,required min-length-5 max-length-10 validate-alpha;" +

"age,年龄,validate-digits min-value-18 max-value-100;password,密码,required;" +

"password2,重复密码,required equals-password-原始密码;" +

"gender,性别, validate-one-required")

public String execute() throws Exception {

return SUCCESS;

}

}

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

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

普通的错误显示:

所有错误信息: ${validationErrors}

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

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

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

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

<%@ taglib prefix="s" uri="/struts-tags" %>

<s:actionerror />

<s:fielderror/>

<s:form action="helloworld.action" method="post">

<s:textfield name="username" label="用户名" />

<s:password name="password" label="密码" />

<s:submit/>

</s:form>

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

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

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

<%@ page pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<html>

<head>

<style>

.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 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'></textarea></br>

<input type='submit' value='Submit'/>

<input type='reset' value='Reset'/>

</form>

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

@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();

*/

}

完整示例应用

请参考项目quickvalidemo, 可在MyEclipse6.0或者更高版本中执行.
http://www.blogjava.net/beansoft/archive/2009/12/22/306868.html#_Toc249167384

1 楼 哥的传说 2010-12-30 问个问题 麻烦给解答一下 :
如果字段 A 等于1或2的时候,B才不能为空,否则可以为空。
这样的逻辑,应该怎么写呢。麻烦给说明一下。
等待。。。 2 楼 xiangxingchina 2011-03-05 哥的传说 写道问个问题 麻烦给解答一下 :
如果字段 A 等于1或2的时候,B才不能为空,否则可以为空。
这样的逻辑,应该怎么写呢。麻烦给说明一下。
等待。。。
方法一:扩展源码 增加逻辑功能(不是特别好加)
方法二:逻辑写在程序中,把结果启动信息回调接口。

读书人网 >软件架构设计

热点推荐