struts2的核心是从webwork演变来的,其数据验证框架其实就是原webwork的那一套东西。
一,Struts2数据验证的整体框架介绍
struts2的action都要继承ActionSupprot类,这个类实现了Validateable与ValidationAware这两个跟数据验证有关的接口。其中Validateable只有一个方法validate()用于数据验证;ValidationAware 则用于记录验证出错时的相关信息。
而数据验证在什么时候被调用呢?数据验证的调用是包装在workflow拦截器里,
我们看看workflow拦截器在struts_default.xml中的定义,它是放在默认的defaultStack拦截器组里,相关顺序如下:
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
params与conversionError这两个拦截器在workflow的前面,它们的工作是从request中把数据转成正确的Java类型数据,以供后面处理。validation拦截器实质是AnnotationValidationInterceptor与我们这里谈的数据验证不是一回事,它只判断有没有@SkipValidation注解,如果有就不会路过数据验证,只是起一个开关作用。
当workflow拦截器触发时,它先检查当前请求的action是否实现了Validateable接口,如果实现了该接口,则调用 validate()方法:如果这个方法处理时发现有数据验证不通过,则会生成一个错误信息并交给ValidationAware的方法去存储这些出错信息。当validate()方法执行完毕,workflow拦截器还要调用ValidationAware的hasErrors()方法,看看是否有出错信息生成,如果有出错信息,就中断当前action的执行流程,返回"input"字符串,一般我们是在配置文件struts.xml里配置"input"返回结果的跳转页面。
二,数据验证的方式
1,在action类里实现validate()方法
这是最简单的方法了,直接在actionClass中实现Validateable接口的方法,如:
public class RegUser extends ActionSupport {
public String execute(){
return SUCCESS;
}
private String username;
private String password;
// Getters and setters omitted
public void validate(){
if ( getPassword().length() == 0 ){
addFieldError( "password", getText("密码不能为空") );
}
if ( getUsername().length() == 0 ){
addFieldError( "username", getText("用户名不能为空") );
}
. . .
}
}
配置文件:
<action name="regUser">
<result name="success">
/WEB-INF/pages/regsucc.jsp
</result>
<result name="input">
/WEB-INF/pages/regerror.jsp
</result>
</action>
把所有的判断逻辑直接写到action类里,如果有验证错误,直接返回"input"。
2,使用xml配置文件:ActionClass-validations.xml
其实struts2已经内置了一些基本的数据验证,完全可以省去我们日常的一些数据验证需求,通过配置文件的方式。
在ActionClass所在的目录下,新建一个以ActionClass名字组合成的特定xml:ActionClass-validations.xml(例,我的ActionClass名为RegUser,则我应该在同目录下建一名为RegUser-validations.xml的文件),其内容如下:
<?xml version="1.0″ encoding="UTF-8″?>
<!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="username"> <!- 声明要验证的字段 ->
<field-validator type="requiredstring"> <!- 声明该字段验证器的类型为"必填的字符串" ->
<message>用户名不能为空</message> <!- 如果验证不通过时的出错信息 ->
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
</field>
<!-
<field name="age">
<field-validator type="int"> <!- 声明该字段验证器的类型为"必须是整数" ->
<param name="min">13</param> <!- 声明该字段最小值是13 ->
<param name="max">20</param> <!- 声明该字段最大值是20 ->
<message>
必须在 13至20之间
</message>
</field-validator>
</field>
->
</validators>
以下是目前struts2所支持的内置的验证器说明,我们可以直接在xml文件里声明拿来使用:
3,使用自己定义的验证器做数据验证
前面介绍过的第2种方式,是利用struts自带的验证器,通过xml配置文件来进行数据验证的,但如果我们的验证要求比较特殊,比如对一个参数的复杂数据、字符组合要求,则可能会考虑自己写一个验证器,如果是这样,那为什么不彩第1种方式,直接在action里实现validate方法呢?是的,当然这样也可以,但我们的目标是尽可能重用代码,或许这个类型的数据验证会用在多个action,甚至于提供给后来的同学们使用,抽象成一个独立的验证器,通过配置文件来声明,以达到复用。
下面就介绍如果新建一个可复用的自定义验证器。
一般新建自定义的验证器,我们要继承ValidatorSupport或FieldValidatorSupport类。下面以一个密码验证的代码例子为说明:
所需验证的密码数据要满足下面条件:
1,密码中要包含字母,大小写均可
2,密码中要包含数字,0-9
3,密码中要包含至少一个特殊字符
参见以下代码:
1,我们要先继承FieldValidatorSupport(该类已经继承ValidatorSupport)类
2,为我们的验证声明几个正则表达式的pattern:对数字的,普通字符,以及特殊字符
3,实现validate()方法,在这里实现验证的逻辑代码
4,利用继承自FieldValidatorSupport中的getFileName()和getFileValue()方法获取要进行验证的数据
5,如果验证不通过,要调用addFieldError()方法,继承自ValidatorSupport类,以声明错误
public class PasswordIntegrityValidator extends FieldValidatorSupport {
static Pattern digitPattern = Pattern.compile( "[0-9]");
static Pattern letterPattern = Pattern.compile( "[a-zA-Z]");
static Pattern specialCharsDefaultPattern = Pattern.compile( "!@#$");
public void validate(Object object) throws ValidationException {
String fieldName = getFieldName();
String fieldValue = (String) getFieldValue(fieldName, object );
fieldValue = fieldValue.trim();
Matcher digitMatcher = digitPattern.matcher(fieldValue);
Matcher letterMatcher = letterPattern.matcher(fieldValue);
Matcher specialCharacterMatcher;
if ( getSpecialCharacters() != null ){
Pattern specialPattern =
Pattern.compile("[" + getSpecialCharacters() + "]" );
specialCharacterMatcher = specialPattern.matcher( fieldValue );
} else{
specialCharacterMatcher =
specialCharsDefaultPattern.matcher( fieldValue );
}
if ( !digitMatcher.find() ) {
addFieldError( fieldName, object );
}else if ( !letterMatcher.find() ) {
addFieldError( fieldName, object );
}else if ( !specialCharacterMatcher.find() ) {
addFieldError( fieldName, object );
}
}
private String specialCharacters;
public String getSpecialCharacters() {
return specialCharacters;
}
public void setSpecialCharacters(String specialCharacters) {
this.specialCharacters = specialCharacters;
}
}
在建完主体的验证器代码,就要在配置文件中声明它,以便我们使用:
在WEB-INF/classes/下新建或编辑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="passwordintegrity"
class="manning.utils.PasswordIntegrityValidator"/>
</validators>
完成了声明,我们就可以使用前面介绍过的使用xml配置文件:ActionClass-validations.xml的方式来使用这个验证器了:
在为要使用的类的目录下建立ActionClass-validations.xml的文件,增加如下内容:
<field-validator type="passwordintegrity">
<param name="specialCharacters">$!@#?</param>
<message>您的密码必须包括至少一个数字,字符,并包括如下的特殊的字符: "${specialCharacters}".
</message>
</field-validator>
分享到:
相关推荐
Struts2 数据校验是Java Web开发中一个关键的组件,它主要用于确保用户提交的数据符合预定义的规则,从而防止无效数据对系统造成影响。Struts2提供了强大的数据验证框架,使得开发者能够方便地实现客户端和服务器端...
Struts2 数据校验是Java Web开发中一个重要的实践领域,尤其对于保证应用程序的数据质量和安全性至关重要。Struts2,作为一款流行的MVC框架,提供了一套强大的数据验证机制,允许开发者在用户输入提交到服务器之前...
在“Struts2数据校验与国际化”这一主题中,我们将深入探讨Struts2如何通过不同的验证机制确保数据的有效性,以及如何通过国际化功能提供多种语言的用户体验。 首先,数据校验是任何Web应用程序中的关键环节,它...
在Struts 2中,数据校验是实现业务逻辑的重要组成部分,确保输入的数据符合预设规则,从而提高应用程序的稳定性和安全性。数据校验功能是通过Struts 2的ActionSupport类和其他相关组件来实现的。 首先,...
在Struts2中,校验器(Validator)是处理用户输入验证的核心组件,确保提交到服务器的数据符合预设的业务规则。这篇博客文章可能是关于如何使用Struts2的内置校验机制以及自定义校验规则的探讨。 Struts2的校验框架...
本资料"Struts2_1100_SimpleDataValiation"提供了关于Struts2简单数据校验的源码,这将有助于我们深入理解Struts2的数据校验机制。 1. **Struts2数据校验框架概述** - Struts2的数据校验框架是基于OGNL(Object-...
这篇博客“Struts2 简单数据校验”可能详细介绍了如何在Struts2框架中实现对用户输入的有效性验证。 数据校验是任何Web应用程序中的核心部分,它涉及到多个方面,如必填字段、数据类型检查、长度限制、格式验证等。...
在Struts2中,数据校验是确保输入数据有效性和安全性的重要环节。本资料包聚焦于Struts2中的数据校验以及国际化(i18n)支持。 首先,我们来探讨"Struts2中的validation_多国语言版",这是Struts2的数据校验功能。...
本资料“Struts2_1100_SimpleDataValiation.rar”提供了关于Struts2简单数据校验的源码示例。 首先,Struts2的数据校验主要依赖于两个核心组件:Validation拦截器和Validator框架。Validation拦截器在Action执行前...
在Struts2框架中,输入校验是确保数据完整性和安全性的重要环节。对于手动输入完成校验,Struts2提供了灵活的机制。 1. **普通处理方式**:在Action类中重写`validate()`方法是最常见的做法。此方法允许开发者...
本文将深入探讨Struts2中的输入校验机制,以及如何对指定方法进行输入校验。 在Struts2中,输入校验通常分为两种方式:客户端校验和服务器端校验。客户端校验主要通过JavaScript在用户端进行,可以提供即时反馈,但...
NULL 博文链接:https://code.iteye.com/blog/279065
在Struts2中,数据校验是一项至关重要的功能,它确保了用户提交的数据符合预定义的规则和格式,从而提高应用的安全性和数据质量。下面我们将详细探讨Struts2中的数据校验机制。 首先,数据校验是Web应用开发中的...
struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架
在Struts2中,数据校验是一个重要的功能,用于确保用户输入的数据符合业务规则和安全标准。在本案例中,我们将探讨如何使用配置文件形式进行基本的Struts2数据校验。 一、Struts2验证框架概述 Struts2的验证框架...
Struts2的Interceptor(拦截器)允许在Action执行前进行数据校验。例如,`ValidationInterceptor`是一个内置的拦截器,它使用Action级别的注解进行校验。如果校验失败,会将错误信息存入ActionContext,然后跳转到...