`

使用 XML 通过 Java 类定义 Web服务

阅读更多

Java 类

这里提供了一些 Java 类,用于构成一个简单的 Web 服务 Java 项目。使用什么样的 Java 类并无大障,您也可以使用自己创建的 Java 类。本文使用的项目含有三个类:OneWayRequest 类、TwoWayRequest 类和 TwoWayResponse 类。按顺序看看每个类,我们先从 OneWayRequest 类开始(参见清单 1)。


清单 1. OneWayRequest Java 类
                
package com.ibm.devWorks.xml.simpleService;

public class OneWayRequest {
  protected String requestData;

  public String getRequestData() {
    return this.requestData;
  }

  public void setRequestData(String requestData) {
    this.requestData = requestData;
  }

}

上面的代码中只含有一个字段,即 requestData,它包含了请求的数据。该类有两个方法:一个用于设置字段值,另一个用于检索字段值。

接下来再看一看清单 2 中的 TwoWayRequest 类。


清单 2. TwoWayRequest Java 类
                

package com.ibm.devWorks.xml.simpleService;

public class TwoWayRequest {
  protected String echoString;
  protected boolean booolean;

  public boolean getBooolean() {
    return this.booolean;
  }

  public void setBooolean(boolean booolean) {
    this.booolean = booolean;
  }

  public String getEchoString() {
    return this.echoString;
  }

  public void setEchoString(String echoString) {
    this.echoString = echoString;
  }

}

这个类要稍长一点,它定义了两个字段:一个是 echoString,另一个是 booolean。与第一个类相同,该类为每个字段都定义了一个 getter 和一个 setter 方法。

清单 3 显示了最后一个类,即 TwoWayResponse 类。


清单 3. TwoWayResponse Java 类
                
package com.ibm.devWorks.xml.simpleService;

public class TwoWayResponse {
  protected String echoString;
  protected boolean invertedBoolean;

  public boolean getInvertedBoolean() {
    return this.invertedBoolean;
  }

  public void setInvertedBoolean(boolean invertedBoolean) {
    this.invertedBoolean = invertedBoolean;
  }

  public String getEchoString() {
    return this.echoString;
  }

  public void setEchoString(String echoString) {
    this.echoString = echoString;
  }

}

这个类与前一个 TwoWayRequest 类相当类似,不过这是没有必要的。响应类中可能会包含一项数据库记录中的一些数据项。这样,Java 类就完成了! 接下来,我们将介绍用于将这些类作为 Web 服务公开的 WSDL。


通过 WSDL 将 Java 类作为服务公开。

在本系统文章的第 2 部分中,我们将使用 Axis2 读取在本节中创建的 WSDL,用以创建 Web 服务的一个 Java 实现。

在深入学习之前,我们需要先了解一些关于 Web 服务的知识。OneWayRequest 类表示一个单向的 Web 服务操作,它只有一个请求,用于发送字段中的请求数据 requestDataTwoWayRequest 类和 TwoWayResponse 类表示一个双向的 Web 服务操作,它有一个请求和一个响应,响应中的 echoString 字段与请求中的 echoString 字段有着相同的值。响应中的 invertedBoolean 字段值与请求中的 invertedBoolean 字段值相反(如果请求中的 invertedBoolean 字段值为假,则响应中发送的 invertedBoolean 字段值为真)。

接下来回到 WSDL,我们首先需要建立名称空间,如清单 4 如示。


清单 4. 定义 WSDL 的名称空间。
                
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
   xmlns:apachesoap="http://xml.apache.org/xml-soap"
   xmlns:impl="http://ibm.com/developerWorks/xml/SimpleService"
   xmlns:intf="http://ibm.com/developerWorks/xml/SimpleService"
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://ibm.com/developerWorks/xml/SimpleService">
...

这基本上准备好了 WSDL,稍后我们将在 WSDL 中引用名称空间。当 Axis2 读取 WSDL 文件时,它需要知道我们引用的名称空间的值。

接下来,定义模式,如清单 5 所示。


清单 5. 定义模式
                
   targetNamespace="http://ibm.com/developerWorks/xml/SimpleService">
  <wsdl:types>
    <schema
       elementFormDefault="qualified"
       targetNamespace="http://ibm.com/developerWorks/xml/SimpleService"
       xmlns="http://www.w3.org/2001/XMLSchema">
      
      <!-- ELEMENTS -->
      
      <element name="OneWayRequest">
        <complexType>
          <sequence>
            <element name="requestData" type="xsd:string"/>
          </sequence>
        </complexType>
      </element>
      
      <element name="TwoWayRequest">
        <complexType>
          <sequence>
            <element name="echoString" type="xsd:string"/>
            <element name="booolean" type="xsd:boolean"/>
          </sequence>
        </complexType>
      </element>
      <element name="TwoWayResponse">
        <complexType>
          <sequence>
            <element name="echoString" type="xsd:string"/>
            <element name="invertedBoolean" type="xsd:boolean"/>
          </sequence>
        </complexType>
      </element>

    </schema>
  </wsdl:types>
...

您应该对此代码比较熟悉。这在本质上是通过模式定义的 Java 类。请注意,Java 类中的字段匹配上述模式元素中子元素。还需注意,名称空间为 http://ibm.com/developerWorks/xml/SimpleService,在您创建了 JiBX 定义描述之后将发现它的重要性。

此时再定义消息、端口类型、绑定和 WSDL 服务(如清单 6 所示)。


清单 6. 完成 WSDL 定义
                
...
  </wsdl:types>

  <!-- MESSAGES -->

  <wsdl:message name="OneWayRequestMessage">
    <wsdl:part name="input" element="impl:OneWayRequest"/>
  </wsdl:message>

  <wsdl:message name="TwoWayRequestMessage">
    <wsdl:part name="input" element="impl:TwoWayRequest"/>
  </wsdl:message>
  <wsdl:message name="TwoWayResponseMessage">
    <wsdl:part name="output" element="impl:TwoWayResponse"/>
  </wsdl:message>

  <!-- Port type (operations) -->

  <wsdl:portType name="SimpleServicePortType">

    <wsdl:operation name="OneWay" parameterOrder="input">
      <wsdl:input name="OneWayRequestMessage"
                  message="impl:OneWayRequestMessage"/>
    </wsdl:operation>

    <wsdl:operation name="TwoWay" parameterOrder="input">
      <wsdl:input name="TwoWayRequestMessage"
                  message="impl:TwoWayRequestMessage"/>
      <wsdl:output name="TwoWayResponseMessage"
                   message="impl:TwoWayResponseMessage"/>
    </wsdl:operation>

  </wsdl:portType>

  <!-- BINDING (bind operations) -->

  <wsdl:binding
     name="SimpleServiceSoapBinding"
     type="impl:SimpleServicePortType">
    <wsdlsoap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="OneWay">
      <wsdlsoap:operation soapAction="OneWay"/>
      <wsdl:input>
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
    </wsdl:operation>

    <wsdl:operation name="TwoWay">
      <wsdlsoap:operation soapAction="TwoWay"/>
      <wsdl:input>
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <!-- SERVICE -->

  <wsdl:service name="SimpleService">
    <wsdl:port binding="impl:SimpleServiceSoapBinding"
               name="SimpleService">
      <wsdlsoap:address location="http://localhost:8080/axis2/services/SimpleService"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

定义的消息映射到模式中的请求和响应元素,由端口类型定义使用,每项操作的输入和输出都映射一个消息。绑定部分在本质上映射一项 SOAP 操作,确切定义了绑定服务的协议和传输方法及其相关操作。最后,服务部分指定了可用服务,展示了每个服务的服务端点(可以访问到服务的 URL)。

这样便完成了该 Web 服务的定义。接下来,我们将把 XML 映射到 Java 类,以便在本系列的下一部分中使用 JiBX 进行数据绑定。




创建 JiBX 定义描述

JiBX 定义描述的主要目的是将 Java 类映射到名称空间,包括任何期望的字段。在看了本节创建的文件之后,您会将了解更多。首先,看一看 OneWayRequest 类是如何映射的(如清单 7 所示)。


清单 7. 映射 OneWayRequest Java 类
                

<?xml version="1.0" encoding="UTF-8"?>
<binding>
  <mapping name="OneWayRequest"
           class="com.ibm.devWorks.xml.simpleService.OneWayRequest">
    <namespace uri="http://ibm.com/developerWorks/xml/SimpleService"
               default="elements"/>
    <value name="requestData" field="requestData" usage="required"/>
  </mapping>
...

mapping 标签中的 name 属性指定了与 OneWayRequest 元素(位于清单 5 中创建的 WSDL 模式中)直接相关联的元素的名称。class 属性将元素与 Java 类映射起来,Java 类如 清单 1 所示。namespace 标签中的 uri 属性映射的名称空间为 http://ibm.com/developerWorks/xml/SimpleService,与清单 5 中 OneWayRequest 元素的名称空间是一样的。最后,能看到 requestData 子元素(位于 清单 5 中的 WSDL)是如何映射到 Java 类中的 requestData 字段(位于 清单 1 中的 value 标签)中的。name 属性指定了 WSDL 中的子元素,field 属性指定了 Java 类中的字段名称。

接下来,我们将介绍其它两个 Java 类是如何映射的,如清单 8 所示。


清单 8. 映射 TwoWayRequest 和 TwoWayResponse Java 类
                
...
  <mapping name="TwoWayRequest" 
           class="com.ibm.devWorks.xml.simpleService.TwoWayRequest">
    <namespace uri="http://ibm.com/developerWorks/xml/SimpleService" 
               default="elements"/>
    <value name="echoString" field="echoString" usage="required"/>
    <value name="booolean" field="booolean" usage="required"/>
  </mapping>
  <mapping name="TwoWayResponse" 
           class="com.ibm.devWorks.xml.simpleService.TwoWayResponse">
    <namespace uri="http://ibm.com/developerWorks/xml/SimpleService" 
               default="elements"/>
    <value name="echoString" field="echoString" usage="required"/>
    <value name="invertedBoolean" field="invertedBoolean" 
           usage="required"/>
  </mapping>
</binding>

在清单 8中,我们能看到 OneWayRequest 类、TwoWayRequest 类和 TwoWayResponse 类映射的相似之处。但是,此处的名称、类和字段指向的是 TwoWayRequestTwoWayResponse 元素的适当的数据。然而,不同之处之一就是这两个元素含有两个子元素或者字段。如果 mapping 标签没有子元素,则不会有 value 标签。如果 mapping 标签有多个子元素,那么 value 标签将相继列出,如清单 8 所示。




结束语

太棒了!我们已经完成了一半。我们利用了已有的 Java 类,为其定义了一个 XML 模式,并通过 WSDL 和 Web 服务中的操作将它们公开。我们创建了一个 JiBX 定义描述,它将 Java 类与模式中的元素映射起来,使 Axis2 JiBX 数据绑定能正确地将 Web 服务 SOAP 数据与 Java 类绑定在一起。

在第 2 部分中,Axis2 将使用 JiBX 定义描述生成服务主干和客户端的雏形。我们将在 Apache Geronimo 上部署最终的 Apache Axis2 Web 服务,然后生成并创建一个与部署好的 Web 服务通信的客户机,以此完成测试。

分享到:
评论

相关推荐

    利用Java技术实现基于XML的Web服务.pdf

    摘要: XML 解决了数据表示的问题,将数据显示与数据表示分离开,W3C 制定的 XML Schema(XSD)定义了一 套标准的数据类型,并给出...本文介绍了如何利用 Java(主要是 Java Web 服务开 发包)及相关技术来实现Web 服务。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    Java用注解的方式定义一个Servlet

    用注解的方式定义一个Servlet,就不用在web.xml中配置了。Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。  像上面的AnnotationServlet可以描述成@WebServlet(name="Annotation...

    Eclipse的XML编辑器

    Rinzo XML Editor 1.1.0 发布了,Rinzo是一个Eclipse的XML编辑器,...这将非常有用假如你要编辑web.xml,struts- config.xml或其它要在XML文件中配置Java类的时候。 (不好意思,本想免费共享,但资源分里面最小是1分)

    用XML轻松开发WEB站点

    第五部分(基于XML的Web站点应用与开发),内容包括:WIDL自动控制Web站点,频道定义格式推送Web站点,Web站点的设计实现;第六部分(相关协议与标准),内容包括:可扩展标识语言1.0((第二版)规范,XML术语与词汇参考...

    JAX-RS web 服务配置及教程

    REST 软件架构基于具象资源传输。RESTful Web 服务提供了一些优势:简单、轻量...Java API for RESTful Web 服务 (JAX-RS) 在 JSR 311 中定义。Jersey 是 JAX-RS 的参考实现,简化了 Java 中 RESTful Web 服务的开发。

    基于XML和JAVA的异构数据库集成中间件系统的研究和实现

    (4)为何使用XML 2.JAVA及其在数据库中的应用 (1)Java数据库基础JDBC API (2)Java数据库应用系统的实现 3.基于JAVA、XML的异构数据库集成应用 四、异构数据库集成中间件系统的设计分析 1.系统设计目标 2.系统...

    java-xml基础

    可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 ...

    疯狂XML讲义(Web Service).pdf

    第一部分介绍了XML、DTD、XML Schema等基础知识,这些知识主要教读者如何定义有效的XML文档,这部分内容是深入学习后面知识的基础,也是每个使用XML的开发者都应该掌握的基础。第二部分介绍了CSS、XSLT和XPath等知识...

    (超赞)JAVA精华之--深入JAVA API

    1.2.3 在外部类中定义内部类 1.2.4 在方法中定义内部类 1.2.5 匿名内部类 1.2.6 内部类使用的其它的问题 1.3 文件和流 1.3.1 什么是数据流 1.3.2 InputStream 的方法有: 1.3.3 OutputStream 的方法: 1.3.4 File 类 ...

    java源码包---java 源码 大量 实例

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    DWR简单配置说明---xml、java、jsp层层说明

    DWR简单配置说明---xml、java、jsp层层说明;通过jar包,web.xml,dwr.xml,jsp,java中举例子将dwr配置起来,主要是用来讲述dwr的配置。没有dwr的定义

    java源码包3

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    用XML轻松开发WEB站点(PDF)

    第五部分(基于XML的Web站点应用与开发),内容包括:WIDL自动控制Web站点,频道定义格式推送Web站点,Web站点的设计实现;第六部分(相关协议与标准),内容包括:可扩展标识语言1.0((第二版)规范,XML术语与词汇参考...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

Global site tag (gtag.js) - Google Analytics