Thiết kế và phát triển các dịch vụ Web JAX-WS 2.0 Rajeev Hathi, Nhà tư vấn, IBM Naveen Balani, Tác giả Tóm tắt: Việc sử dụng công nghệ Java™ API dùng cho các dịch vụ Web XML JAX-WS để t
Trang 1Thiết kế và phát triển các dịch vụ Web JAX-WS 2.0
Rajeev Hathi, Nhà tư vấn, IBM
Naveen Balani, Tác giả
Tóm tắt: 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
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
Trang 2Cá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
Các nội dung liên quan:
Các gợi ý và các lời khuyên các dịch vụ Web: RPC sơ với loạt
JAX-WS
Các API của máy khách JAX-WS trong gói tính năng các dịch vụ Web của WebSphere Application Server V6.1 (Máy chủ ứng dụng WebSphere V6.1)
Các dịch vụ Web nhanh trên trình diễn theo yêu cầu
Cung cấp các dịch vụ Web cho các ứng dụng di độ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 Mục lục
Mục lục
Trước khi bạn bắt đầu
Giới thiệu về JAX-WS
Trang 3 Phát triển một dịch vụ Web
Công bố dịch vụ
Tạo các máy khách dịch vụ Web
Chạy máy khách dịch vụ Web
Tóm tắt
Trang 4Giớ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)
Trang 5 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ã
Trang 6dù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
//JWS annotation that specifies that the portType name of the
//Web service is "OrderProcessPort," the service name
Trang 7//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,
Trang 8System.out.println("processOrder called for customer"
Trang 9OrderBean 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;
Trang 10private String orderId;
public Customer getCustomer() {
Trang 12WebService, đị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
Trang 13Sau 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
Trang 14Cô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:
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
Trang 154 Biên dịch OrderWebServicePublisher bằng cách chạy lệnh sau đây từ thư mục c:\JAXWS- Tutorial:
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:
Trang 16Liệ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());
Trang 17OrderWebServicePublisher
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
Trang 18khi 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
Trang 19bạn đã định nghĩa trong chú giải @WebService cho OrderProcessService Liệt kê
Công cụ wsgen thực hiện trước đó tạo hai lớp bean bao vỏ (wrapper bean),
ProcessOrder và ProcessOrderResponse 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
Trang 20Chú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
Một phần tử customer có kiểu là customer
Một orderId có kiểu là string
Trang 21 orderItems (là một mảng, vì nó xác định thuộc tính maxOccurs là unbounded) có kiểu là orderItem
shippingAddress có kiểu là address
Liệt kê 7 Khai báo lược đồ đối với processOrder
Trang 22</xs:complexType
Tương tự, phần còn lại của các định nghĩa lược đồ cho customer, orderItems và address được ánh xạ sang các Java bean Customer, OrderItem và Address 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 processOrder và processOrderResponse các phần tử bộ phận của chúng là
processOrder và processOrderResponse (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à
Trang 23Liệt kê 9 Thông tin liên kết đối với tài liệu WSDL
<binding name="OrderProcessPortBinding"
Trang 24có thể quan sát nó chi tiết trong Liệt kê 10
Trang 25Liệt kê 10 Thông tin dịch vụ đối với tài liệu WSDL
Liệt kê 11 Mẫu SOAP thông báo cho processOrder hoạt động
<?xml version="1.0"?>
<soapenv:Envelope
Trang 27Tạ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
Trang 28Liệ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
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 RequestWrapper và ResponseWrapper (ProcessOrder và ProcessOrderResponse): 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
Trang 29 Giao diện dịch vụ (OrderProcessService): Lớp chứa giao diện, mà dịch
public class OrderClient {
final QName qName = new QName(
Trang 30URL 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);
Trang 31public void processOrder(URL url) {
OrderProcess orderProcessingService = new OrderProcess(url, qName);
System.out.println("Service is" + orderProcessingService);
OrderBean order = populateOrder();
OrderProcessService port =
Trang 32orderProcessingService.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);