摘 要 在Web应用系统中,具有自适应能力的值对象将极大提高系统的开发效率和运行效率。本文主要讲述了如何动态创建封装值对象。 关键词 VO(Value Object) POSModel 值对象(Value Obiect)即值的对象,简称VO。 一个值对象实际上是一个可序列化的java类,它封装了客户端和服务器端所需要交换的业务数据。通过使用值对象极大地减少系统中客户端与服务器端间的网络对话,加速层之间的数据交换,从而提高系统的性能。目前的值对象多采用java的反射机制在程序的运行期间创建和维护任何类的对象(服从安全限制),而不提前对目标类进行硬编码。Java 语言的反射机制提供了一种非常通用的动态连接程序组件的方法。这种机制使得反射在创建与对象一同工作的类库中的通用方法方面非常有用。但是反射有两个缺点,一个是性能问题。在使用属性字段和方法访问的时候,反射要比直接的代码访问要慢很多。至于影响的程度,则依赖于在程序中怎样使用反射。如果要在执行应用程序的核心逻辑中使用反射,性能问题是一个严肃的问题。其次,使用反射可以使你的实际的代码内部逻辑变得模糊不清。程序员都希望在源代码中看到一个程序的逻辑以及象绕过源代码的反射所可能产生的维护问题这样的一些技术。反射代码也比相应的直接代码要复杂一些。此外编写值对象也是一项枯燥乏味的工作。 针对以上的问题,本文提出了一个基于元数据描述的值对象解决方案。通过该方案生成的值对象具有良好的自描述能力和自适应能力,通过定制元数据,用户可以从乏味的值对象硬编码工作中解脱出来;同时摒弃了Java的反射机制,提高了系统的性能,使程序的逻辑更加清晰。 值对象作为一种客户端和服务器端数据交换的载体,其所容纳和传输的不外乎“属性名/属性值”对这样的数据。基于上述特点,本文设计了POSModel类,该类作为所有值对象的基类,动态封装“属性名/属性值”放入Map类型的变量,向外界提供统一的接口用于操纵业务对象的数据。其类图如图1所示: 图1 POSModel实现了Serializable接口,可以作为远程方法调用(Romote Method Invoke,RMI)的参数在网络上传输。由于POSModel可以容纳任何类型的“属性名/属性值”,对这样的数据,而与实体Bean无关,其所容纳的数据也可以在系统运行时根据需要动态地改变,而不象JavaBean类值对象那样由于需要封装实体Bean的全部数据而导致不必要的数据传输,故而可以用它来做为客户端和服务器端间一种通用、动态的数据交换载体,而无须再实现一个个具体的JavaBean,这就大大减少系统中的硬编码工作量:因为根本就不需要为值对象提供任何的编码实现,而且也提高了系统的可维护性。除此之外,POSModel类提供以下功能: u 对字段属性有效性的校验 u 支持两种类型的数据(日期型和字符型) u 把所有数字类型的数据都当作字符型来操作 u 用空字符代表null u 为在html页面上显示数据提供了htmlEncode方法,用于过滤掉特殊字符 按照ORM理论,类和关系数据库中的表对应,对象和表中的记录对应,对象的属性和表的字段对应。而POSModel类动态封装了对象的“属性名/属性值”对数据,为此我们设计了一个xml文件用于建立对象到关系数据库的映射,其Schema文件主要代码如下: <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="field"> <xsd:attribute name="name" type="xsd:string" use="optional"/> <xsd:attribute name="tabField" type="xsd:string" use="optional"/> <xsd:attribute name="type" type="xsd:string" use="optional"/> </xsd:element> <xsd:element name="fields"> <xsd:element maxOccurs="unbounded" minOccurs="1" ref="field"/> </xsd:element> <xsd:element name="model"> <xsd:element ref="table"/> <xsd:element ref="fields"/>
1 引言
2 通用动态值对象的设计:POSModel
3 建立对象关系映射
[8]电大学习网.免费论文网[EB/OL]. /d/file/p/2024/0424/fontbr /><xsd:element ref="relations"/>
<xsd:element ref="primaryKeys"/>
</xsd:element>
<xsd:element name="posModels">
<xsd:element ref="model"/>
</xsd:element>
........
</xsd:schema>
u 每个model对应关系数据库的一个表,table元素表示具体的表名
u Model元素的fields属性与表的字段是一一对应的关系
u Model元素的relations属性用来描述表与表之间的联系
u Model元素的primaryKeys属性用来描述表的主键,提供单个或多个唯一键支持
4 值对象的生成策略
根据对象关系映射文件在运行期间动态封装值对象,通过包含在映射文件中的元素值构造POSModel 的实例。对于数据和值对象的属性值的一一对应问题,约定一个命名规范:映射文件中每个model节点将对应一个值对象,即一个POSModel类的实例。这样,在解析XML文件时可以根据model节点确定其中的数据和值对象的对应关系。值对象的动态封装过程描述如下:
⑴ 用ModelXMLParse类解析XML映射文件,将每一个model节点封装成TableModel对象,并把节点名作为键、TableModel对象作为值封装到哈希表,放入缓存中。
⑵ 业务对象发出创建POSModel类的实例请求时,根据对象名从缓存中找到对应的TableModel对象,创建具体POSModel类实例。
相关实现类图如图2 所示:
图2
5 值对象的创建传输与其他模块的交互
业务对象负责创建值对象,并根据请求将其传送到相关的客户端;业务对象也可以从用户处获取一个值对象格式的数据,并应用这些数据来执行一些更新。用户通过访问业务对象,既得到了所需的信息,也对相关数据做出了一定的修改。用户从业务对象的方法得到值对象时,可以直接调用值对象的成员方法进行本地数据访问,当然这种本地数据访问不会影响到业务对象。
此过程的序列图如图3所示:
图3
6 结束语
这一数据封装模式已在某大型电子政务软件中成功应用,系统所采用的体系结构Web应用框架在J2EE体系下的实现,也在多个大型的Web应用系统中取得成功。当然,这种数据封住模式在对关联表的支持、增加图形用户界面方便XML文件的录入方面还需作进一步的完善。
本文所阐述的结构,具有以下几个特点:
l 运行期间动态封装值对象的结构。
l 利用良好的对象封装技术,可以方便的实现对数据的各种操作。
l 对于数据结构并不固定的系统,应用此结构,大大简化了代码维护的工作量。
参考文献:
[1] 《J2EE服务器段高级编程》 机械工业出版社
[2] 郝文宁、徐继恒、赵振南 一个具有自适应性的J2EE Web应用框架研究与实现[J] 计算机工程与应用2004;40,11;61-63
[3] 《XML Developer’s Guide》 Mc Graw Hill
[8]电大学习网.免费论文网[EB/OL]. /d/file/p/2024/0424/fontbr />
相关文章:
DS-UWB信号分析04-26
基于临时表的Apriori改进算法04-26
一种基于UML的嵌入式系统可视化开发方法04-26
近十年来政治人物论文抄袭事件一览04-26
时间序列相空间重构及其应用研究04-26
FIR数字滤波器在TMS320VC54xDSP上的实04-26
魏建国:中国的经济支撑了整个人民币的发展 未来升值还04-26
伯南克的宏观经济学04-26
当代宏观经济学需要一个全新的分析框架04-26