`

struts2验证框架的使用和扩展

阅读更多

struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:

1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;

2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。

本文介绍一下struts2通过xml文件进行校验的方法并说明怎么样扩展自定义的验证。

 

一、struts2验证框架的包位置

部署struts2项目有一个必备jar包:xwork-core-*.jar,在这个包中有这样一个package"com.opensymphony.xwork2.validator.validators",所有官方验证类就放在这下面的,在这个包下面有一个"default.xml"文件,这就是验证框架的核心文件,里面配置了所有的验证类数据。

验证类的格式为:<validator name="别名" class="验证类"/>,在配置的时候只需要使用别名就能执行指定验证了。

在这介绍struts2的几个常用的验证类:

required:字段不能为空

requiredstring:字符串不能为空

int:int类型(可指定范围)

long:long类型(可指定范围)

short:short类型(可指定范围)

double:double类型(可指定范围)

date:时间格式(可指定范围)

expression:ognl表达式判断

fieldexpression:ognl表达式判断

email:邮箱判断

url:url路径判断

visitor:把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)

conversion:格式转换

stringlength:字符串长度

regex:正则表达式判断

这里有个地址详细介绍了这几种验证的使用方法,大家可以参考下:http://code.google.com/p/j2eewiki/wiki/Struts2Validator

以上验证乍看还是非常全面的,但是很多验证功能还不够强大(比如stringlength是把任何文字都当做1的长度,而中文像UTF-8是3个字节的长度,这样验证效果就不准确了),所以很多时候是需要进行自定义验证的,这个随后再说。

 

二、使用xml配置验证

①copy上面提到的"default.xml"文件到Action同级目录下,修改文件名为"action名-validation.xml"。假设有这样一个Action:com.struts.action.UserAction.java,那么你需要将xml文件放到com.struts.action包下面,并且改名为"UserAction-validation.xml"。

②删除标签<validators>里所有的内容,并且更改xml上面的dtd版本为1.0.2.dtd,这里我也不知道为什么1.0.0跑不起,反正改了就能执行了。

<!DOCTYPE validators PUBLIC 
  		"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

 ③编写验证文件,field标签表示被验证的字段项,field-validator标签表示使用什么验证约束,short-circuit表示如果有多个验证约束时只要有一个不通过则后面就不执行验证了,message表示验证不通过时返回的错误消息。

<field name="user.name">
	<field-validator type="requiredstring" short-circuit="true">
		<message>用户名不能为空</message>
	</field-validator>
</field>

 按照上面三步,一个基本的验证就出来了,大家可以去试试,只要提交的表单访问UserAction都会先通过xml的验证。假如你只想验证UserAction中的userAdd方法(该方法的请求路径为userAdd.action),则只需要将xml文件改名为"UserAction-userAdd-validattion.xml"即可。[特别注意:这个xml名称中的userAdd并非指Action中的方法名,而是指配置文件中的请求名,就是那个<action name="请求名">]

 

三、扩展struts2验证类

其实自定义验证类很简单,你只需要仿照struts2的任何一个验证类就能做出来,前面提到不能验证utf-8格式的字符长度,我们在这就做一个获取utf-8长度的自定义框架。

①创建验证框架扩展类,这里必须继承 FieldValidatorSupport 类,重写validate方法,具体验证代码就在validate方法中写,这里的get、set就是在xml中出现的属性参数。这段代码还不够好,其实可以把encoding也作为属性的,这样传入任何编码格式都能获取该编码对应的字符长度。

public class CheckStringLength extends FieldValidatorSupport {
	
	private boolean trim;  // 是否去首位空格
	private int minLength; //最大长度
	private int maxLength; //最小长度
	private static final String ENCODING = "UTF-8"; //编码格式(默认utf-8)
	
	/*
	 * 构造方法初始化默认数据
	 */
	public CheckStringLength() {
		this.trim = true;
		this.minLength = -1;
		this.maxLength = -1;
	}
	
	public boolean isTrim() {
		return trim;
	}
	public void setTrim(boolean trim) {
		this.trim = trim;
	}
	public int getMinLength() {
		return minLength;
	}
	public void setMinLength(int minLength) {
		this.minLength = minLength;
	}
	public int getMaxLength() {
		return maxLength;
	}
	public void setMaxLength(int maxLength) {
		this.maxLength = maxLength;
	}

	@Override
	public void validate(Object arg0) throws ValidationException {
		String fieldName = this.getFieldName();
		
		String val = (String) this.getFieldValue(fieldName, arg0);
		
		//如果值为空则直接不通过
		if (val == null || val.length() <= 0) {
			return;
		}
		
		if (trim) {
			val = val.trim();
			////如果值为空则直接不通过
			if (val == null || val.length() <= 0) {
				return;
			}
		}
		
		int length = 0;
		try {
			//根据编码格式获得字符长度
			length = val.getBytes(ENCODING).length;
		} catch (UnsupportedEncodingException e) {
			length = val.getBytes().length;
		}
		
		/*
		 *判断字符长度范围 
		 */
		if (minLength > -1 && length < minLength) {
			this.addFieldError(fieldName, arg0);
		}
		if (maxLength > -1 && length > maxLength) {
			this.addFieldError(fieldName, arg0);
		}
	}
	
}

 

 ②新建validators.xml文件,将"default.xml"的配置信息和自定义验证类的配置信息放到文件中,最后把validators.xml文件放到源码根目录下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC   
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"   
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">  

<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    
    <!-- 自定义验证规则 -->
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
   </validators>

 ③按照前面所说的编写表单验证规则,注意这里的param就是上面CheckStringLength类中的属性,但是属性是根据get、set方法来的 (因为struts2做了一个很蛋痛的事:他的验证类中有这样一个属性"doTrim",但是该属性对应的get、set方法是getTrim、setTrim,配置文件里必须这样写<param name="trim">false</param>,记住是根据set方法配置param)。

<!DOCTYPE validators PUBLIC 
  		"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
	<!-- 用户名	非空、长度、半角、允许字符 -->
	<field name="user.name">
		<field-validator type="requiredstring" short-circuit="true">
			<message>用户名不能为空</message>
		</field-validator>
		<field-validator type="stringlengthencoding" short-circuit="true">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>用户名必须是6到10位字符!</message>
		</field-validator>
	</field>
</validators>

基本上一个简单的自定义验证就完成了,大家可以手动试试,这个东西确实很简单。

 

最后附上扩展的几个验证类,希望对大家有所帮助 :

<!-- 根据编码格式获取字符串长度,并且可以校验长度范围 -->
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
    <!-- 检查常用的格式,目前能验证:邮箱、手机、固定电话和身份证号 -->
    <validator name="checkformat" class="com.bless.struts2.validate.CheckFormat"/>
    <!-- 检查是否是半角字符 -->
    <validator name="checkhalfwidthdigit" class="com.bless.struts2.validate.CheckHalfWidthDigit"></validator>
    <!--  检查字符串格式,这里可以中文、字母、数字和符号任何组合配置 -->
    <validator name="checkspecialchar" class="com.bless.struts2.validate.CheckSpecialChar"></validator>
    <!-- 检查时间 -->
    <validator name="checkdate" class="com.bless.struts2.validate.CheckDate"/>
    <!-- 检查小数值,可以验证小数点精确范围 -->
    <validator name="checkdoublerange" class="com.bless.struts2.validate.CheckDoubleAccuracy"/>

 

最后感谢同事jwt童鞋做的扩展框架。

1
0
分享到:
评论
3 楼 白糖_ 2012-09-21  
chinahnzhou 写道
        if (maxLength > -1 && maxLength > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }

这句话写错了,应该是
        if (maxLength > -1 && length > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }


多谢指正
2 楼 chinahnzhou 2012-09-20  
        if (maxLength > -1 && maxLength > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }

这句话写错了,应该是
        if (maxLength > -1 && length > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }
1 楼 笨鸟刃心 2012-08-19  
谢谢您!有收获!

相关推荐

    struts2验证框架

    2. 可扩展性:Struts2 验证框架提供了高度的可扩展性,可以根据不同的业务逻辑添加新的Validators和Validation Rules,以满足新的验证需求。 3. 高效性:Struts2 验证框架提供了高效的验证机制,可以快速地对用户...

    struts2验证框架简单示例

    在Struts2中,验证框架是处理用户输入验证的关键部分,它确保了从客户端接收到的数据的质量和准确性。本示例将深入探讨Struts2验证框架的基本用法,特别适合初学者理解和掌握。 ### 一、Struts2验证框架概述 ...

    struts2验证框架参数

    综上所述,Struts2验证框架提供了丰富的验证器和参数设置,开发者可以根据具体需求灵活选择和组合,有效提升Web应用的数据质量和安全性。正确理解和运用这些验证机制,对于构建健壮、可靠的Web应用程序至关重要。

    Struts2 验证框架

    在Struts2验证框架中,主要有两种验证方式:客户端验证和服务器端验证。客户端验证通常使用JavaScript在用户提交表单前进行,可以提供实时反馈,提升用户体验。而服务器端验证是必不可少的安全层,确保即使客户端...

    Struts1.x的验证框架示例

    验证框架是Struts1.x的一个重要组成部分,用于处理用户输入数据的验证,确保数据的准确性和完整性。以下是对Struts1.x验证框架的详细说明: 1. **验证框架的引入** 在Struts1.x中,验证通常分为两个阶段:客户端...

    Struts的验证框架Validate使用续一

    总的来说,Struts的验证框架Validate提供了灵活、可扩展的验证机制,能够帮助开发者有效地管理用户输入的验证,减少因数据不合法导致的问题,从而提高应用的质量和安全性。通过熟练掌握这一框架,开发者能够更好地...

    struts-验证框架

    Struts验证框架是Java Web开发中的一个重要组成部分,主要用于在用户输入数据时进行验证,确保数据的完整性和正确性。这个框架结合了MVC(Model-View-Controller)设计模式,帮助开发者实现业务逻辑与表现层的分离,...

    Struts自动验证框架使用详细讲解

    Struts验证框架的核心依赖于两个关键的JAR包:Jakarta-Oro.jar和Commons-validator.jar。Jakarta-Oro.jar提供了文本处理类,如正则表达式的处理,而Commons-validator.jar则是验证框架本身,包含了各种验证方法和...

    Struts Validator验证框架详细讲解.txt

    ### Struts Validator 验证框架详细讲解 #### 引言 在Java Web开发中,数据验证是确保应用程序安全性和用户体验的重要环节。Struts框架作为早期流行的MVC框架之一,提供了强大的验证机制——Struts Validator,它...

    Struts2框架源码

    Struts2框架是Java Web开发中的一个流行框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了一种结构化和可扩展的方式来构建应用程序。此压缩包文件包含的是Struts2的源码,特别适合初学者研究和学习...

    Struts 2 自定义MVC 框架

    - 如何利用Struts 2的插件系统扩展功能,如国际化、验证等。 理解Struts 2的架构和工作流程,对于任何Java Web开发者来说都至关重要,无论是为了优化现有项目,还是开发新的应用。而通过实践自定义框架,我们可以更...

    Struts验证框架配置详解

    首先,Struts验证框架的配置涉及到两个关键的JAR包:`struts2-core.jar` 和 `struts2-validation-plugin.jar`。`struts2-core.jar` 是Struts2框架的核心库,包含了Struts2的基础功能;而`struts2-validation-plugin....

    struts2框架2016版资料day01

    Struts2继承了Struts1的优点,并吸取了其他框架如WebWork的优势,提供了更强大的拦截器机制和更灵活的扩展性。 2. **核心组件**:Struts2的核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)...

    struts validator验证框架项目

    Struts Validator是一个强大的验证框架,它是Apache Struts框架的一部分,用于在Java Web应用程序中实现数据输入验证。这个项目集成了验证规则,使得开发者能够轻松地确保用户提交的数据符合预期的格式和约束,从而...

    Struts 结合 Validate框架验证详解

    总之,结合Struts和Validate框架可以实现高效且可扩展的数据验证机制。通过分离验证逻辑与业务逻辑,开发者可以更专注于应用的核心功能,同时保证了用户输入数据的正确性。理解并熟练运用这些验证工具,将有助于提升...

    Apache+Struts2验证

    5. **使用安全拦截器**:利用Struts2的拦截器机制,实现输入验证和异常处理,增强应用安全性。 6. **安全编码实践**:遵循安全编码规范,避免在动态方法调用中使用不安全的变量。 7. **定期审计和扫描**:使用自动...

    Struts validator验证框架

    Struts Validator是一个强大的验证框架,它是Apache Struts框架的一部分,用于在Java Web应用程序中实现数据验证。这个框架帮助开发者在用户提交表单时确保输入的数据是合法、完整且符合业务规则的,从而提高应用...

Global site tag (gtag.js) - Google Analytics