- 浏览: 84869 次
- 性别:
- 来自: 福建福州
文章分类
最新评论
-
walkingp:
非常好的一篇文章,再能配上插图就更好了!
asp.net架构基础知识--httpmodule&HttpHandler -
sharp_lover:
struts的校验确实是比较费劲,jquery很强但是也有一些 ...
struts2实践- 结合jquery的纯客户端js表单校验 -
daquan198163:
commons-validator支持客户端、服务端双重验证, ...
struts2实践- 结合jquery的纯客户端js表单校验 -
chinaway:
按照楼主的配置,终于搞定。3q
struts2实践- 结合jquery的纯客户端js表单校验 -
yyjn12:
不论如何,客户端的js校验,可以完全取代服务器端的数据检验吗? ...
struts2实践- 结合jquery的纯客户端js表单校验
1.Using Annotations(利用java5的标记实现验证)
[list]该方式的验证必须在class级别上声明@Validation()属性代码如下
在字段的setter方法上定义验证的规则
field validation的声明方式
plain validation的声明方式
采用该方式验证可以减少配置文件的数量但是关于验证错误信息中对localization的支持有待调查。
[/list]
2.Examples(使用用例)
[list]Basic Validation
主要一点就是声明validation.xml 文件放在action类的包下,命名规则为 <ActionClassName>-validation.xml or <ActionClassName>-<ActionAliasName>-validation.xml
Client Validation
服务器端的配置代码和Basic Validation的代码一直不同的地方在于在jsp页面上声明s:form标记的时候必须指定 validate="true"属性,并且不支持把namespace写在action上而要直接写在页面的namespace属性上。实际应用如下
not work
AJAX Validation
2.0.x版本的ajax验证是和DWR结合的,文档中介绍的是和Dojo结合的版本。
服务器端配置除了Basic Validation,需要在struts.xml文件中加入如下拦截器
在页面上的form标签中加入theme="xhtml"属性并且没有validate="true"属性
在head中加入<sx:head />
在s:submit按钮(可以使其他控件例如bind)中加入validate="true"属性
如果需要进一步使用ajax提交,需要在s:submit,ajaxAfterValidation="true"
Setting validate to true in the form tag还是可以打开JavaScript验证,不过该验证会在ajax验证前执行。
工作原理
jsonValidation必须在正常的validation拦截器之后执行。
该拦截器先检查struts.enableJSONValidation属性为true则执行ajax验证。
检查 struts.validateOnly为true并且存在validation错误的时候,把错误信息序列化为JSON
在客户端使用utils.js中StrutsUtils.
Include prototype.js,utils.js and validation.js(the one for the theme being used), if you are not using the Dojo plugin.
详细的验证流程参考文档中的处理流程图.Field Validators
这种校验器需要嵌套在<field name="stringLengthValidatorField">标签中使用。
并且可以在field标签中定义多个<field-validator type="stringlength">validator。
该校验器有两种形式还可以使用plain validator中加入fieldname属性来实现这种校验器。Non Field Validators
该校验器的工作方式如下
Visitor Field Validator
这种vistor用于定义使用某个对象自己的校验器进行数据的校验。
该校验器可以校验对象,数组,结合等等的元素。
context属性用于指定用于验证对象所对应的xml文件名字规则。如果需要验证的对象的名字为User那么寻找的校验文件的路径为User-Context-validation.xml
appendPrefix指定是否需要在属性前面添加前缀,前缀为fieldname如果filename为user那么指定appendPrefix后验证的实际字段名就为user.name
[/list]
3.Bundled Validators(系统预定义的校验器)
[list]conversion validator--ConversionErrorFieldValidator
用于检查所校验的字段是否存在类型转化错误。
可以定义repopulateField用于保留转化错误前的用户输入值。
实现的原理主要是把捕获页面的conversion错误并且获取该字段的错误信息,添加到对应的context中。
repopulateField的实现是定义从context的errors中获取到该字段的用户输入值,并且利用preresultlistener在用户执行完action后,result执行前,改变statck中该value的值为用户错误输入的值。date validator--DateRangeFieldValidator
用于判断date类型的数据的大小
通过继承AbstractRangeValidator并且date类型的数据实现了Comparable接口来实现多种数据类型的比较。
详细比较代码如下
double validator--DoubleRangeFieldValidator
实现了double类型数值的比较
Inclusive为min<a<max
Exclusive为<=min >=maxemail validator--EmailValidator
校验email格式是否正确
该校验器其实是继承正则表达式实现的。表达式如下
"\\b(^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z0-9]{2,})|(\\.[A-Za-z0-9]{2,}\\.[A-Za-z0-9]{2,}))$)\\b"expression validator--ExpressionValidator
利用ongl表达式校验field的值。
表达式必须能返回Boolean的值。fieldexpression validator--FieldExpressionValidator
校验ognl表达式的值,必须指定filedname,并且错误信息是field级别的。
int validator--IntRangeFieldValidator
实现和date一致.
regex validator--RegexFieldValidator
利用正则表达式校验某个字段的值。
required validator
验证某个字段非空
requiredstring validator
判断值是否是字符串,而且判断字符串长度是否大于0
stringlength validato
判断字符串的长度范围.
url validator--URLValidator
判断字符串格式是否符合url的格式
实际调用TextUtils.verifyUrl方法实现.visitor validator--VisitorFieldValidator
实现上一章节已经讲到这里不在鏊述。
[/list]
4.Registering Validators
5.Turning on Validation(添加验证拦截器)
加入如下拦截器到栈中
6.Defining Validation Rules
[list]校验文件的路径的查找规则
(1)Per Action class: in a file named ActionName-validation.xml
(2)Per Action alias: in a file named ActionName-alias-validation.xml
(3)以上都找不到则会递归的往对象的继承类或者接口类上一直找到Object.class
代码如下
[/list]
7.Localizing and Parameterizing Messages(messae信息的本地化和参数化)
validator的message元素可以定义key属性,用户从resource bundle文件中获取消息体,
并且用ognl表达式获取相对应的值.
也可以直接在ognl表达式中用getText方法直接查找resource bundle中的值.例子如下
8.Validator Flavour
当校验的信息是针对字段的时候采用field-validator会更加好理解。
9.Short-Circuiting Validator(短路)
Plain validator 优先于 field-validator.
校验过程中将先校验Plain validator后校验field-validator.
只要有Plain validator短路,其余的所有validator都不会被校验。
field-validator如果定义了短路属性,只会短相同fieldname的其他校验器,而不会影响到其他field的校验器,包括Plain validator
[list]
@Validation() public class SimpleAnnotationAction extends ActionSupport { }
@RequiredFieldValidator(type = ValidatorType.FIELD, message = "You must enter a value for bar.") @IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.") public void setBar(int bar) { this.bar = bar; }
plain validation的声明方式
@Validations( requiredFields = {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")}, requiredStrings = {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")}, emails = { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")}, urls = { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")}, stringLengthFields = {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")}, intRangeFields = { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")}, dateRangeFields = {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")}, expressions = { @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."), @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."), @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."), @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."), @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.") }
2.Examples(使用用例)
[list]
<s:form method="post" validate="true" action="quizClient" namespace="/validation">
not work
<s:form method="post" validate="true" action="/validation/quizClient.action">
服务器端配置除了Basic Validation,需要在struts.xml文件中加入如下拦截器
<interceptor-ref name="jsonValidationWorkflowStack"/>
在页面上的form标签中加入theme="xhtml"属性并且没有validate="true"属性
在head中加入<sx:head />
在s:submit按钮(可以使其他控件例如bind)中加入validate="true"属性
如果需要进一步使用ajax提交,需要在s:submit,ajaxAfterValidation="true"
Setting validate to true in the form tag还是可以打开JavaScript验证,不过该验证会在ajax验证前执行。
工作原理
jsonValidation必须在正常的validation拦截器之后执行。
该拦截器先检查struts.enableJSONValidation属性为true则执行ajax验证。
检查 struts.validateOnly为true并且存在validation错误的时候,把错误信息序列化为JSON
在客户端使用utils.js中StrutsUtils.
Include prototype.js,utils.js and validation.js(the one for the theme being used), if you are not using the Dojo plugin.
详细的验证流程参考文档中的处理流程图.
并且可以在field标签中定义多个<field-validator type="stringlength">validator。
该校验器有两种形式还可以使用plain validator中加入fieldname属性来实现这种校验器。
<validator type="expression"> <param name="expression"><![CDATA[ ( (someText == someTextRetype) && (someTextRetype == someTextRetypeAgain) ) ]]></param> <message><![CDATA[ all three text must be exactly the same ]]></message> </validator>
该校验器可以校验对象,数组,结合等等的元素。
context属性用于指定用于验证对象所对应的xml文件名字规则。如果需要验证的对象的名字为User那么寻找的校验文件的路径为User-Context-validation.xml
appendPrefix指定是否需要在属性前面添加前缀,前缀为fieldname如果filename为user那么指定appendPrefix后验证的实际字段名就为user.name
[/list]
3.Bundled Validators(系统预定义的校验器)
[list]
可以定义repopulateField用于保留转化错误前的用户输入值。
实现的原理主要是把捕获页面的conversion错误并且获取该字段的错误信息,添加到对应的context中。
repopulateField的实现是定义从context的errors中获取到该字段的用户输入值,并且利用preresultlistener在用户执行完action后,result执行前,改变statck中该value的值为用户错误输入的值。
通过继承AbstractRangeValidator并且date类型的数据实现了Comparable接口来实现多种数据类型的比较。
详细比较代码如下
if ((getMinComparatorValue() != null) && (value.compareTo(getMinComparatorValue()) < 0)) { addFieldError(getFieldName(), object); } // only check for a maximum value if the max parameter is set if ((getMaxComparatorValue() != null) && (value.compareTo(getMaxComparatorValue()) > 0)) { addFieldError(getFieldName(), object); }
Inclusive为min<a<max
Exclusive为<=min >=max
该校验器其实是继承正则表达式实现的。表达式如下
"\\b(^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z0-9]{2,})|(\\.[A-Za-z0-9]{2,}\\.[A-Za-z0-9]{2,}))$)\\b"
表达式必须能返回Boolean的值。
实际调用TextUtils.verifyUrl方法实现.
[/list]
4.Registering Validators
- 通过ValidatorFactory.parseValidators()方法解析加载所有配置文件中有定义的validator,系统只记住validator的名字和对应的实现类的包全路径。
- 加载过程会寻找的文件如下classpath中的validators.xml,com/opensymphony/xwork2/validator/validators/default.xml,com/opensymphony/xwork2/validator/validators中-validators.xml结尾的所有文件.
5.Turning on Validation(添加验证拦截器)
加入如下拦截器到栈中
<interceptor name="validator" class="com.opensymphony.xwork2.validator.ValidationInterceptor"/>
6.Defining Validation Rules
[list]
(2)Per Action alias: in a file named ActionName-alias-validation.xml
(3)以上都找不到则会递归的往对象的继承类或者接口类上一直找到Object.class
代码如下
if (clazz.isInterface()) { for (Class anInterface : clazz.getInterfaces()) { validatorConfigs.addAll(buildValidatorConfigs(anInterface, context, checkFile, checked)); } } else { if (!clazz.equals(Object.class)) { validatorConfigs.addAll(buildValidatorConfigs(clazz.getSuperclass(), context, checkFile, checked)); } }
[/list]
7.Localizing and Parameterizing Messages(messae信息的本地化和参数化)
validator的message元素可以定义key属性,用户从resource bundle文件中获取消息体,
并且用ognl表达式获取相对应的值.
也可以直接在ognl表达式中用getText方法直接查找resource bundle中的值.例子如下
<message>${getText("validation.failednotice")}! ${getText("reason")}: ${getText("validation.inputrequired")}</message>
8.Validator Flavour
当校验的信息是针对字段的时候采用field-validator会更加好理解。
9.Short-Circuiting Validator(短路)
Plain validator 优先于 field-validator.
校验过程中将先校验Plain validator后校验field-validator.
只要有Plain validator短路,其余的所有validator都不会被校验。
field-validator如果定义了短路属性,只会短相同fieldname的其他校验器,而不会影响到其他field的校验器,包括Plain validator
发表评论
-
struts2实践-文件上传以及图片文件width,length的检查(未完成版)
2008-04-15 14:48 0先定个题目等完成了再发布. -
Struts2 Architects Guide-Big Picture
2008-03-27 16:53 1354简要处理流程 HttpRequest-->ActionC ... -
Struts2 Core Developers Guide-Cookbook
2008-03-27 16:12 18771.Handling File Uploads 采用 ... -
Struts2 Core Developers Guide-FAQ
2008-03-27 11:13 16671.What are the fundamental diff ... -
Struts2 Core Developers Guide-Type Conversion
2008-03-25 16:50 20261.Overview 类型转化在strut ... -
Struts2 Core Developers Guide-Localization
2008-03-25 16:48 21931.Overview 支持国际化的 ... -
Struts2 Core Developers Guide-PreResultListener
2008-03-25 10:12 23321.主要功能&触发时间 该监听器主要在action的e ... -
Struts2 Core Developers Guide-DispatcherListener
2008-03-25 10:01 13971.主要功能 在Dispatcher对象init或者destr ... -
Struts2 Core Developers Guide-Result Types
2008-03-24 22:14 14801.总览 action负责applicate ... -
Struts2 Core Developers Guide-Action Chaining
2008-03-24 22:07 11381.顾名思义,该功能的主要目的是执行一连串的action方法, ... -
Struts Core Developers Guide-Writing Interceptors
2008-03-24 17:33 9081.实现Interceptor interface接口 该接口 ... -
Struts Core Developers Guide-Framework Interceptor
2008-03-24 16:50 1507Alias Interceptor 用于在A ... -
Struts2 Core Developers-Interceptors
2008-03-21 15:42 8581.Understanding Interceptors(理解 ... -
Struts2 Core Developers Guide-Configuration
2008-03-21 11:34 18261.最初也是最终的理想Zero Configuration 目 ... -
Struts2 Core Developers Guide-Develop with struts
2008-03-21 10:45 10071.Ajax集成 struts2集成了对Ajax处理的支持,只 ... -
Struts2 Core Developers Guide-Nutshell(概要)
2008-03-21 10:22 917Architecture in a Nutshell(架构概要 ... -
Struts2 Core Developers Guide-tutorial
2008-03-20 10:17 10191.Dependency of struts2 struts2 ...
相关推荐
《ARM System Developers Guide - Designing and Optimizing System Software》是一本深入探讨ARM处理器系统软件设计与优化的专业书籍,由Andrew N. Sloss、Dominic Symes、Chris Wright和John Rayfield四位在ARM...
标题《qgroundcontrol-developers-guide-en》表明本篇指南是关于qgroundcontrol(简称QGC)的开发者使用说明,QGC是地面站控制软件,其主要功能是为PX4飞控系统进行配置。 描述中提到,这份开发者指南解释了QGC软件...
《Oracle Database 应用开发者指南:基础篇 10g Release 2(10.2)》是一份详尽的文档,旨在为那些希望利用Oracle数据库进行应用开发的专业人士提供全面的技术指导。此文档由Oracle公司发布,版本号为B14251-01,...
SIP2开发者指南 3M Standard Interchange Protocol V2.00 3M™ SelfCheck™ system SIP2 Interface Developer’s Guide
这个是ERSI官方文档,绝对权威,绝对经典。AO开发必读。
2. **脚本语言与编程**:ACT主要基于Python语言进行开发,因此熟悉Python语法是必要的。指南会介绍如何使用Python编写ACT脚本,实现对Workbench模型的操作和定制化功能。 3. **ACT组件开发**:学习如何创建自定义的...
这个是ERSI官方文档,绝对权威,绝对经典。AO开发必读。
Developers guide to ASP.NET
本指南将围绕“VxWorks Device Driver Developers Guide Vol”展开,深入解析驱动编程的核心概念和技术。 首先,VxWorks设备驱动的开发主要涉及三个卷: 1. **Vol1_6.6**: 这部分通常涵盖驱动程序的基础知识,包括...
标题:“Apache_CloudStack-4.3.0-Developers_Guide-en-US” 指明了文件的名称,这是一个针对开发者指南的文档,专为Apache CloudStack 4.3.0版本编写。 描述:“Apache_CloudStack-4.3.0-Developers_Guide-en-US....
Tosi -- Matplotlib for Python Developers -- 2009 -- code.7z
Nandi -- Spark for Python Developers -- 2015 -- code.7z
2-day-developers-guide.pdf
1. 文档标题为“json-developers-guide.pdf”,并特别指出是“oracle 19c json开发指南”。这说明文档是针对Oracle数据库19c版本下使用JSON数据格式进行开发的官方指南。Oracle 19c是一个企业级数据库版本,其对JSON...
名称:daily.dev Where developers gro ---------------------------------------- 版本:3.28.2 作者:https://daily.dev/ 分类:开发者工具 ---------------------------------------- 概述:获取为您量身定制的最...
该压缩包包含的文件“win95-a-developers-guide”很可能是本书的电子版,可能包括PDF文档、源代码示例或其他相关资源。 Windows 95是微软发布的一款具有里程碑意义的操作系统,它引入了全新的图形用户界面和多任务...
Struts、Spring和Hibernate是Java Web开发中的三大框架,它们的整合使用,通常被称为SSH(Struts2、Spring4、Hibernate5)框架集成。SSH整合能够实现MVC设计模式,提供松耦合、高可扩展性的应用解决方案。下面将详细...
MediaTek LinkIt Smart 7688 Developers Guide v_0.92-1 是一份针对MediaTek LinkIt Smart 7688开发平台的技术指南,适用于那些希望深入了解该平台并进行开发的工程师或爱好者。这份文档是英文版,为那些喜欢阅读...
·增加的多核处理器支持,包括Intel@ Core i7处理器、ARM MPCore and Cortex A9处理器、FreescaleQorIQ P2020处理器、Cavium 54xx/55xx/56xx/57xx/58xx系列处理器和RMI XLR/XLS系列处理器等,使客户能够根据他们...
《Kotlin for Android Developers》中文版是一本专为Android开发者准备的Kotlin编程语言指南。这本书深入浅出地介绍了Kotlin这一现代、简洁且强大的编程语言,旨在帮助开发者快速掌握Kotlin并将其应用到Android应用...