`
jdluojing
  • 浏览: 18000 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Struts2学习笔记(十四) 输入校验(下)

 
阅读更多

自定义验证器

我们已经看到了,只要实现了Validator接口的类都可以作为验证器。我们看一下Validator接口的源码:

public interface Validator<T> {

    void setDefaultMessage(String message);
String getDefaultMessage();
String getMessage(Object object);
    void setMessageKey(String key);
    String getMessageKey();
    void setMessageParameters(String[] messageParameters);
    String[] getMessageParameters();
    void setValidatorContext(ValidatorContext validatorContext);
    void validate(Object object) throws ValidationException;
    void setValidatorType(String type);
    String getValidatorType();
    void setValueStack(ValueStack stack);
}

Validation拦截器负责加载和执行各种验证器。在加载一个验证器之后,拦截器调用那个验证器的setValidatorContext方法,把当前的ValidatorContext对象传递给它,这样验证器就可以访问当前动作了。接下来拦截器调用验证器的validate方法,并把需要验证的对象传递进去。所以validate方式是我们在编写验证器时必须实现的方法。

ValidatorSupport类实现了Validator接口,并增加了一些扩展方法:

getFieldValue方法用于获取验证字段的值

addActionError方法用于添加一个Action级别的错误信息

addFieldError用于添加一个字段级别的错误信息。

需要注意的是他是一个抽象类,我们需要继承它或他的子类。一般如果我们要实现一个字段验证器,那么我们会选择继承他的(抽象)子类FieldValidatorSupport,如果我们需要实现一个非字段验证器,那么我们一般会直接继承ValidatorSupport类。在验证失败之后,如果我们实现的是字段验证器,那么需要使用addFieldError方法添加错误信息,如果是非字段验证器,那么使用addActionError方法添加错误信息。

下面我们动手实现一个自定义的字段验证器验证器:

MyValidator.java

public class MyValidator extends FieldValidatorSupport {

	public void validate(Object object) throws ValidationException {
		
		String fieldName = getFieldName();
		Object obj =  getFieldValue(fieldName,object);
		if(!(obj instanceof String)){
			addFieldError(fieldName,obj);
		}else{
			
			String fieldValue = (String)obj;
			if(fieldValue.length()==0||fieldValue.equals("admin")){
				addFieldError(fieldName,obj);
			}
		}

	}
}

UserAction.java略

input.jsp

<body>

<s:if test="hasFieldErrors()">

<s:iterator value="fieldErrors">

<font color="#FF0000"><s:property value="value[0]"/></font><br>

</s:iterator>

</s:if>

<form action="user.action" method="post">

username : <input type="text" name="userName"/><br/>

password : <input type="password" name="password"/>

<input type="submit" value="submit"/>

</form>

</body>

success.jsp略

我们的验证器实现了还需要我们进行注册,需要在Src(classpath)下新建一个validators.xml的配置文件,安装框架内建验证器声明的格式来声明我们的自定义验证器。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

"-//Apache Struts//XWork Validator Config1.0//EN"

"http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">

<validators>

<validator name="myvalidator" class="action.MyValidator"></validator>

</validators>

UserAction-validator.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

"-//Apache Struts//XWork Validator1.0.3//EN"

"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

<field name="userName">

<field-validator type="myvalidator">

<message>用户名格式不正确</message>

</field-validator>

</field>

<field name="password">

<field-validator type="requiredstring">

<param name="trim">true</param>

<message>passwordcannot be empty</message>

</field-validator>

<field-validator type="stringlength">

<param name="minLength">6</param>

<param name="maxLength">10</param>

<message>

the length of password mustbetween 6 and 10

</message>

</field-validator>

</field>

</validators>

测试:

提交结果:


我们还可以在自定义拦截器中增加一些属性,这样我们可以在配置文件中通过<param>元素来设置,要保证这些属性都有相应的get和set方法。

错误消息本地化和参数化

上面我们看到的验证失败的错误信息都是我们硬编码在<message>元素中的。Struts2还提供了将这些消息本地化和参数化的能力。我们可以在<message>标签是使用OGNL表达式来引用Action的属性,和使用getText方法来获取我们在ActionClass.properties中配置的本地消息。我们将前面的判断用户输入两个数的例子修改一下。

NumberAction.java略。

NumberAction.properties

message=max\u7684\u503C\u5FC5\u987B\u5927\u4E8Emin\u7684\u503C(max的值必须大于min的值)

NumberAction-validator.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

"-//Apache Struts//XWork Validator 1.0.3//EN"

"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

<validator type="expression">

<param name="expression">max > min</param>

<message>${getText("message")}</message>

</validator>

<field name="max">

<field-validator type="int">

<param name="max">10</param>

<param name="min">5</param>

<message>max的值必须介于5-10之间</message>

</field-validator>

</field>

</validators>

input.jsp略

测试:


提交结果:


我们还可以在<message>元素中使用${max}和${min}的形式来引用Action的max和min属性。

:Struts2手册中说如果我们使用了validators.xml文件来注册我们自定义的验证器,那么需要我们将默认验证器在validator中重新定义一次,但是从上面的实例可以看住,虽然我没有在validators.xml中重新声明int验证器,但是它还是能够起作用!

验证器的查找顺序

Struts2的验证框架为了使验证信息通用,指定了较为复杂的验证继承关系,当验证框架需要验证一个Action的时候,会按照以下的优先级收集验证信息:

父类-validation.xml

父类-别名-validation.xml

接口-validation.xml

接口-别名-validation.xml

Action类名-validation.xml

Action类名-别名-validation.xml

别名其实对应的就是<action>元素的method属性的值,因此,虽然看着很多,其实我们只需要记住基本的顺序是:父类 > 接口 > Action 就可以了。

这里还需要强调一点,接口-validation.xml优先于Action类名-validation.xml的含义,并不是找到了接口-validation.xml就不管Action类名-validation.xml,而是对于同名的字段验证器来说,两个验证都要进行,不过接口-validation.xml中的验证先于Action类名-validation.xml中的验证进行。

需要注意的是着写顺序并不是覆盖关系,找到的验证器都会被执行,只是会按照查找的循序来执行这些验证器。

验证短路

验证短路就是一个字段在多个验证器验证的过程中,一出现验证失败,那么后续的验证器就不在执行了。如使用验证短路,只需要在配置验证器的时候将short-circuit属性设置为true(大多数都有个short-circuit属性)即可。我们在编写自定义的验证器时,如果要是验证器具有验证短路功能,需要验证器实现ShortCircuitableValidator接口。如果一个一个非字段验证器设置了短路,那么一旦验证失败将终止整个验证过程。

客户端验证

使用Struts2的验证器和标签结合还能够实现客户端验证功能,但是有两个条件:

(1).struts2标签的form的主题(theme)一定不能设为simple。

(2). 将form的validate属性设为true。

这样客户端就会根据相应的action的xml验证文件产生一个js对客户端进行验证。

一般开发中只使用struts2的服务端验证,而不使用struts2的客户端验证。效果还不如我们自己动手写js来进行客户端验证。


分享到:
评论

相关推荐

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2学习笔记

    5. **类型转换与输入校验**:Struts2在类型转换过程中也会进行基本的校验,如检查非空、数值范围等。 **四.Struts2的核心:拦截器** 拦截器是Struts2的核心组件,它们在Action执行前后介入处理流程。拦截器可以...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2校验器与校验框架精彩学习笔记

    本学习笔记主要探讨了Struts2中的校验器(Validator)和校验框架,帮助开发者理解如何有效地实现数据验证,确保应用程序的健壮性。 首先,我们来看Struts2的校验框架。这个框架提供了强大的功能,可以对用户输入...

    struts2学习笔记五(第5讲.Struts2的输入校验)

    在Struts2的学习过程中,第五讲主要探讨的是输入验证,这是确保应用程序数据安全和准确性的关键步骤。输入验证通常发生在客户端和服务器端,防止恶意数据的提交,并确保用户输入的数据符合预设的格式和规则。 首先...

    struts2学习笔记六(第6讲.Struts2的输入校验续一)

    在学习Struts2输入验证的过程中,还需要理解Action上下文(ActionContext)和值栈(Value Stack)的概念。ActionContext存储了与当前请求相关的所有信息,而值栈则是将Action对象和ActionForm对象组织在一起的地方,...

    【张冰Struts2学习笔记】0202_Struts2的三种接收用户输入的方法

    在"【张冰Struts2学习笔记】0202_Struts2的三种接收用户输入的方法"中,我们主要探讨的是如何在Struts2中有效地获取并处理用户提交的数据。以下是对这三种方法的详细解析: ### 1. 使用Action属性 Struts2的核心是...

    struts2综合笔记

    #### 四、Struts2 目录结构 - **apps**: 包含基于 Struts2 的示例应用。 - **docs**: 包含 Struts2 文档和 API 文档。 - **lib**: 包含 Struts2 框架的核心库和第三方插件库。 - **src**: 包含 Struts2 框架的全部...

    Struts2学习笔记

    此外,Struts2还支持Action级别和全局级别的异常处理,以及强大的数据校验机制。通过`@FieldValidator`和`@Validations`注解,可以在Action类中声明字段级和类级的验证规则。如果验证失败,Struts2会自动处理错误并...

    struts2学习笔记八(第8讲.Struts2的校验框架)

    本讲主要探讨Struts2的校验框架,它提供了对用户输入数据进行验证的功能,确保数据的有效性和安全性。 在传统的MVC模式中,数据验证通常在控制器或模型层进行,但在Struts2中,校验逻辑被移到了专门的校验框架中,...

    Struts2.1学习笔记

    ### Struts2.1框架深度解析与...总之,Struts2.1的学习涵盖了环境搭建、配置管理、视图控制、输入校验、文件上传、国际化支持等多个方面,掌握这些知识点将使开发者能够构建出功能丰富、响应迅速、用户友好的Web应用。

    struts项目学习笔记

    更强大、更易用输入校验功能 整合Ajax支持:json插件 Struts2的今生前世: 1.早期开发模型Servlet+JSP+JavaBean显得力不从心: 流程凌乱、数据传递无序、缺乏辅助功能。 2.MVC模式的轻量级Web应

    传智播客struts2全程学习笔记

    ### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...

    struts2学习笔记九(第9讲.Struts2的校验框架 续)

    在第九讲中,我们将深入探讨Struts2的校验框架,这是一个非常重要的功能,它有助于确保输入数据的准确性和完整性,防止非法数据导致的系统异常。 在传统的Java web开发中,数据验证通常在服务器端进行,如Servlet或...

Global site tag (gtag.js) - Google Analytics