实现Castor数据绑定,第3部分:模式之间的映射

本文配套源码

您现在应该具备的(回顾)

与前一篇文章一样,本文也对您系统的设置情况和您的技能做一些假设。首先,需要按照本系列的第1部分中的描述下载并安装Castor的最新版本,设置类路径和相关的Java库。然后,按照第2部分中的描述,熟悉Castor的基本编组和解组设施。

所以,您应该能够使用Castor提取出XML文档中的数据,并使用自己的Java类处理数据。用数据绑定术语来说,这称为解组(unmarshalling)。反向的过程称为编组(marshalling):您应该能够把Java类的成员变量中存储的数据转换为XML文档。如果您还不熟悉Castor的解组器和编组器,那么应该阅读 第 2 部分(参见 参考资料 中的链接)。

非理想环境下的数据绑定

初看上去,您似乎已经掌握了有效地使用Castor所需了解的所有过程:设置、编组和解组。但是,您到目前为止学到的所有东西只适用于所谓的理想环境。在这样的环境中,每个人编写的XML都是完美的,其中的元素名是有意义的,比如 “title” 和 “authorAddress”,而不是 “t” 或 “aa”。Java 类是按照有组织的方式创建的,采用单数作为类名(比如 “Book”),采用单数名词作为成员变量名(比如 “isbn” 和 “price”)。另外,数据类型也是正确的:没有开发人员把 price 的数据类型设置为 int 而不是 float,或者使用 char 数组存储字符串数据(这是 C 语言的做法)。

但是,大多数程序员所处的环境并不完美(我真想找到一个能够把我送到完美世界的魔法衣厨)。在大多数程序员所处的环境中有许多不理想的情况:XML 文档常常有糟糕的元素名和属性名,还要应付名称空间问题。元素数据存储在属性中,一些数据甚至由管道符或分号分隔。

Java 类是继承的,对它们进行重新组织在时间和工作量方面的成本可能会超过带来的好处。这些类常常无法简洁地映射到 XML 模式(认为 XML 和数据人员会与 Java 程序员相互妥协的想法也是非常不可思议的),而且在某些情况下,即使实现了简洁映射,也肯定不会跨所有类和数据。XML 元素名可能不合适,许多 Java 变量名也可能不合适。甚至可能遇到使用 Hungarian 表示法的名称,按照这种表示法,所有成员变量都以 “m” 开头,比如 mTitle。这很不好看。

在这些情况下,您目前学到的数据绑定方法就无能为力了。XML 文档中可能会出现 Hungarian 风格的元素名,Java 类中也可能出现没有意义的结构。这种情况是无法接受的。如果不能按照您希望的方式获取和操作 XML 文档的数据,那么 Castor(或任何数据绑定框架)又有什么意义呢?

灵活数据绑定的目标

首先要注意,在 Castor 或任何其他数据绑定框架中,使用映射文件都要花一些时间。必须先学习一些新语法。尽管映射文件使用 XML 格式(大多数框架都是这样的),但是您需要学习一些新元素和属性。还必须做一些测试,确保 XML 和 Java 代码之间的相互转换产生您希望的结果。最后,如果亲自指定映射,而不是让框架处理映射,就可能在数据绑定中遇到更多的错误。例如,如果希望让框架把 XML 中的 fiddler 元素映射到 Java 代码中的 violin 属性,但是错误地声明这个属性是在 player 类中(应该是在 Player 类中),那么就会遇到错误。因此,在亲自指定映射时,必须非常注意拼写、大小写、下划线、单引号和双引号。

在学习使用映射文件之前,应该确定确实需要这么做。如果掌握了映射文件,但是却不使用它,那就是浪费时间。但是,映射确实有一些优点。

Java 代码不再受 XML 命名方式的限制

前面曾经提到,在把 XML 转换为 Java 代码时,大小写可能会导致错误。在 XML 中,最常用的做法是名称全部小写并加连字符,比如 first-name。有时候,甚至会看到 first_name。这样的名称会转换为很难看的 Java 属性名;没人愿意在代码中调用 getFirst-name()。实际上,在大多数由程序员(而不是 XML 开发人员或数据管理员)编写的文档中,往往使用驼峰式(camel-case)命名法,比如 firstName。通过使用映射文件,很容易把 XML 风格的名称(比如 first-name)映射为 Java 风格的名称(比如 firstName)。最棒的一点是,不需要强迫 XML 人员像 Java 程序员那样思考,这往往比学习新的映射语法困难得多。

时间: 2024-11-01 05:17:08

实现Castor数据绑定,第3部分:模式之间的映射的相关文章

实现Castor数据绑定,第4部分:把Java对象绑定到SQL数据

本文配套源码 对于多数开发人员 - 尤其是各种Java版本的用户 - 数据绑定已经和闭包.单例(singletons).Ajax一样变为常用词汇表中的一部分了.而且和其他术语一样,数据绑定也常常被错误的定义. 特别是大部分程序员在听到数据绑定 的时候,实际上想的是XML数据绑定.加上这个小小的单词XML,造成大多数程序员忽略了相当多的功能和灵活性,尤其是如果使用 Castor API的话.这是因为对于Castor而言,XML数据绑定仅仅是其中的一部分.除了绑定到XML文档之外,Castor还提供

AP、路由、中继、桥接、客户端模式之间的区别

  AP.路由.中继.桥接.客户端模式之间的区别 在TP-Link迷你无线路由器上一般有AP(接入点)模式.Router(无线路由)模式.Repeater(中继)模式.Bridge(桥接)模式.Client(客户端)模式;但很多用户都不清楚这几种模式的之间的区别,下面将对这几种模式进行详细的介绍. 注意:有的型号的TP-Link 迷你无线路由器上只有AP(接入点)模式.Router(无线路由)模式.Repeater(中继)模式这3种模式. AP(接入点)模式 AP(接入点)模式下,只需要把一根可

Android计算器,在不销毁活动的前提下,简单模式和科学计算模式之间的变化用什么实现好?

问题描述 Android计算器,在不销毁活动的前提下,简单模式和科学计算模式之间的变化用什么实现好? 7C 就是点击变换计算模式按钮,就会变成科学计算器,但是并不会销毁重建活动. 解决方案 使用两个布局叠加,显示隐藏操作即可 解决方案二: 重写setContentView即可

Hibernate映射集合属性、映射组件属性和关联映射都是几张数据表之间的映射的问题,它们在应用上有什么区别?分别应用在什么场合?它们的效率的比较如何?

问题描述 Hibernate映射集合属性.映射组件属性和关联映射都是几张数据表之间的映射的问题,它们在应用上有什么区别?分别应用在什么场合?它们的效率的比较如何?我刚学hibernate,希望诸位前辈赐教!!! 解决方案 解决方案二:请加我QQ,我有视屏教程讲的很细解决方案三:50307924

java-用Java写一个关于数据库转接的系统,表之间的映射应该怎么做?

问题描述 用Java写一个关于数据库转接的系统,表之间的映射应该怎么做? 现在公司A想将自己的数据插入到公司B,但是两者的表结构并不完全相同,需要做一个转接来完成数据的迁移,我准备用Java来做,现在连接上数据库之后,我需要做一个表与 表之间映射,但是,这个映射应该怎么写啊,宝宝求助各路大神,在此先行谢过 解决方案 直接在数据库上就可以操作啊,根据B公司的表结构,用A公司的表构造一个表,然后导出就可以了, 如果java的话,数据量大可能导致内存溢出,不过可以将读取的数据写入文件,然后再从文件读取

super()-求教关于数据库表与实体类之间的映射的类的问题

问题描述 求教关于数据库表与实体类之间的映射的类的问题 创建Emp类,该类为数据库表Emp与实体类之间的映射,代码如下所示: public class Emp { private int empNo; private String ename; //省略····· public Emp() { super(); } public Emp(int empNo, String ename,) { super(); this.empNo = empNo; this.ename= ename; } pu

实现Castor数据绑定,第1部分:安装和设置Castor

本文配套源码 数据绑定风靡一时 在XML新闻组.邮件列表和网站的讨论论坛中(在 参考资料 中可以找到这些内容的链接),最常见的一个主题就是数据绑定.Java和XML开发人员正在寻求一种在 Java 对象与XML文档之间来回转换的简单方法. Sun 借助其 JAXB,即 Java Architecture for XML Binding(如果您在其他地方看到缩写词 JAXB,那也是正常的:Sun 似乎每年都会更改 JAXB 所代表的含义), 在数据绑定领域占据了主导地位.然而,JAXB API(如

实现Castor数据绑定,第2部分 编组和解组XML

本文配套源码 需要准备什么 开始之前需要保证具备了本文所需要的前提条件.确保满足这些要求最简单的办法就是按照本系列第一篇文章介绍的步骤操作.第一篇文章介绍了如何下载.安装和配置Castor,并用一些简单的类进行了测试. 从您手头的项目中选择一些类转换成XML 然后再转换回来也没有问题.本文(以及上一期文章)提供了一些例子,但是要掌握Castor,最好的办法是把这里学到的东西应用到您自己的项目中.首先从一些简单的对象类开始,比如代表人.唱片.图书或者某种其他具体对象的类.然后可以阅读本文中关于映射

浏览器怪异模式和标准模式之间的区别 DTD

从IE6开始,引入了Standards模式,标准模式中,浏览器尝试给符合标准的文档在规范上的正确处理达到在指定浏览器中的程度. 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差, IE6将对CSS提供更好的支持,然而这时的问题就来了,因为有很多页面是基于旧的布局方式写的,而如果IE6 支持CSS则将令这些页面显示不正常,如何在即保证不破坏现有页面,又提供新的渲染机制呢? 在写程序时我们也会经常遇到这样的问题,如何保证原来的接口不变,又提供更强大的功能,尤其是新功能不兼容旧