Flex中的反射应用 - 仿Hibernate创建一个通用的数据验证工具
来源:互联网 发布:电脑必备软件 编辑:程序博客网 时间:2024/06/03 07:46
一、背景:
数据校验一直是应用开发中重要的必不可少的功能,Flex框架本身也提供了大量的易于使用的数据验证组件,如StringValidator,NumberValidator等,但使用时需要如下定义:
<mx:StringValidator id="srvcod_stringValidator" source="{srvcod}" requiredFieldError="请输入服务代码" property="text"/>
如果同一个实体对象应用在不同的输入页面中也需要重复定义,所以参考了hibernate validation的思路将校验规则用元数据的方式定义在实体对象或者页面数据对象中,这样就避免了可能出现重复定义的情况,同时个人感觉也比较容易维护。
二、代码:
代码比较简单,两个工具类:ReflectionUtil和ValidationUtil
ReflectionUtil用于解析实体对象中定义的元数据:
package util{import flash.utils.describeType;import flash.utils.getDefinitionByName;import flash.utils.getQualifiedClassName;import flash.utils.getQualifiedSuperclassName;import mx.collections.ArrayCollection;import mx.effects.AddItemAction;/** * The ReflectionUtil class privodes an mechanism to get meta data of a object or class */public class ReflectionUtil{private static var metadataMap:Object = new Object();public function ReflectionUtil(){}public static function getInstanceByName(className:String):Object{var c:Class = Class(getDefinitionByName(className));return new c();}public static function getClassName(instance:Object):String{return getQualifiedClassName(instance);}public static function getSuperClassName(instance:Object):String{return getQualifiedSuperclassName(instance);}public static function getClass(o:Object):Class{var c:Class = Class(getDefinitionByName(getQualifiedClassName(o)));return c;}public static function loadMetadata(instance:Object):Object{var clazz:Class = ReflectionUtil.getClass(instance);if (!metadataMap[clazz]){trace("load meta data of " + clazz);var xml:XML = describeType(new clazz());metadataMap[clazz] = new Object();metadataMap[clazz].fields = new ArrayCollection();var variables:XMLList = xml.variable;for each(var variable:Object in variables){var fieldName:String = variable.@name.toString();var fieldType:String = variable.@type.toString();var field:Object = new Object();field["name"] = fieldName;field["type"] = fieldType;var metadatas:XMLList = variable.metadata;if (metadatas){for each(var metadata:Object in metadatas){var metadataName:String = metadata.@name.toString();if (metadataName != "__go_to_definition_help"){ //TODO: exclude string.field[metadataName] = new Object();field[metadataName].tags = new ArrayCollection();var args:XMLList = metadata.arg;for each(var arg:Object in args){var argName:String = arg.@key.toString();var argValue:String = arg.@value.toString();if(argName=="type"){field[metadataName].type = argValue;}else{field[metadataName].tags.addItem({tagName:argName,tagValue:argValue});}}}}}metadataMap[clazz].fields.addItem(field);}}return metadataMap[clazz];}}}
ValidationUtil用于根据定义实例化Flex中的通用validator并执行校验工作:
package util{import mx.collections.ArrayCollection;import mx.events.ValidationResultEvent;import mx.validators.Validator;/** * The ValidationUtil class helps user to validate the form data in an easy way. */public class ValidationUtil{public function ValidationUtil(){}/** * Validate an object which is with Valid annotations. */public static function validate(instance:Object):ArrayCollection{var clazz:Class = ReflectionUtil.getClass(instance);var medadata:Object = ReflectionUtil.loadMetadata(instance);var validationResults:ArrayCollection = new ArrayCollection();if (medadata){for each(var field:Object in medadata.fields){if (field.Valid){var validType:String = field.Valid.type;var validator:Validator = ReflectionUtil.getInstanceByName(validType) as Validator;if (field.Valid.tags){for each(var tag:Object in field.Valid.tags){var tagName:String = tag.tagName;var tagValue:Object = tag.tagValue;validator[tagName] = tagValue;}}//valid datavar data:Object = instance[field.name];var result:ValidationResultEvent = validator.validate(data);validationResults.addItem(result);}}}return validationResults;}}}
实体对象:
package util{public class UserVo{[Valid(type="mx.validators.NumberValidator", required="true",minValue=1000,maxValue=5000)]public var contactId:int;[Valid(type="mx.validators.StringValidator", required="true",minLength=5,maxLength=10)]public var firstName:String;public var lastName:String;public var address:String;}}
使用比较简单,调用ValidationUtil.validate(obj)即可得到验证结果。
- Flex中的反射应用 - 仿Hibernate创建一个通用的数据验证工具
- 在Hibernate中的一个对tree树节点查询封装的通用工具类
- flex的数据验证!
- flex的数据验证!
- 一个通用的Hibernate DAO
- 一个通用的Hibernate DAO
- Hibernate中的数据验证框架
- FLEX验证数据的基本原则
- java反射的应用(Hibernate)
- 反射通用工具类
- 一步一步学Flex系列(1):创建一个基本的Flex应用
- 一个通用快速的反射方法调用
- Flex反射工具类
- 一个简单的flex应用
- 一个通用的验证类的探索
- Android SQlite ORM 仿hibernate数据持久层工具
- 一个通用的表单验证程序
- 一个通用的正则表达式表单验证
- 用.Net WebBrowser控件获取POST数据
- ORACLE 核心进程详解
- GAE(python)中发送带附件的邮件
- Vim 总结(一)
- 在《大耳朵英语》的播客上,批量获取MP3地址
- Flex中的反射应用 - 仿Hibernate创建一个通用的数据验证工具
- C# WebBrowser准确判断网页最终装载完毕
- Squid学习笔记
- struts2中使用ajax之二
- 关于android.R
- 小谈点阵液晶和测量曲线
- Java程序员:一刻钟精通正则表达式
- 看文档与保护眼睛,关于阅读本地联机文档的一些小Tip
- unity3d关节物体连接方式 Joint 简介