從去年12月份還是學(xué)習(xí)Java到現(xiàn)在已經(jīng)將近3個月了,現(xiàn)在已經(jīng)很有必要對以前所學(xué)的知識進行一次系統(tǒng)的復(fù)習(xí)。而重新復(fù)習(xí)最好的辦法就是將最近剛完成,但不完善的Xml數(shù)據(jù)配置的Web程序,進行一次重構(gòu)。
其中需要重新復(fù)習(xí)的知識主要內(nèi)容如下:
1.
Jaxb
2.
Xml,Sechema
3.
JSF(JavaServer Faces)
4.
Html ,CSS ,Javascript
5.
Java: a) 類的繼承
b) 反射:實現(xiàn)內(nèi)存列表的搜索。
1、知識回顧
1.1 JAXB
1.簡介:(Java Architecture for XML Binding) 是一個業(yè)界的標準,是一項可以根據(jù)XML
Schema產(chǎn)生Java類的技術(shù)。結(jié)構(gòu)圖如圖1-1。
結(jié)構(gòu)圖如圖1-1
2.參考資源:http://java.sun.com/developer/technicalArticles/WebServices/jaxb/
https://jaxb.dev.java.net/
3.例子:將一個xml文件轉(zhuǎn)換成一個Java類。
a) xml文件結(jié)構(gòu)
VOUTPUT.xml文件:
<?xml
version="1.0" encoding="UTF-8"
standalone="yes"?>
<VOutput>
<Items>
<ObjVOutput>
<REF>1</REF>
<Station_ID>80001</Station_ID>
<PHYSICAL_OUTPUT_CHANNEL>4</PHYSICAL_OUTPUT_CHANNEL>
<DEVICE_TYPE>Monitor</DEVICE_TYPE>
<output_device_type>21</output_device_type>
<OUTPUT_DEVICE_NUMBER>4</OUTPUT_DEVICE_NUMBER>
<DESCRIPTION>Monitor-4</DESCRIPTION>
……
</ObjVOutput>
<ObjVOutput>
<REF>1</REF>
<Station_ID>80001</Station_ID>
<PHYSICAL_OUTPUT_CHANNEL>4</PHYSICAL_OUTPUT_CHANNEL>
……
</ObjVOutput>
……
</Items>
</VOutput>
b)
Schema-Derived Classes(與XML Schema對應(yīng)的類)
(1)生成VOUTPUT.xsd:
VOUTPUT.xsd文件:
<?xml
version="1.0" standalone="yes"?>
<xs:schema
id="VOutput" xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="VOutput"
>
<xs:complexType>
<xs:choice>
<xs:element
name="Items" type="ItemsType">
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:complexType
name="ItemsType">
<xs:sequence>
<xs:element name="ObjVOutput"
type="ObjVOutputType"
minOccurs="0"
maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType
name="ObjVOutputType">
<xs:sequence>
<xs:element
name="REF" type="xs:int" minOccurs="0" />
<xs:element
name="Station_ID" type="xs:int"
minOccurs="0"
/>
<xs:element
name="PHYSICAL_OUTPUT_CHANNEL" type="xs:int"
minOccurs="0"
/>
<xs:element
name="DEVICE_TYPE" type="DeviceType"
minOccurs="0"
/>
……
</xs:sequence>
</xs:complexType>
<xs:simpleType
name="DeviceType">
<xs:restriction
base="xs:string">
<xs:enumeration
value="Monitor" />
<xs:enumeration
value="VCR" />
<xs:enumeration
value="Standard Device" />
<xs:enumeration
value="Smart Device" />
<xs:enumeration
value="Trunk" />
<xs:enumeration
value="Standby VCR" />
<!-- and so on
... -->
</xs:restriction>
</xs:simpleType>
</xs:schema>
在這里我是先通過c#的小程序生產(chǎn)一個xsd文件,然后再對其進行簡單的修改。
C#程序很簡單,代碼如下:
System.Data.DataSet ds = new
System.Data.DataSet();
ds.ReadXml(xmlfile); //xmlfile表示xml文件的路徑
ds.WriteXmlSchema(xsdfile);//xsdfile表示要存儲的xsd文件的路徑
通過代碼生成的xsd文件需要進一步修改。
有關(guān)XML Schema學(xué)習(xí)資源參考:http://www.w3schools.com/xpath/default.asp
(2)根據(jù)schema文件xsd生成java文件
這里通過小工具“xjc”實現(xiàn),下載地址:https://jaxb.dev.java.net/ 下載后可以在…jaxb-ri-20071219"bin"文件夾下找到。使用示例:
xjc -d
"D:"... "imatrix"src" -p " jaxb.voutput" "D:"... "VOUTPUT.xsd"
-d
<dir> 指定生成的文件的存放路徑
“D:"... "imatrix"src”: 表示java文件生成后導(dǎo)入的文件夾
-p
<pkg> 指定目標包
"D:"...
"VOUTPUT.xsd":表示schema文件路徑(包括文件名)。
最后生成的java文件圖1-2所示:
圖1-2
C)代碼分析:
VOutput.java:
@XmlRootElement(name = "VOutput")
publicclass VOutput {
@XmlElement(name = "Items")
protected ItemsType items;
public ItemsType getItems() {
returnitems;
}
publicvoid setItems(ItemsType value) {
this.items = value;
}
}
ItemsType.java
publicclass ItemsType {
@XmlElement(name = "ObjVOutput")
protected List<ObjVOutputType> objVOutput;
public List<ObjVOutputType>
getObjVOutput() {
if (objVOutput == null) {
objVOutput = new ArrayList<ObjVOutputType>();
}
returnthis.objVOutput;
}
}
ObjVOutputType.java
publicclass ObjVOutputType {
@XmlElement(name = "REF")
protected Integer ref;
@XmlElement(name = "Station_ID")
protected Integer stationID;
@XmlElement(name = "PHYSICAL_OUTPUT_CHANNEL")
protected Integer physicaloutputchannel;
……
public Integer getREF() {
returnref;
}
publicvoid setREF(Integer value) {
this.ref = value;
}
public Integer getStationID() {
returnstationID;
}
……
publicvoid setRecordLockFlags(Integer value) {
this.recordLockFlags = value;
}
public Integer getValidRecord() {
returnvalidRecord;
}
publicvoid setValidRecord(Integer value) {
this.validRecord = value;
}
}
DeviceType.java
@XmlType(name = "DeviceType")
@XmlEnum
publicenum DeviceType {
@XmlEnumValue("Monitor")
MONITOR("Monitor"),
VCR("VCR"),
@XmlEnumValue("Standard Device")
STANDARD_DEVICE("Standard Device"),
@XmlEnumValue("Smart Device")
SMART_DEVICE("Smart Device"),
@XmlEnumValue("Trunk")
TRUNK("Trunk"),
@XmlEnumValue("Standby VCR")
STANDBY_VCR("Standby VCR");
privatefinal String value;
DeviceType(String v) {
value = v;
}
public String value() {
returnvalue;
}
publicstatic DeviceType fromValue(String v) {
for (DeviceType c: DeviceType.values())
{
if (c.value.equals(v)) {
return c;
}
}
thrownew IllegalArgumentException(v);
}
}
d)應(yīng)用示例:
protected JAXBContext jaxbcontext;
Object voutputElement = null;
//jaxbpackage:package名稱
jaxbcontext = JAXBContext.newInstance(jaxbpackage);
Unmarshaller um = jaxbcontext.createUnmarshaller();
// xmlfileName:xml文件路徑
voutputElement = um.unmarshal(new fileInputStream(xmlfileName));
VOutput vOutput = (VOutput) voutputElement;
posted on 2008-02-25 17:09
zhan 閱讀(1106)
評論(0) 編輯 收藏