设计与开发 JAX-WS 2.0 Web 服务(2)

清单 5. 模式(Schema)命名空间声明

<xs:schema version="1.0" 

    targetNamespace="http://jawxs.ibm.tutorial/jaxws/orderprocess"

    xmlns:tns="http://jawxs.ibm.tutorial/jaxws/orderprocess" 

    xmlns:xs="http://www.w3.org/2001/XMLSchema">

前面指定的 wsgen 工具命令生成两个包装Bean 类,ProcessOrder 和 ProcessOrderResponse,分别包含订单处理 Web 服务的输入和输出消息。将基于这些包装 Bean 类生成以下模式元素:

· processOrder属于 processOrder 类型,表示其中包含一个元素,且此元素的名称为 arg0,类型为 orderBean。可以看到,在 ProcessOrder 类和 processOrder 复杂类型之间存在一对一映射。

· processOrderResponse与 processOrderResponse 类型类似,后者的定义映射到 ProcessOrderResponse 类。

让我们仔细分析一下清单 中的代码。

 

清单 6. processOrder 的模式声明  

 <xs:element name="processOrder" type="tns:processOrder"/>

  <xs:element name="processOrderResponse" type="tns:processOrderResponse"/>

  <xs:complexType name="processOrder">

    <xs:sequence>

      <xs:element name="arg0" type="tns:orderBean" minOccurs="0"/>

    </xs:sequence>

  </xs:complexType>

清单 中所示的 orderBean 类型定义映射到 OrderBean 类。orderBean 类型定义包括:

· 一个 customer 元素,其类型为 customer

· 一个 orderId,其类型为 string

· orderItems(它为数组类型,因为其将 maxOccurs 属性指定为 unbounded),其类型为 orderItem

· shippingAddress,其类型为 address
清单 7. processOrder 的模式声明

 <xs:complexType name="orderBean">

   <xs:sequence>

      <xs:element name="customer" type="tns:customer" minOccurs="0" /> 

      <xs:element name="orderId" type="xs:string" minOccurs="0" /> 

      <xs:element nillable="true" maxOccurs="unbounded" name="orderItems" 

                          type="tns:orderItem" minOccurs="0" /> 

      <xs:element name="shippingAddress" type="tns:address"   

                         minOccurs="0" /> 

   </xs:sequence>

</xs:complexType

类似地,模式的其余部分 customerorderItems 和 address 分别映射到 CustomerOrderItem 和 Address Java Bean

分析了模式定义后,接下来让我们回头来看看 WSDL 中的消息定义,如清单 中所示。WSDL 指定消息 processOrder 和 processOrderResponse,其所属的元素为 processOrder 和 processOrderResponse(我们已经讨论了其模式定义)。portType 指定操作 processOrder,其输入消息为 processOrder,而输出消息为 processOrderResponse

清单 8. WSDL 文档中的 processOrder 消息元素

 <message name="processOrder">

        <part element="tns:processOrder" name="parameters" /> 

 </message>

  <message name="processOrderResponse">

        <part element="tns:processOrderResponse" name="parameters" /> 

  </message>

  <portType name="OrderProcessService">

     <operation name="processOrder">

        <input message="tns:processOrder" /> 

        <output message="tns:processOrderResponse" /> 

    </operation>

  </portType>

接下来定义了 WSDL 绑定。此绑定将 soap:binding 样式定义为 documentsoap:body 使用 literal 标记指定操作 processOrder 的输入和输出消息格式。生成的 WSDL 定义映射到 @SOAPBinding Annotation(已在 OrderProcessService 类上定义,请参见清单 9)。

清单 9. WSDL 文档的绑定信息

<binding name="OrderProcessPortBinding" type="tns:OrderProcessService">

  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 

 <operation name="processOrder">

  <soap:operation soapAction="" /> 

    <input>  <soap:body use="literal" />   </input>

     <output>  <soap:body use="literal" />   </output>

  </operation>

</binding>

接下来定义 WSDL 服务。这将指定端口和对应的绑定类型,以及服务的实际位置。此位置通常为 HTTP 位置,在本例中为 http://localhost:8080/OrderProcessWeb/orderprocess。可以在清单 10 中了解到具体的情况。

清单 10. WSDL 文档的服务信息

我们已经对生成的 WSDL 和模式构件进行了分析。清单 11 给出了一个示例 SOAP 请求消息,此消息是在 Web 服务客户机调用 processOrder 操作时发送的。

清单 11. processOrder 操作的示例 SOAP 消息

<service name="OrderProcess">

  <port name="OrderProcessPort" binding="tns:OrderProcessPortBinding">

  <soap:address location="http://localhost:8080/OrderProcessWeb/orderprocess" /> 

</port>

<?xml version="1.0"?>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 

xmlns:ns1=" http://jawxs.ibm.tutorial/jaxws/orderprocess" 

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<soapenv:Body>

<ns1:processOrder>

<arg0>

<customer><customerId>A123</customerId>

<firstName>John</firstName><lastName>Smith</lastName></customer>

<orderItems><itemId>11</itemId><qty>11</qty></orderItems>

</arg0>

</ns1:processOrder>

</soapenv:Body>

</soapenv:Envelope>

6创建 Web 服务客户机

从 WSDL 创建 Web 服务客户机

在本部分,我们将了解如何从 WSDL 创建 Web 服务客户机。JAX-WS 提供了名为 wsimport 的工具,用于从 WSDL 生成 JAX-WS 可移植构件。生成的可移植构件通常包括以下内容:

· SEI

· 服务(需要实现的服务实现类)

· 从模式类型生成的 JAXB 生成类

· 从 wsdl:fault 映射的异常类(如果有)

客户机使用生成的构件调用 Web 服务。Web 服务客户机并不需要处理任何 SOAP 格式(如创建或解析 SOAP 消息)。这将由 JAX-WS 运行时予以处理,此运行时将使用生成的构件代码(JAXB 生成类)。Web 服务将处理 Java 代码(JAXB 生成类),从而减少了开发 Web 服务客户机和对 Web 服务调用操作的工作。

先使用 wsimport 工具从 OrderProcess WSDL 生成 JAX-WS 构件。然后要创建 Web 服务客户机,后者使用生成的构件代码调用订单处理 Web 服务。要生成 JAX-WS 构件,进入到 JAXWS-Tutorial 目录,并运行清单 12 中所示的 wsimport 命令。不过,进行操作前,请确保已经按照生成 JAX-WS 构件部分中的步骤 所述的方法,通过运行 OrderWebServicePublisher 发布了 Web 服务。
清单 12. 用于生成供 Web 服务客户机使用的 JAX-WS 构件的 wsimport 命令

-keep 选项指示保留生成的文件,-p 选项指定需要在其中生成构件的包名称。http://localhost:8080/OrderProcessWeb/orderprocess?wsdl 指定 WSDL 文件的位置。以下构件是从 OrderProcessService WSDL 生成的:

· JAXB 类(AddressCustomer, OrderBean 和 OrderItem):通过读取 OrderProcessService WSDL 中定义的模式定义生成

· RequestWrapper 和 ResponseWrapper 类(ProcessOrder 和 ProcessOrderResponse):包装 document literal-wrapped 样式类型的输入和输出

· 服务类 (OrderProcess)客户机用于请求 Web 服务的类

· 服务接口 (OrderProcessService)包含着用于服务实现接口的类

接下来了解一下如何使用上面生成的构件创建 Web 服务客户机。com\ibm\jaxws\tutorial\service\client 文件夹中提供了一个示例参考代码。Web 服务客户机的代码如清单 13 中所示。
清单 13. 订单处理 Web 服务客户机的代码清单

 wsimport -keep -p com.ibm.jaxws.tutorial.service.client 

                              http://localhost:8080/OrderProcessWeb/orderprocess?wsdl

package com.ibm.jaxws.tutorial.service.client;

import java.net.MalformedURLException;

import java.net.URL;

import javax.xml.namespace.QName;

public class OrderClient {

    final QName qName = new QName(

            "http://jawxs.ibm.tutorial/jaxws/orderprocess", "OrderProcess");

    public static void main(String[] args) {

        if (args.length != 1) {

            System.out.println("Specify the URL of the OrderProcess Web Service");

            System.exit(-1);

        }

        URL url = getWSDLURL(args[0]);

        OrderClient client = new OrderClient();

        client.processOrder(url);

}

private static URL getWSDLURL(String urlStr) {

        URL url = null;

        try {

            url = new URL(urlStr);

        } catch (MalformedURLException e) {

            e.printStackTrace();

            throw new RuntimeException(e);

        }

        return url;

    }

    public void processOrder(URL url) {

        OrderProcess orderProcessingService = new OrderProcess(url, qName);

        System.out.println("Service is" + orderProcessingService);

        OrderBean order = populateOrder();

        OrderProcessService port = orderProcessingService.getOrderProcessPort();

        OrderBean orderResponse = port.processOrder(order);

        System.out.println("Order id is " + orderResponse.getOrderId());

    }

    private OrderBean populateOrder() {

        OrderBean order = new OrderBean();

        Customer customer = new Customer();

        customer.setCustomerId("A123");

        customer.setFirstName("John");

        customer.setLastName("Smith");

        order.setCustomer(customer);

        // Populate Order Item.

        OrderItem item = new OrderItem();

        item.setItemId("11");

        item.setQty(11);

        order.getOrderItems().add(item);

        return order;

    }

}       

你可能感兴趣的:(设计模式,Web,bean,IBM,SOAP)