从去年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 阅读(1099)
评论(0) 编辑 收藏