從去年12月份還是學習Java到現在已經將近3個月了,現在已經很有必要對以前所學的知識進行一次系統的復習。而重新復習最好的辦法就是將最近剛完成,但不完善的Xml數據配置的Web程序,進行一次重構。
其中需要重新復習的知識主要內容如下:
1. Jaxb
2. Xml,Sechema
3. JSF(JavaServer Faces)
4. Html ,CSS ,Javascript
5. Java: a) 類的繼承
b) 反射:實現內存列表的搜索。
1、知識回顧
1.1 JAXB
1.簡介:(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。結構圖如圖1-1。
結構圖如圖1-1
2.參考資源:http://java.sun.com/developer/technicalArticles/WebServices/jaxb/
3.例子:將一個xml文件轉換成一個Java類。
a) xml文件結構
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對應的類)
(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#的小程序生產一個xsd文件,然后再對其進行簡單的修改。
C#程序很簡單,代碼如下:
System.Data.DataSet ds = new System.Data.DataSet();
ds.ReadXml(xmlfile); //xmlfile表示xml文件的路徑
ds.WriteXmlSchema(xsdfile);//xsdfile表示要存儲的xsd文件的路徑
通過代碼生成的xsd文件需要進一步修改。
有關XML Schema學習資源參考:http://www.w3schools.com/xpath/default.asp
(2)根據schema文件xsd生成java文件
這里通過小工具“xjc”實現,下載地址: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文件生成后導入的文件夾
-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)應用示例:
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;