`
caiying0504
  • 浏览: 341464 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WebService CXF学习(进阶篇4):JAXB剖析

阅读更多
前面几节我们讲解对象传递,但是通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传递JSON对象。这节我只针对传递XML,那么JAVA绑定成XML,服务端将XML解析成Java对象有什么工具可用吗,其实这样的工具多的是。这里我选择一个比较简单的JAXB工具来讲解一下。
    JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法,以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。
    这里有几个重要的定义:
    编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。工作原理如下图所示:



    解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。工作原理如下图所示:




    往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循 环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。
    下载地址:http://java.sun.com/developer/technicalArticles/WebServices/jaxb/
  
    我们还以例子来说明它的工作原理,直观点。
    第一步,创建一个Customer对象
    Java代码 
@XmlRootElement(name="customer")   
@XmlAccessorType(XmlAccessType.FIELD)   
@XmlType(name = "")   
public class Customer {   
  
    @XmlAttribute(required = true)   
    protected String name;   
    @XmlAttribute(required = true)   
    protected int age;   
  
    /**  
     * Gets the value of the name property.  
     *   
     * @return  
     *     possible object is  
     *     {@link String }  
     *       
     */  
    public String getName() {   
        return name;   
    }   
  
    /**  
     * Sets the value of the name property.  
     *   
     * @param value  
     *     allowed object is  
     *     {@link String }  
     *       
     */  
    public void setName(String value) {   
        this.name = value;   
    }   
  
    /**  
     * Gets the value of the age property.  
     *   
     */  
    public int getAge() {   
        return age;   
    }   
  
    /**  
     * Sets the value of the age property.  
     *   
     */  
    public void setAge(int value) {   
        this.age = value;   
    }   
  
}   
  
      

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class Customer {

    @XmlAttribute(required = true)
    protected String name;
    @XmlAttribute(required = true)
    protected int age;

    /**
     * Gets the value of the name property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the value of the name property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setName(String value) {
        this.name = value;
    }

    /**
     * Gets the value of the age property.
     * 
     */
    public int getAge() {
        return age;
    }

    /**
     * Sets the value of the age property.
     * 
     */
    public void setAge(int value) {
        this.age = value;
    }

}
   

    第二步,创建一个测试类
Java代码 
public class SoapClient {   
  
    private final static String MODEL = "com.itdcl.model";   
    public static void main(String[] args) throws ParserConfigurationException, JAXBException, TransformerException{   
  
           
        ObjectFactory factory = new ObjectFactory();   
        Customer customer = factory.createCustomer();   
        customer.setAge(20);   
        customer.setName("Josen");   
  
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
        dbf.setNamespaceAware(true);   
        DocumentBuilder db = dbf.newDocumentBuilder();   
        Document doc = db.newDocument();   
  
        JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);   
        //Java对象转换成XML   
                Marshaller marshaller = jaxbContext.createMarshaller();   
        marshaller.marshal(customer, doc);   
           
        DOMSource domSource = new DOMSource(doc);   
        StringWriter writer = new StringWriter();   
        StreamResult result = new StreamResult(writer);   
        TransformerFactory tf = TransformerFactory.newInstance();   
        Transformer transformer = tf.newTransformer();   
        transformer.transform(domSource, result);   
        String xmlString = writer.toString();   
        System.out.println(xmlString);   
        //XML转换成Java对象   
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();   
        StringReader reader = new StringReader(xmlString);   
        Customer cus = (Customer)unmarshaller.unmarshal(reader);   
        System.out.println("Age:"+cus.getAge());   
        System.out.println("Name:"+cus.getName());   
           
           
    }   
}  

public class SoapClient {

	private final static String MODEL = "com.itdcl.model";
	public static void main(String[] args) throws ParserConfigurationException, JAXBException, TransformerException{

		
		ObjectFactory factory = new ObjectFactory();
		Customer customer = factory.createCustomer();
		customer.setAge(20);
		customer.setName("Josen");

		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setNamespaceAware(true);
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.newDocument();

		JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);
		//Java对象转换成XML
                Marshaller marshaller = jaxbContext.createMarshaller();
		marshaller.marshal(customer, doc);
		
		DOMSource domSource = new DOMSource(doc);
		StringWriter writer = new StringWriter();
		StreamResult result = new StreamResult(writer);
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		transformer.transform(domSource, result);
		String xmlString = writer.toString();
		System.out.println(xmlString);
		//XML转换成Java对象
		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		StringReader reader = new StringReader(xmlString);
		Customer cus = (Customer)unmarshaller.unmarshal(reader);
		System.out.println("Age:"+cus.getAge());
		System.out.println("Name:"+cus.getName());
		
		
	}
}

      第三步,运行一个测试类,看看效果如何。Java与XML之间转换如此简单

      编组操作:利用上面生成的java文件执行编组操作。
Java代码 
JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);   
//Java对象转换成XML   
              Marshaller marshaller = jaxbContext.createMarshaller();   
marshaller.marshal(customer, doc);   
  
DOMSource domSource = new DOMSource(doc);   
StringWriter writer = new StringWriter();   
StreamResult result = new StreamResult(writer);   
TransformerFactory tf = TransformerFactory.newInstance();   
Transformer transformer = tf.newTransformer();   
transformer.transform(domSource, result);   
String xmlString = writer.toString();   
System.out.println(xmlString);  

		JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);
		//Java对象转换成XML
                Marshaller marshaller = jaxbContext.createMarshaller();
		marshaller.marshal(customer, doc);
		
		DOMSource domSource = new DOMSource(doc);
		StringWriter writer = new StringWriter();
		StreamResult result = new StreamResult(writer);
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		transformer.transform(domSource, result);
		String xmlString = writer.toString();
		System.out.println(xmlString);

     解组操作:通过xml文件执行解组操作。
    Java代码 
             JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);   
              Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();   
StringReader reader = new StringReader(xmlString);   
Customer cus = (Customer)unmarshaller.unmarshal(reader);   
System.out.println("Age:"+cus.getAge());   
System.out.println("Name:"+cus.getName());  

                JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);
                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		StringReader reader = new StringReader(xmlString);
		Customer cus = (Customer)unmarshaller.unmarshal(reader);
		System.out.println("Age:"+cus.getAge());
		System.out.println("Name:"+cus.getName());

   也可通过Ant配置来解组,如下:
Java代码 
<?xml version="1.0" encoding="utf-8" ?>   
<project default="xjc-compile" basedir=".">   
    <property name="src.dir" location="src" />   
    <property name="lib.dir" location="E:/cxf-lib" />   
    <property name="xml-schema.dir" location="src/WEB-INF" />   
    <property name="schema.name" value="cxfdemo.xsd" />   
    <property name="package" value="com.itdcl.model" />   
  
    <path id="classpath">   
        <fileset dir="${lib.dir}" includes="*.jar" />   
    </path>   
    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"  
        classpathref="classpath" />   
           
    <target name="xjc-compile">   
        <echo message="Build Jaxb Class from Schema" />   
        <xjc schema="${xml-schema.dir}/${schema.name}"  
            destdir="${src.dir}" package="${package}" >   
            <produces dir="src/com/itdcl/model" includes="*" />   
        </xjc>   
    </target>   
</project>  
分享到:
评论
2 楼 84707227 2011-08-28  
和这边文章同一个系列的文章都是很多问题
1 楼 84707227 2011-08-28  
写这篇文章的作者可以审核一下吗?里面的问题太多了

相关推荐

    WebService CXF学习文档

    做开发时,查了大量资料,发现一比较全面的资料,分享一下! WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 ...WebService CXF学习——JAXB剖析

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...

    Webservice笔记含使用cxf和jaxws两种方式开发webservice【源代码+笔记】

    Webservice的使用场景分析(掌握) 学会jaxws基本开发方法(重点) Soap1.1和soap1.2区别: 跟踪soap协议 综合案例: 使用webservice传输xml数据(重点掌握) 第二天: Jaxws的深入开发: 常用注解 测试...

    webservice cxf 开发实战

    4. **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding),用于自动将XML数据转换为Java对象。 5. **安全集成**:CXF集成了多种安全机制,如WS-Security、OAuth等,可以实现认证、...

    CXF各种资料.rar

    "WebService之CXF开发指南.doc", "Cxf应用整理.doc", "CXF+WebService+-+release.docx", "基于spring+cxf实现用户文件传输的webservice.docx"是关于CXF的详细学习文档,涵盖了从基础概念到高级特性的讲解,以及具体...

    基于CXF的webService本地数据交互----PC端与Android端(二)

    在本篇博文中,我们将深入探讨如何利用Apache CXF实现Web Service进行本地数据交互,特别是在PC端和Android端之间的通信。Apache CXF是一个开源框架,它允许开发人员创建和消费各种Web服务,包括SOAP和RESTful风格的...

    CXF_src_WebService

    3. **扩展机制**:学习CXF的插件体系,了解如何自定义拦截器、数据绑定、协议处理等,以满足特定需求。 4. **调试技巧**:通过阅读源码,学习如何调试CXF服务,找出问题所在,提高问题定位和解决效率。 总之,解压...

    WebService发布框架CXF的源码

    **WebService发布框架CXF源码解析** Apache CXF是一个开源的Web服务框架,它使得开发者能够轻松地创建和部署高质量的、与标准兼容的Web服务。CXF支持多种Web服务规范,包括SOAP、WSDL、WS-Security等,以及RESTful...

    cxf webService

    通过分析和学习这个示例,你可以更深入地理解CXF的工作原理和使用方法。 总的来说,Apache CXF是一个强大的Web服务框架,它简化了Web服务的开发和部署过程,同时提供了丰富的功能和良好的扩展性。无论你是新手还是...

    cxf 小案例 java webservice

    本篇文章将深入探讨如何使用CXF来创建一个简单的Java WebService,并介绍相关的知识点。 一、Apache CXF简介 Apache CXF是一个全面的开源服务框架,它允许开发者构建和部署SOAP和RESTful Web服务。CXF提供了多种...

    Spring+cxf请求webService

    4. **实例代码分析** 下面是一个简单的Spring配置示例,用于创建CXF客户端: ```xml &lt;bean id="serviceProxy" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"&gt; &lt;property name="address" value="http:...

    WebService源码和笔记.zip

    4. **WebService开发工具**:如使用Apache CXF、Gson、JAXB等工具进行WebService的开发和调试。 5. **安全性考虑**:介绍如何在WebService中实现安全机制,如HTTPS加密、WS-Security(SOAP消息的安全标准)等。 6....

    cxf 源码 java websevice

    总之,Apache CXF的源代码分析对于Java Web服务开发人员来说是一次深入学习和提升技能的机会。通过探索源码,开发者可以更全面地理解Web服务的工作原理,从而更好地利用CXF创建高效、可维护的Web服务应用。

    cxf-demo 比较实用的webservice例子

    通过分析这个示例,开发者可以了解到CXF如何处理XML绑定(如JAXB),如何处理WS-*协议(如SOAP,WS-Security),以及如何利用CXF的工具生成客户端代码。此外,还可以学习到CXF如何与Spring框架集成,以实现更灵活的...

    cxf-uw-ws-soap

    【cxf-uw-ws-soap】:Apache CXF与SOAP Web服务详解 Apache CXF是一个开源的Java框架,主要用于构建和开发Web服务。在"cxg-uw-ws-soap"这个主题中,我们主要关注的是CXF如何实现基于SOAP(Simple Object Access ...

    CXF框架开发WebService概述及代码

    在Java领域,虽然有多种框架可用于开发WebService,如AXIS、XFire等,但本篇重点讨论的是CXF框架。 #### Apache CXF框架起源与发展 Apache CXF项目源自ObjectWeb Celtix与CodeHaus XFire两大开源项目的合并。...

    cxf + spring 例子

    4. **创建CXF服务**:首先,定义一个Java接口作为服务接口,然后创建其实现类。使用JAX-WS注解(如@WebService)来标记接口和实现类,定义服务的元数据。 5. **配置CXF服务**:在Spring的XML配置文件中,使用`...

    cxf入门使用代码展示

    3. 数据绑定:CXF支持多种数据绑定机制,如JAXB,它可以自动将XML数据转换为Java对象,反之亦然。 4. 安全性:项目可能还涉及了如何使用CXF实现安全特性,如基本认证、SSL/TLS加密和WS-Security。 在“MyCxf”这个...

    java cxf 源码

    在学习和分析“CXF_Spring_Survey”项目源码时,可以关注以下几个方面: 1. **服务发布与配置**:查看Spring配置文件,了解如何定义CXF服务并将其绑定到特定端点。 2. **客户端调用**:研究客户端代码,理解如何...

    WebService服务器端程序

    3. **CXF配置**:使用Spring配置文件(如applicationContext.xml)来配置CXF,包括服务发布地址、数据绑定机制(如JAXB)、异常处理等。 4. **Spring Bean管理**:Spring容器管理服务实例的生命周期,可以方便地...

Global site tag (gtag.js) - Google Analytics