从去年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/
                    https://jaxb.dev.java.net/
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;
	posted on 2008-02-25 17:09 
zhan 阅读(1124) 
评论(0)  编辑  收藏