2006年12月04日 星期一 12:00
板桥里人
http://www.jdon.com 2002/07/27
Java与.net最大不同之处在于,Java是在开放源代码领域中成长的,所以,你不必苦苦等待某一个公司的产品开发进度,在开源领域,每天都诞生有关Java令人激动的新技术,你可以仔细研究它,可能是昙花一现,更可能是一种全新技术的发现,这种心情已经让你忘记了自己孤独的境遇。 Castor无疑是一种新的实用的概念,它的XML对象化操作和JDO概念都是令人激动的。我们这里只谈谈它的XML数据绑定技术。 对XML操作,我们已经知道SAX DOM 和JDOM, Castor有什么不同? Castore能够将XML数据映射成Java对象数据,这样你只要和Java数据对象操作,就相当于对XML数据操作,这种概念无疑方便我们将XML作为类似 数据库那样的数据源。 我们知道,现在操作 数据库通过EJB JDO来实现对Java对象数据操作,Castor为我们提供了对XML的这样的操作,这样岂不是更方便?而SAS DOM JDOM是对XML中具体数据结构进行操作,没有Castor那样完全对象化的概念。 举例说明: 有page.xml 文件如下 <homepagecollection name="this is sample"> <homepagecontent id="1"> <name>About Us</name> <navlink>1.jsp</navlink> <icon>images/icon.gif</icon> <description>An in-depth look at creating applications with XML.</description> </homepagecontent> <homepagecontent id="2"> <name>Product|Service</name> <navlink>2.jsp</navlink> <icon>images/icon.gif</icon> <description>let's tak a look at our products.</description> </homepagecontent> </homepagecollection> 这是个很典型的XML 文件,homepagecollection中有多个homepagecontent 那么使用Castor,我们只要建立两个对象,就可以对这个XML 文件进行读写操作。 public class Homepagecontent implements java.io.Serializable{ private Integer id; private String name; private String navlink; private String icon; private String description; public Homepagecontent(){ } public Integer getId(){ return id;} public void setId(){ this.id=id;} public String getName(){ return name;} public void setName(){ this.name=name;} public String getNavlink(){ return navlink;} public void setLink(){ this.navlink=navlink;} public String getIcon(){ return icon;} public void setIcon(){ this.icon=icon;} public String getDescription(){ return description;} public void setDescription(){ this.description=description;} } 上面这个Javabean中,setXXXX和getXXXX中的XXXX就是page.xml中homepagecontent中对应名称。 这个很类似于Javabean和 数据库之间的对应关系。 再来看看Homepagecollection. java public class Homepagecollection implements java.io.Serializable{ private String SiteName; private List homepagecontents = new ArrayList(); public Homepagecollection() { } // -- manipulate the List of Page objects public void addHomePageContent(Homepagecontent homepagecontent) { homepagecontents.add(homepagecontent); } public List getHomepagecontents() { return homepagecontents; } // -- manipulate the name of the address book public String getName() { return SiteName; } public void setName(String name) { this.SiteName = name; } } Homepagecollection. java就是对应page.xml 由于page.xml中Homepagecollection内包含多个Homepage, 程序里使用List来表示。 那么page.xml中的数据如何读入Homepagecollection. java中? public HomePageHandle(String mapfile,String xmlfile) throws Exception{ this.xmlfile=xmlfile; try{ mapping = new Mapping(); mapping.loadMapping(mapfile); }catch(Exception e){ throw new Exception(e.getMessage()); } } // -- page.xml中的数据读入Homepagecollection public Homepagecollection read() throws Exception{ Homepagecollection homepages=null; try{ Unmarshaller un = new Unmarshaller(Homepagecollection.class); un.setMapping(mapping); FileReader in = new FileReader(xmlfile); homepages = (Homepagecollection) un.unmarshal(in); in.close(); }catch(Exception e){ throw new Exception(e.getMessage()); } return homepages; } 注意。只要使用Unmarshaller这一句就将XML的数据读入JavaBean Homepagecollection中,这样以后只要对Homepagecollection.class进行数据操作就可以。 比如使用Homepagecollection.getName()就可以得到page.xml中的"this is sample". 是不是很方便? 注意这里要配置mapping.xml 文件: <?xml version="1.0" encoding="UTF-8"?> <mapping> <description>a map file for our new template system</description> <class name="Homepagecontent"> <map-to xml="homepagecontent"/> <field name="id" type="integer"> <bind-xml name="id" node="attribute" /> </field> <field name="name" type="string" /> <field name="navlink" type="string" /> <field name="icon" type="string" /> <field name="description" type="string" /> </class> <class name="Homepagecollection"> <map-to xml="homepagecollection"/> <field name="name" type="string"> <bind-xml name="name" node="attribute" /> </field> <field name="homepagecontents" type="Homepagecontent" collection="collection" /> </class> </mapping> 这个 文件主要让Castor来对page.xml和Homepagecollection.class Homepagecontent.class装载(Unmarshaller)或卸载(Marshaller)数据用。 |