首页 > > > 实现 Castor 数据绑定--转-3
Castor 遗漏了什么
在改进这个例子之前 — 很有必要改进— 先看看 Castor 在 XML 中漏掉了什么:
Java 类的包。Java 包不属于类结构。这实际上是一个语义问题,和 Java 名称空间有关。因此可以将这个 XML 文档解组 — 从 XML 转换为 Java 代码 — 到任何具有相同的三个属性的Book实例,不论是什么包。
字段顺序。这是 XML 的顺序问题,和 Java 编程无关。因此尽管源文件按某种顺序列出字段,但 XML 文档可能完全不同。这对于 XML 来说至关重要,但是和Book类声明无关。
方法。和包声明一样,方法也和数据结构无关。因此 XML 文档没有涉及到这些方面,将其忽略了。
那么就要问 “那又怎么样呢?” 如果不重要,XML 忽略这些细节又有什么关系呢?但是这些信息很重要。之所以重要是因为它们提供了超出预想的更大的灵活性。可以将这些 XML 解组为满足最低要求的任何类:
类名为 “Book”(使用映射文件可以改变,但这一点后面再说)。
这个类包括三个字段:authorName、title和isbn。
仅此而已!看看能否编写满足这些要求的几个类,并改变类的其他字段或者包声明、方法……很快您就会发现这种方法使得 Castor 多么灵活。
回页首
添加更复杂的类型
Book类最明显的不足是不能存储多个作者。修改类使其能处理多个作者也很容易:
清单 4. 存储多个作者的 Book 类
package ibm.xml.castor;import java.util.LinkedList;
import java.util.List;public class Book { /** The book's ISBN */ private String isbn; /** The book's title */ private String title; /** The authors' names */ privateList authorNames;public Book(String isbn, String title, List authorNames) {
this.isbn = isbn;
this.title = title;
this.authorNames = authorNames;
}public Book(String isbn, String title, String authorName) { this.isbn = isbn; this.title = title;this.authorNames = new LinkedList();
authorNames.add(authorName);} public String getIsbn() { return isbn; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void setAuthorNames(List authorNames) { this.authorNames = authorNames; } publicListgetAuthorNames() { return authorNames; }public void addAuthorName(String authorName) {
authorNames.add(authorName);
}}
如果使用 Java 5 或 6 技术,将会显示一些未检查/不安全操作的错误,因为这段代码没有使用参数化的 Lists。如果愿意可以自己增加这些代码。
这样的修改很简单,不需要对编组代码作任何修改。但是,有必要用一本多人编写的图书来验证 Castor 编组器能否处理集合。修改BookMarshaller类如下:
清单 5. 处理收集器的 Book 类
package ibm.xml.castor;import java.io.FileWriter;import java.util.ArrayList;
import java.util.List;import org.exolab.castor.xml.Marshaller;public class BookMarshaller { public static void main(String[] args) { try { Book book = new Book("9780312347482", "Power Play", "Joseph Finder"); FileWriter writer = new FileWriter("book.xml"); Marshaller.marshal(book, writer);List book2Authors = new ArrayList();
book2Authors.add("Douglas Preston");
book2Authors.add("Lincoln Child");
Book book2 = new Book("9780446618502", "The Book of the Dead",
book2Authors);
writer = new FileWriter("book2.xml");
Marshaller.marshal(book2, writer);} catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(System.err); } }}
第一本书的处理方式没有变,重新打开book.xml将看到和原来相同的结果。打开book2.xml看看 Castor 如何处理集合:
清单 6. 带有收集器的 XML 结果
<?xml version="1.0" encoding="UTF-8"?>
<book><isbn>9780446618502</isbn><title>The Book of the Dead</title>
<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Douglas Preston</author-names>
<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Lincoln Child</author-names>
</book>
显然,Castor 处理作者姓名列表没有问题。更重要的是,Castor 不仅为作者名称创建了一个 blanket 容器,这个框架实际上看到了列表的内部,并认识到内容是字符串(要记住,这不是参数化列表,Castor 必须自己确定列表成员的类型)。因此 XML 进行了一些非常具体的类型化工作。这是个不错的特性,尤其是如果需要将 XML 转化回 Java 代码之前进行一些处理的话。
回页首
添加自定义类
我们朝着真正实用的程序再前进一步。存储字符串作者姓名肯定最终会出现重复的数据(多数作者写了不只一本书)。清单 7 增加了一个新的类Author。
清单 7. Author 类
package ibm.xml.castor;
public class Author {
private String firstName, lastName;
private int totalSales;
public Author(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setTotalSales(int totalSales) {
this.totalSales = totalSales;
}
public void addToSales(int additionalSales) {
this.totalSales += additionalSales;
}
public int getTotalSales() {
return totalSales;
}
}
是不是很简单?在Book类的下面作上述修改以便能够使用新的Author类。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3160905/ ,如需转载,请注明出处,否则将追究法律责任。