Tải bản đầy đủ (.pdf) (37 trang)

Thiết kế và phát triển các dịch vụ Web JAX-WS 2.0 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (208.23 KB, 37 trang )

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) để 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.
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
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: JAX-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
 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
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 "orial/jaxws/orderprocess."

@WebService(serviceName = "OrderProcess", portName =
"OrderProcessPort",
targetNamespace = "orial/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.
4. 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
5. 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:
6. 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="orial/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, orial/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="orial/jaxws/orderprocess"

xmlns:tns="orial/jaxws/orderprocess"
xmlns:xs="

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.

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 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

<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, 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à
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:binding là document và soap: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=" />
<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

×