由于XML在分布式系统中应用如此广泛,而java又是开发网络和分布式系统可选的最佳运行环境之一,因此,java提供了很多的库,使编程人员能够轻松处理XML数据。在早期,java主要以JAXP定义的相关接口和类处理XML文档。JAXP中包括基于树结构的DOM和基于流方式的SAX和StAX。随着面向对象技术的不断发展,像JAXP这样低层次的XML处理方式,无法满足日益增长的程序规模的需求,因此XOM(XML文档和对象映射)被提出,Java通过对XOM的需求的研究(JSR222),提出了JAXB框架。JAXB框架主要是解决java对象与XML文档映射问题。
1、编写schema文档
我们打算创建两个数据模型,一个是student.xsd,描述了关于student的定义,一个是teacher.xsd描述teacher的定义。定义两个xsd文件的目的是为了解释一个JAXBContent能包含多个根元素,并没有特殊意义。
Student.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</xsd:schema>
Teacher.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>
2. 使用xjc编译生成java类
I:\programs\eclipse\SpringJAXBTest\src>xjc -p cn.edu.upc.upcgrid.guan.springjaxb
.student
xjc (XML to Java Compiler)是java提供的工具,在java安装后就可以使用这个工具(注意要将java的环境变量配置正确),-p 后面的参数是生成类的包名和转换的schema文件的路径。
I:\programs\eclipse\SpringJAXBTest\src>xjc -p com.upc.upcgrid.guan.springjaxb.st
udent Teacher.xsd
Student.java类的内容大致如下:
package com.upc.upcgrid.guan.springjaxb.student;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="student")
public class Student {
}
生成的Teacher.java类的大致内容如下:
package com.upc.upcgrid.guan.springjaxb.student;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
})
@XmlRootElement(name = "teacher")
public class Teacher {
}
可以看出,xjc生成的Teacher和Student类只不过是一些get和set方法,并且添加了一些标记(在JAXB中,如果会使用这些标记,可以在自定义的类中使用这些标记,就不用定义schema)。
3. 配置Spring环境
这里为了简单起见,我们不使用XML方式配置Spring,而是采用Annotation的方式对Spring进行配置。
这里有两个类,SpringConfigure用来替代以前的spring-servlet.xml(就是spring的配置文档)。为了方便使用,我们又创建一个spring的注入类MarshalAndUnmarshalServi
Spring的配置文件SpringConfigure.java
package com.upc.upcgrid.guan.springjaxb;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import com.upc.upcgrid.guan.springjaxb.student.Student;
import com.upc.upcgrid.guan.springjaxb.student.Teacher;
@Configuration
public class SpringConfigure {
}
MarshalAndUnmarshalServi
package com.upc.upcgrid.guan.springjaxb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.stereotype.Component;
@Component
public class MarshalAndUnmarshalServi
}
4. 编写测试程序。
package com.upc.upcgrid.guan.springjaxb;
import java.io.File;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicat
import org.springframework.oxm.XmlMappingException;
import com.upc.upcgrid.guan.springjaxb.student.Student;
import com.upc.upcgrid.guan.springjaxb.student.Teacher;
public class MainTest {
}
标准输出:
2011-6-23 20:22:54 org.springframework.context.support.AbstractApplicationConte
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicat
2011-6-23 20:22:54 org.springframework.beans.factory.support.DefaultListableBeanFacto
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFacto
2011-6-23 20:22:54 org.springframework.oxm.jaxb.Jaxb2Marshaller createJaxbContextFromCla
信息: Creating JAXBContext with classes to be bound [class com.upc.upcgrid.guan.springjaxb.student.Student,class com.upc.upcgrid.guan.springjaxb.student.Teacher]
mary
Lucy
生成的XML文档:
Student.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student id="21231">
</student>
Teacher.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<teacher>
</teacher>
程序结构:
参考:
Spring官方文档
JAXB官方文档:http://jaxb.java.net/tutorial/index.html