Việc sử dụng công nghệ Java™ API dùng cho các dịch vụ Web XML (JAX-WS) để thiết kế và phát triển các dịch vụ Web thu được nhiều lợi ích, gồm cả việc đơn giản hoá việc xây dựng các dịch vụ Web và máy khách dịch vụ Web trong Java, dễ dàng phát triển và triển khai các dịch vụ Web, và tăng tốc độ phát triển các dịch vụ Web. Hướng dẫn này dẫn dắt bạn qua các cách làm mọi thứ và nhiều hơn nữa bằng cách phát triển một ứng dụng mẫu xử lý đơn hàng (sample order-processing application), bộc lộ ra chức năng của nó như các dịch vụ Web. Sau khi xong hướng dẫn này, bạn sẽ có khả năng áp dụng các khái niệm và kiến thức vừa được tiếp thu để phát triển các dịch vụ Web cho ứng dụng của bạn bằng cách sử dụng công nghệ JAX-WS.

Rajeev Hathi, Nhà tư vấn, IBM

Rajeev Hathi là nhà tư vấn phần mềm cho nền tảng J2EE. Các mối quan tâm của ông là kiến trúc và thiết kế các ứng dụng dựa trên J2EE. Chủ đề ưa thích của ông là các dịch vụ Web, qua đó ông thích áp dụng và truyền đạt các khái niệm SOA. Sở thích của ông là xem thể thao và nghe nhạc rock.


Cấp độ đóng góp cho developerWorks của
        tác giả

18 12 2009

Trước khi bạn bắt đầu

Về hướng dẫn này

Trong hướng dẫn này, bạn thiết kế và phát triển một ứng dụng xử lý đơn hàng, thể hiện ra chức năng của nó như là các dịch vụ Web, nhờ đó những người tiêu dùng khác nhau có thể đặt mua thông tin theo một cách thức độc lập (nền tảng).

Mục tiêu

Sau khi đi hết hướng dẫn này, bạn có thể áp dụng các khái niệm và kiến thức để phát triển dịch vụ Web cho ứng dụng của bạn bằng cách sử dụng công nghệ JAX-WS.

Các điều kiện tiên quyết

Để hoàn tất thành công hướng dẫn này, bạn phải có một sự hiểu biết cơ bản về công nghệ dịch vụ Web và có một mức độ thành thạo trong việc lập trình Java.

Các yêu cầu về hệ thống

Để chạy các thí dụ trong hướng dẫn này, bạn cần cài đặt Java Platform, Bản chuẩn (Java SE) 6.0.


Giới thiệu về JAX-WS

Lí do dùng JAX-WS

JAX-WS là một công nghệ được thiết kế để đơn giản hóa việc xây dựng các dịch vụ Web và máy khách dịch vụ Web trong Java. Nó cung cấp một bó dịch vụ Web đầy đủ làm nhẹ bớt nhiệm vụ phát triển và triển khai dịch vụ Web. JAX-WS hỗ trợ trình WS-I Basic Profile 1.1, đảm bảo phát triển dịch vụ Web thông qua sử dụng bó JAX-WS có thể được tiêu thụ bởi bất kỳ khách hàng nào được phát triển trong bất kỳ ngôn ngữ lập trình tuân thủ WS-I Basic Profile 1.1. JAX-WS, gồm cả Kiến trúc Java dùng cho XML Binding (JAXB) và SOAP với Các gắn kết API (Attachments API) dùng cho Java (SAAJ).

JAXB có khả năng liên kết số liệu bằng cách cung cấp cách thuận lợi để ánh xạ một lược đồ XML sang thể hiện trong mã Java. JAXB bảo vệ sự chuyển đổi các thông báo lược đồ XML trong các thông báo SOAP thành mã Java mà bạn không cần phải hiểu biết đầy đủ về việc phân tích cú pháp XML và SOAP. Đặc tả JAXB định nghĩa sự liên kết giữa Java và các lược đồ XML. SAAJ cung cấp cách xử lý chuẩn về các gắn kết XML chứa trong một thông báo SOAP.

Hơn nữa, JAX-WS làm tăng tốc độ phát triển dịch vụ Web thông qua việc cung cấp một thư viện các chú giải để chuyển các lớp đối tượng Java cũ đơn giản (plain old Java object) (POJO) thành các dịch vụ Web. Nó cũng quy định một sự ánh xạ chi tiết từ một dịch vụ được định nghĩa trong Ngôn ngữ Miêu tả Các dịch vụ Web (WSDL) đến các lớp Java thực hiện dịch vụ đó. Bất kì những kiểu phức tạp được định nghĩa trong WSDL cũng đều được ánh xạ thành các lớp Java theo sau việc ánh xạ được định nghĩa bởi đặc tả JAXB. JAX-WS trước đây được đóng gói với Java Platform, Bản Doanh nghiệp (Java EE 5). Đặc tả JAX-WS 2.0 được phát triển dưới JSR 224 của Quy trình Cộng đồng Java (Java Community Process) (JCP).


Phát triển một dịch vụ Web

Tiếp cận kết giao trước tiên (contract-first approach) so với tiếp cận mã trước tiên (code-first approach)

Một cách hay để khởi đầu vào JAX-WS là phát triển trước tiên một dịch vụ Web. Bạn có thể phát triển một dịch vụ Web bằng cách sử dụng một trong hai tiếp cận:

  • Theo mục đích: Bắt đầu bằng một kết giao WSDL, và tạo một lớp Java để thực hiện dịch vụ.
  • Theo mã: Bắt đầu bằng một lớp Java, và sử dụng các chú giải để tạo cả tệp WSDL và giao diện Java.

Tiếp cận WSDL theo mục đích đòi hỏi một sự hiểu biết tốt về WSDL và XSD (Định nghĩa lược đồ XML) để định nghĩa các định dạng thông điệp. Nó là một ý tưởng tốt để bắt đầu bằng tiếp cận theo mã nếu bạn chưa quen nhiều với các dịch vụ Web, là cái mà bạn sẽ sử dụng trong hướng dẫn này để phát triển các dịch vụ Web.

Phát triển các dịch vụ Web theo mã

Khi sử dụng tiếp cận theo mã, bạn bắt đầu bằng một lớp hoặc các lớp Java, chúng thực hiện các đặc tính mà bạn muốn thể hiện ra như là các dịch vụ. Tiếp cận theo mã đặc biệt hữu ích khi các bổ sung Java đã sẵn sàng và bạn cần phải thể hiện các bổ sung này như là các dịch vụ.

Phát triển một dịch vụ Web xử lý đơn hàng

Chúng ta hãy bắt đầu bằng cách tạo một dịch vụ Web xử lý đơn hàng, chấp nhận thông tin đặt mua hàng, vận chuyển thông tin, và các mục hàng được đặt mua, và cuối cùng là tạo một mã xác nhận (confirmation ID) như là một phản hồi. Bộ mã dùng vào dịch vụ xử lý đơn hàng có trong Liệt kê 1. Đây là một cài đặt giả, in ra định danh khách hàng (customer ID) và số lượng các mục hàng tại bàn điều khiển, sau đó trả về một mã đặt hàng giả của A1234. (Bạn có thể tải về mã nguồn để có ứng dụng đầy đủ trong mục Tải về của bài này.) Giải nén mã nguồn vào ổ C của bạn, nơi có thư mục JAXWS-Tutorial được tạo. Thư mục này chứa mã nguồn, như hiển thị trong Liệt kê 1.

Liệt kê 1. Cài đặt dịch vụ Web xử lý đơn hàng
package com.ibm.jaxws.tutorial.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import com.ibm.jaxws.tutorial.service.bean.OrderBean;


//JWS annotation that specifies that the portType name of the 
//Web service is "OrderProcessPort," the service name 
//is "OrderProcess," and the targetNamespace used in the generated
//WSDL is "http://jawxs.ibm.tutorial/jaxws/orderprocess."

@WebService(serviceName = "OrderProcess", portName = "OrderProcessPort", 
      targetNamespace = "http://jawxs.ibm.tutorial/jaxws/orderprocess") 	
//JWS annotation that specifies the mapping of the service onto the
// SOAP message protocol. In particular, it specifies that the SOAP messages 
//are document literal.
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL, 
      parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) 
public class OrderProcessService {

	@WebMethod
	public OrderBean processOrder(OrderBean orderBean) {

		// Do processing...
		System.out.println("processOrder called for customer"
				+ orderBean.getCustomer().getCustomerId());

		// Items ordered are
		if (orderBean.getOrderItems() != null) {
			System.out.println("Number of items is "
					+ orderBean.getOrderItems().length);
		}

		//Process order.

		//Set the order ID.
		orderBean.setOrderId("A1234");

		return orderBean;
	}
}

OrderBean giữ lại thông tin đặt mua hàng như trình bày trong Liệt kê 2. Cụ thể, nó chứa các tham chiếu đến khách hàng, các mục hàng đặt mua, và đối tượng địa chỉ chuyển hàng.

Liệt kê 2. Lớp OrderBean giữ lại thông tin đặt mua hàng
package com.ibm.jaxws.tutorial.service.bean;

public class OrderBean {

	private Customer customer;

	private Address shippingAddress;

	private OrderItem[] orderItems;

	private String orderId;

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	public Address getShippingAddress() {
		return shippingAddress;
	}

	public void setShippingAddress(Address shippingAddress) {
		this.shippingAddress = shippingAddress;
	}

	public OrderItem[] getOrderItems() {
		return orderItems;
	}

	public void setOrderItems(OrderItem[] orderItems) {
		this.orderItems = orderItems;
	}

}

Điểm xuất phát để phát triển một dịch vụ Web JAX-WS là một lớp Java được chú thích bằng chú giải javax.jws.WebService. Các chú giải JAX-WS được sử dụng là một bộ phận của các dịch vụ Web Metadata cho đặc tả Java Platform (JSR-181). Như bạn hẳn để ý đến, OrderProcessService được chú thích bằng chú giải WebService, định nghĩa lớp như một điểm cuối dịch vụ Web.

Lớp OrderProcessService (đây là lớp có chú giải @javax.jws.WebService ) định nghĩa ngầm định một giao diện điểm cuối dịch vụ (SEI), khai báo các phương thức mà một khách hàng có thể gọi ra trên dịch vụ. Mọi phương thức công cộng được định nghĩa trong lớp này, nếu các phương thức không được chú thích bằng một chú giải @WebMethod với phần tử loại trừ đặt ở true (đúng), được ánh xạ thành các phép toán WSDL. Chú giải @WebMethod là tuỳ ý và được dùng để tuỳ chỉnh phép toán dịch vụ Web. Ngoài phần tử loại trừ, chú giải javax.jws.WebMethod còn cung cấp tên của phép toán và các phần tử hoạt động, được sử dụng để tuỳ chỉnh thuộc tính tên của phép toán và phần tử hoạt động SOAP trong một tài liệu WSDL. Thuộc tính này là tuỳ chọn; nếu chưa được định nghĩa, các giá trị mặc định được lấy từ tên lớp.

Sau khi dịch vụ Web được thực hiện, bạn cần tạo bất kỳ tạo tác nào cần có để triển khai dịch vụ, sau đó gói dịch vụ Web như một tạo tác được triển khai — thường là một tệp WAR — và triển khai tệp WAR vào bất kỳ máy chủ tương thích nào có hỗ trợ đặc tả JAX-WS 2.0. Các tạo tác điển hình được tạo là các lớp đảm bảo chuyển đổi các đối tượng Java thành XML, và tệp WSDL và lược đồ XSD dựa trên giao diện dịch vụ.

Nhằm mục đích thử nghiệm, Java 6 bao gói kết hợp một máy chủ Web hạng nhẹ vào cái mà dịch vụ Web có thể được công bố ra bằng cách gọi một cuộc gọi API đơn giản. Tiếp theo bạn hãy quan sát cách thử nghiệm các dịch vụ Web của bạn bằng cách sử dụng tiếp cận này.


Công bố dịch vụ

Tạo các tạo tác JAX-WS

Bạn tạo các tạo tác JAX-WS khả chuyển cho dịch vụ Web xử lý đơn hàng bằng cách chạy công cụ wsgen. Công cụ này đọc một lớp SEI Web và tạo tất cả tạo tác yêu cầu cho các triển khai và đòi hỏi dịch vụ Web. Công cụ wsgen tạo tệp WSDL và lược đồ XSD cho các dịch vụ Web, những thứ cần được công bố.

Để tạo các tạo tác JAX-WS, đầu tiên bạn cần phải biên dịch dịch vụ và các nguồn bean:

  1. Mở một lệnh nhắc, và chuyển đến c:\JAXWS - JAXWS-Tutorial.
  2. Chạy lệnh sau để biên dịch các tệp Java và đặt các tệp lớp vào các thư mục tương ứng của chúng:

    javac com\ibm\jaxws\tutorial\service\*.java com\ibm\jaxws\tutorial\service\bean\*.java
  3. Chạy lệnh sau đây để tạo các tạo tác JAX-WS:

    wsgen -cp . com.ibm.jaxws.tutorial.service.OrderProcessService -wsdl

Công cụ wsgen cung cấp nhiều tuỳ chọn, như tạo các tạo tác WSDL và lược đồ cho dịch vụ bằng cách cung cấp tuỳ chọn -wsdl. Sau khi chạy lệnh này, bạn sẽ thấy OrderProcess.wsdl và OrderProcess_schema1.xsd được tạo trong thư mục JAXWS-Tutorial, và các tạo tác JAX-WS được tạo trong thư mục com\ibm\jaxws\tutorial\service\jaxws.

Sau khi các tạo tác được tạo, bạn công bố dịch vụ Web xử lý đơn hàng bằng cách chạy máy khách công bố các dịch vụ Web sau đây.

  1. Biên dịch OrderWebServicePublisher bằng cách chạy lệnh sau đây từ thư mục c:\JAXWS- Tutorial:

    javac com\ibm\jaxws\tutorial\service\publish\OrderWebServicePublisher.java
  2. Sau đó chạy lệnh sau đây:

    java com.ibm.jaxws.tutorial.service.publish.OrderWebServicePublisher

Sau khi chạy chương trình Java, bạn sẽ nhìn thấy thông báo sau: Dịch vụ Web được công bố tại http://localhost:8080/OrderProcessWeb/orderprocess. Để ngừng chạy các dịch vụ Web, chấm dứt quy trình Java này.

Việc này công bố dịch vụ Web đơn hàng tại địa chỉ http://localhost:8080/OrderProcessWeb/orderprocess. Bạn có thể xác minh liệu dịch vụ Web đó đang chạy bằng cách cho hiển thị WSDL được tạo bởi dịch vụ Web xử lý đơn hàng:

  1. Mở trình duyệt, và chuyển đến http://localhost:8080/OrderProcessWeb/orderprocess?wsdl.

Phân tích OrderWebServicePublisher

Trước khi phân tích các tạo tác WSDL và lược đồ, chúng ta hãy phân tích mã dùng cho OrderWebServicePublisher. Liệt kê 3 cung cấp mã nguồn của máy khách OrderWebServicePublisher.

Liệt kê 3. Mã dùng để công bố dịch vụ Web xử lý đơn hàng
package com.ibm.jaxws.tutorial.service.publish;

import javax.xml.ws.Endpoint;

import com.ibm.jaxws.tutorial.service.OrderProcessService;

public class OrderWebServicePublisher {

	public static void main(String[] args) {

		Endpoint.publish("http://localhost:8080/OrderProcessWeb/orderprocess",
				new OrderProcessService());

	}

}

Phương thức Endpoint.publish() cung cấp một cách thuận lợi để công bố và việc thử nghiệm các dịch vụ Web JAX-WS. publish() lấy hai tham số: địa chỉ của dịch vụ Web và lớp cài đặt dịch vụ Web JAX-WS. Các phương thức publish() tạo một máy chủ Web hạng nhẹ tại URL được xác định (trong trường hợp này, nó là chủ cục bộ và cổng 8080) và triển khai dịch vụ Web đến địa chỉ đó. Máy chủ Web hạng nhẹ đang chạy trong máy ảo Java (JVM) và có thể kết thúc bằng cách gọi ra phương thức endpoint.stop() có điều kiện hoặc kết thúc máy khách OrderWebServicePublisher.

Phân tích WSDL được tạo

Để quan sát WSDL dịch vụ Web xử lý đơn hàng được tạo, gõ nhập địa chỉ URL sau đây trong trình duyệt: http://localhost:8080/OrderProcessWeb/orderprocess?wsdl.

Chúng ta hãy phân tích một số khía cạnh WSDL quan trọng và xem xét cách đã tạo ra các tạo phẩm lược đồ và WSDL dựa trên siêu dữ liệu JAX-WS, bắt đầu bằng việc phân tích XSD được tạo ra. Người ta nhập XSD này vào một tệp WSDL khi sử dụng các thẻ xsd:import (xem Liệt kê 4); schemaLocation chỉ rõ địa chỉ của XSD.

Liệt kê 4. Tệp WSDL chứa lược đồ xử lý đơn hàng định nghĩa
<types>
	
    <xsd:schema>
      <xsd:import namespace="http://jawxs.ibm.tutorial/jaxws/orderprocess" 
	  schemaLocation="OrderProcess_schema1.xsd"/>
    </xsd:schema>
</types>

Đặt schemaLocation (http://localhost:8080/OrderProcessWeb/orderprocess?xsd=1) vào trình duyệt để xem các định nghĩa lược đồ trả về trình duyệt. Chúng ta hãy phân tích điều gì đang xảy ra ở đây: định nghĩa lược đồ bắt đầu bằng targetNamspace và một khai báo tns, ánh xạ đến targetNamespace, http://jawxs.ibm.tutorial/jaxws/orderprocess, mà bạn đã định nghĩa trong chú giải @WebService cho OrderProcessService. Liệt kê 5 cung cấp mã này.

Liệt kê 5. Khai báo không gian tên lược đồ
<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">

Công cụ wsgen thực hiện trước đó tạo hai lớp bean bao vỏ (wrapper bean), ProcessOrderProcessOrderResponse giữ lại các thông báo đầu vào và đầu ra đối với dịch vụ Web xử lý đơn hàng. Dựa trên các lớp bean bao vỏ, các phần tử lược đồ sau đây được tạo:

  • processOrder là của kiểu processOrder, nó đại diện một kiểu phức tạp chứa một phần tử mang tên arg0 và kiểu orderBean. Bạn có thể thấy một ánh xạ một-một giữa lớp ProcessOrder và kiểu phức tạp processOrder.
  • processOrderResponse tương tự như kiểu processOrderResponse các định nghĩa của chúng ánh xạ sang lớp ProcessOrderResponse.

Chúng ta hãy quan sát nó kỹ hơn trong Liệt kê 6.

Liệt kê 6. Khai báo lược đồ đối với 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>

Định nghĩa kiểu orderBean được minh hoạ trong Liệt kê 7 ánh xạ sang lớp OrderBean. Định nghĩa kiểu orderBean gồm có:

  • Một phần tử customer có kiểu là customer.
  • Một orderId có kiểu là string.
  • orderItems (là một mảng, vì nó xác định thuộc tính maxOccursunbounded) có kiểu là orderItem.
  • shippingAddress có kiểu là address.
Liệt kê 7. Khai báo lược đồ đối với 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

Tương tự, phần còn lại của các định nghĩa lược đồ cho customer, orderItemsaddress được ánh xạ sang các Java bean Customer, OrderItemAddress tương ứng.

Với các định nghĩa lược đồ được phân tích, chúng ta hãy vào lại các định nghĩa thông báo trong WSDL, hiện trong Liệt kê 8. WSDL quy định các thông báo processOrderprocessOrderResponse các phần tử bộ phận của chúng là processOrderprocessOrderResponse (trước đây bạn đã thấy các định nghĩa lược đồ của chúng). portType quy định phép toán processOrder thông báo đầu vào của chúng là processOrder và thông báo đầu ra của chúng là processOrderResponse.

Liệt kê 8. Phần tử thông báo processOrder trong tài liệu WSDL
  <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>

Tiếp theo, các liên kết WSDL được định nghĩa. Việc này định nghĩa kiểu dạng soap:bindingdocumentsoap:body sử dụng thẻ là literal đối với các định dạng thông báo đầu vào và đầu ra cho phép toán processOrder. Các định nghĩa WSDL được tạo sẽ ánh xạ sang chú giải @SOAPBinding mà bạn đã định nghĩa trên lớp OrderProcessService (xem Liệt kê 9).

Liệt kê 9. Thông tin liên kết đối với tài liệu 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>

Tiếp theo, các dịch vụ WSDL được định nghĩa. Chúng quy định cổng và kiểu liên kết tương ứng, cùng với địa chỉ thực của dịch vụ. Nó thường là một địa chỉ HTTP, trong trường hợp này là http://localhost:8080/OrderProcessWeb/orderprocess. Bạn có thể quan sát nó chi tiết trong Liệt kê 10.

Liệt kê 10. Thông tin dịch vụ đối với tài liệu WSDL
<service name="OrderProcess">
  <port name="OrderProcessPort" binding="tns:OrderProcessPortBinding">
  <soap:address location="http://localhost:8080/OrderProcessWeb/orderprocess" /> 
</port>

Với việc này bạn đã phân tích các tạo tác WSDL và lược đồ được tạo. Liệt kê 11 minh hoạ một mẫu thông báo yêu cầu SOAP được gửi đi bởi máy khách dịch vụ Web khi nó gọi ra phép toán processOrder.

Liệt kê 11. Mẫu SOAP thông báo cho processOrder hoạt động
<?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>

Tạo các máy khách dịch vụ Web

Tạo các máy khách dịch vụ Web từ WSDL

Trong mục này bạn sẽ tìm hiểu cách tạo các máy khách dịch vụ Web từ WSDL. JAX-WS có kèm một công cụ gọi là wsimport được dùng để tạo các tạo tác khả chuyển JAX-WS từ WSDL. Các tạo tác khả chuyển thường được tạo gồm như sau:

  • SEI.
  • Dịch vụ (lớp cài đặt dịch vụ bạn cần thực hiện).
  • Các lớp do JAXB tạo từ các kiểu lược đồ.
  • Lớp ngoại lệ được ánh xạ từ wsdl:fault (nếu có).

Các máy khách sử dụng các tạo tác được tạo để gọi dịch vụ Web. Các máy khách dịch vụ Web không cần phải xử lý bất kỳ định dạng SOAP nào, như tạo hoặc phân tích cú pháp các thông báo SOAP. Đúng hơn là, việc này được xử lý bởi thời gian chạy JAX-WS, sử dụng mã tạo tác được tạo (lớp do JAXB tạo). Máy khách dịch vụ Web đến lượt mình lại xử lý đối tượng Java (lớp do JAXB tạo), làm nhẹ đi sự phát triển của các máy khách dịch vụ Web và gọi các phép toán trên dịch vụ Web.

Bạn tạo các tạo tác JAX-WS từ WSDL OrderProcess bằng cách sử dụng công cụ wsimport. Rồi bạn tạo một máy khách dịch vụ Web, sử dụng mã tạo tác được tạo để gọi dịch vụ Web xử lý đơn hàng. Để tạo các tạo tác JAX-WS, chuyển đến thư mục JAXWS-Tutorial, và chạy lệnh wsimport hiển thị trong Liệt kê 12. Mặc dù vậy, trước khi làm điều này, phải chắc chắn rằng bạn đã công bố dịch vụ Web bằng cách chạy OrderWebServicePublisher như đã chỉ ra trong bước 5 trong mục Tạo các tạo tác JAX-WS.

Liệt kê 12. Lệnh wsimport tạo các tạo tác JAX-WS mà máy khách dịch vụ Web sử dụng
wsimport -keep -p com.ibm.jaxws.tutorial.service.client 
	http://localhost:8080/OrderProcessWeb/orderprocess?wsdl

Tuỳ chọn -keep chứng tỏ rằng bạn giữ các tệp được tạo, và tuỳ chọn -p quy định tên gói nơi tạo tác cần được tạo. http://localhost:8080/OrderProcessWeb/orderprocess?wsdl quy định vị trí của tệp WSDL. Các tạo tác sau đây được tạo từ OrderProcessService WSDL:

  • Các lớp JAXB (Address, Customer, OrderBean, và OrderItem): Được tạo bằng cách đọc các định nghĩa lược đồ trong WSDL OrderProcessService.
  • Các lớp RequestWrapperResponseWrapper (ProcessOrderProcessOrderResponse): Bao bọc đầu vào và đầu ra cho kiểu dạng tài liệu bọc bằng chữ.
  • Lớp Service (OrderProcess): Lớp mà các máy khách của bạn sử dụng để đưa các yêu cầu đến dịch vụ Web.
  • Giao diện dịch vụ (OrderProcessService): Lớp chứa giao diện, mà dịch vụ của bạn thực hiện.

Bây giờ hãy quan sát cách tạo một máy khách dịch vụ Web bằng cách sử dụng các tạo tác bạn đã tạo trên đây. Các mã tham chiếu thí dụ có trong thư mục com\ibm\jaxws\tutorial\service\client. Bộ mã cho các máy khách dịch vụ Web có trong Liệt kê 13.

Liệt kê 13. Liệt kê mã dùng cho máy khách dịch vụ Web xử lý đơn hàng
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;
	}
}

Bộ mã máy khách dịch vụ Web liệt kê trên đây:

  • Tạo một cá thể của lớp OrderProcess bằng cách vào URL WSDL của dịch vụ Web OrderProcess cùng với QName của dịch vụ.
  • Tạo một cá thể của OrderBean và điền thông tin đặt mua hàng trong phương thức populateOrder().
  • Gọi ra một uỷ nhiệm đến dịch vụ, còn gọi là một cổng, bằng cách dẫn ra getOrderProcessPort() trên dịch vụ. Cổng này thực hiện giao diện dịch vụ được xác định bởi dịch vụ.
  • Dẫn ra phương thức processOrder của cổng, qua cá thể OrderBean được tạo trong mục liệt kê thứ hai ở trên.
  • Nhận phản hồi OrderBean từ dịch vụ và in ra định danh khách hàng.

Chạy máy khách dịch vụ Web

Để chạy máy khách dịch vụ Web, trước tiên biên dịch máy khách dịch vụ Web bằng cách chạy lệnh sau đây từ thư mục JAXWS-Tutorial:

javac com\ibm\jaxws\tutorial\service\client\OrderClient.java

Thực hiện máy khách dịch vụ Web bằng cách cung cấp URL WSDL cho dịch vụ Web xử lý đơn hàng bằng cách sử dụng lệnh này:

java com.ibm.jaxws.tutorial.service.client.OrderClient http://localhost:8080/OrderProcessWeb/orderprocess?wsdl

Khi máy khách dịch vụ Web được thực hiện, sẽ thấy đầu ra sau tại bàn điều khiển, nơi OrderWebServicePublisher đang chạy:

processOrder called for customer A123
Number of items is 1

Tại giao diện điều khiển nơi máy khách dịch vụ Web được thực hiện, bạn nhận được đầu ra sau:

Order id is A1234

Như bạn thấy trong mã máy khách, bạn không xử lý bất kỳ định dạng SOAP hoặc dựa trên XML nào để gọi các phép toán dịch vụ Web; thay vào đó bạn xử lý các lớp JAXB được tạo cho các thông báo đầu vào, đầu ra và sử dụng các đối tượng giao diện dịch vụ và lớp dịch vụ, hành động như các stub để gọi dịch vụ Web. Các stub chịu trách nhiệm về việc tạo các yêu cầu SOAP từ các chú giải JAXB và chuyển đổi phản hồi SOAP trở lại đối tượng Java.

Bây giờ bạn đã tạo thành công và công bố dịch vụ Web của bạn và thực hiện nó qua một máy khách dịch vụ Web!


Tóm tắt

Trong hướng dẫn này, bạn đã tìm hiểu cách thiết kế và phát triển các dịch vụ Web bằng cách sử dụng tiếp cận phát triển theo mã và công nghệ JAX-WS. JAX-WS là một sự lựa chọn tuyệt vời vì nó cung cấp một bó dịch vụ Web đầy đủ để đơn giản hóa việc phát triển và triển khai các dịch vụ Web.

Dịch vụ Web xử lý đơn hàng mà bạn đã phát triển trong hướng dẫn này sử dụng dịch vụ Web dạng tài liệu, đảm bảo người sử dụng dịch vụ và nhà cung cấp dịch vụ liên lạc thông qua sử dụng các tài liệu XML. Các tài liệu XML tuân thủ các cam kết xác định tốt, thường được tạo bằng cách sử dụng các định nghĩa Lược đồ XML. Định dạng lược đồ XML quy định sự kết giao của các thông báo nghiệp vụ mà người sử dụng dịch vụ có thể gọi ra, và tuân thủ nó. Các dịch vụ Web dạng tài liệu sẽ là tiếp cận được ưa thích của các dịch vụ Web doanh nghiệp đang phát triển.


Tải về

Mô tảTênKích thước
JAX-WS Web services codejaxws.zip32KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=SOA và dịch vụ Web, Công nghệ Java
ArticleID=972107
ArticleTitle=Thiết kế và phát triển các dịch vụ Web JAX-WS 2.0
publish-date=12182009