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
đị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
//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;
}
}
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).
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
}
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"
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"
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="http://schemas.xmlsoap.org/soap/http" />
<operation name="processOrder">
<soap:operation soapAction="" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>