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)數據用。