1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx

13 992 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 13
Dung lượng 1,02 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn Giới thiệu Bài viết này cung cấp một ví dụ trình điều khiển

Trang 1

Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa

trên web của bạn

Giới thiệu

Bài viết này cung cấp một ví dụ trình điều khiển SOAP cho DB2 có thể được sử dụng để ngầm chạy thi hành thủ tục lưu sẵn của DB2 bằng cách sử dụng các API SOAP mà không cần phải tạo

ra bất kỳ ánh xạ tường minh nào Tôi tin rằng các trình điều khiển cơ sở dữ liệu thế hệ tiếp theo

sẽ dịch chuyển việc kết nối cơ sở dữ liệu từ các API mức thấp như ODBC/JDBC sang các API mức cao như SOAP và REST, dẫn đến việc cơ sở dữ liệu đóng vai trò trực tiếp trong thế giới SOA

Để chỉ làm nổi bật những khía cạnh quan trọng của kiến trúc liên quan đến các mô hình dữ liệu XML, luồng xử lý được cố tình giữ ở mức đơn giản Các giao diện đồ họa người dùng cũng được giữ ở mức tối thiểu cần thiết để hiển thị các chức năng

Các lược đồ XML của Liên minh du lịch mở được sử dụng để tạo ra dữ liệu khách sạn mẫu cũng như cuộc gọi SOAP để tìm kiếm khách sạn API PayPal được sử dụng để thực hiện các giao dịch bằng thẻ tín dụng từ máy chủ ứng dụng

Mã nguồn đi kèm với bài viết này có thể tải về và được biên dịch Bạn cần cài đặt DB2 9 với các tệp tin jar XML và JCC DB2 trong đường dẫn lớp cho Tomcat của bạn Nếu bạn muốn kiểm thử các giao dịch bằng thẻ tín dụng, thì bạn phải cài đặt các API Java của PayPal và có các tệp tin jar

ấy trong đường dẫn lớp cho Tomcat của bạn Bạn cũng phải tạo một tài khoản trong hộp cát (sandbox) của PayPal và nhận được các ủy quyền cho API của bạn, được nêu chi tiết trong Trung tâm tích hợp PayPal Sau đó bạn có thể sửa đổi các thông tin ủy quyền trong hàm setupPaypal() trong tệp tin article4.java

Về đầu trang

Kịch bản

Kịch bản là một khách hàng đặt phòng khách sạn qua web Trước tiên ông ta đăng nhập vào để lấy ra hồ sơ của mình Sau đó, ông xác định thành phố để lấy danh sách các khách sạn có sẵn và mức giá phòng của các khách sạn đó Cuối cùng, ông chọn một khách sạn và đặt một phòng

Trang 2

Hình 1 Kiến trúc mức tính năng

Các hành động của khách hàng trong máy khách dẫn đến kết quả là các cuộc gọi REST được thực hiện từ trình duyệt web đến máy chủ ứng dụng Đến lượt mình máy chủ ứng dụng có thể:

 Trực tiếp kết nối đến cơ sở dữ liệu nội bộ bằng cách sử dụng JDBC để lấy hồ sơ của khách hàng

 Thực hiện cuộc gọi SOAP tới cơ sở dữ liệu khác bên trong tường lửa của doanh nghiệp, nhưng ở sau tường lửa nội bộ của các bộ phận đặt phòng

 Thực hiện cuộc gọi REST đến nhà cung cấp dịch vụ giao dịch bằng thẻ tín dụng bên ngoài như PayPal

Hình 2 Kiến trúc mức thiết kế

Về đầu trang

Chi tiết

Trang 3

Để hiểu được những gì xảy ra đằng sau hậu trường khi khách hàng đi qua từng bước của quá trình đặt phòng, bạn hãy nhìn vào luồng thông tin và đoạn mã lệnh làm cho quá trình này có thể thực hiện được

Bước 1

Khách hàng nhập tên của mình vào trang web của đại lý du lịch và nhận hồ sơ của mình Để đơn giản, không yêu cầu mật khẩu và giả sử rằng hồ sơ của khách hàng đã tồn tại trong cơ sở dữ liệu của các đại lý

Hình 3 Luồng lệnh và dữ liệu để đăng nhập và lấy hồ sơ

Hồ sơ khách hàng, là một tài liệu XML, được lưu trữ trong cơ sở dữ liệu trong một cột XML Các thông tin về thẻ tín dụng cũng là một tài liệu XML, nhưng nó được mật mã hóa và lưu trữ trong định dạng nhị phân nhằm mục đích an ninh

Liệt kê 1 Tạo bảng khách hàng và chèn bản ghi

CREATE TABLE CUSTOMERS (CUSTID CHARACTER (64) NOT NULL,

CC VARCHAR(1024) for bit data not null, INFO XML NOT NULL )

insert into CUSTOMERS values('hardeep',

encrypt('<CC type="visa" expirydate="12/2009" number="4721930402892796"

cvv="808">

<name>hardeep singh</name></CC>' , 'password'),

'<Customer customerid="hardeep" firstname="hardeep" lastname="singh"/>');

Hình 4 Đăng nhập

Khi nút Login được nhấn, hàm Javascript getCustomerInfo() được gọi trong trình khách Hàm này tạo cuộc gọi REST cần thiết để thực hiện các dịch vụ customerinfo trong máy chủ ứng dụng

Trang 4

Liệt kê 2 Trình khách gọi để lấy hồ sơ người sử dụng

var cid=document.getElementById("userid").value;

var addr=servletpath+"?cmd=customerinfo&msg="+cid;

var xmlhttpObj= new XMLHttpRequest();

xmlhttpObj.open('GET', addr, true);

xmlhttpObj.onreadystatechange = function() {

getCustomerInfoCallback(xmlhttpObj); };

xmlhttpObj.send("");

Máy chủ ứng dụng thực hiện truy vấn SQL vào cơ sở dữ liệu nội bộ để lựa chọn hồ sơ khách hàng từ cột info của bảng khách hàng

Liệt kê 3 Máy chủ ứng dụng truy vấn cơ sở dữ liệu để lấy hồ sơ người sử dụng

Connection conn= DriverManager.getConnection("jdbc:db2:article4");

Statement stmt = conn.createStatement();

stmt.setMaxRows(1);

ResultSet rs= stmt.executeQuery(

"select info from customers where custid='"+msg+"'");

if(rs.next ()) retValue=rs.getString(1);

stmt.close();

conn.close();

Dữ liệu khách hàng từ việc truy vấn cơ sở dữ liệu được gửi lại cho trình khách dưới dạng dữ liệu XML

Liệt kê 4 Tiêu đề của HTTP cho dữ liệu trả về được thiết đặt là XML

_res.setContentType("text/xml");

_res.setHeader("Cache-Control", "no-cache");

_res.getWriter().write(retValue);

Khi trình khách nhận được dữ liệu khách hàng từ máy chủ ứng dụng, nó gọi hàm

getCustomerInfoCallback, ở đây dữ liệu XML của khách hàng được phân tích cú pháp thành cây DOM bằng cách sử dụng lớp bao bọc XMLParse và được lưu trong một biến toàn cục Giao diện người dùng được thay đổi để cho phép khách hàng nhập mã số của thành phố để liệt kê các khách sạn ở đó

Liệt kê 5 Tiêu đề của HTTP cho dữ liệu trả về được thiết đặt là XML

customerinfo= new xmlparse(xmlhttp.responseXML, false);

var hstr='<table cellSpacing="0" width="100%" cellPadding="2" border="0"

Trang 5

align="left">';

hstr+='<tr><td align="right">City Code:</td><td><INPUT type="text"

id="citycode"

SIZE=15 MAXLENGTH=50 value="msy" tabindex="1">';

hstr+='<td><INPUT type=button value="submit" onClick="javascript:getRates()"

>';

document.getElementById("canvas").innerHTML=hstr;

Bước 2

Bây giờ khách hàng tìm kiếm khách sạn ở thành phố nơi ông muốn đến du lịch

Hình 5 Luồng lệnh và dữ liệu để liệt kê danh sách khách sạn và giá phòng

Người dùng nhập mã số thành phố và nhấp chuột vào nút submit để gọi hàm getRates() trong Javascript của trình khách

Hình 6 Tìm kiếm khách sạn theo mã thành phố

Hàm getRates tạo ra cuộc gọi cho máy chủ ứng dụng bằng cách sử dụng lược đồ XML

OTA_HotelAvailRQ, để yêu cầu thông tin về khách sạn

Liệt kê 6 Tìm kiếm các thông điệp về khách sạn đã tạo ra bằng cách sử dụng lược đồ OTA_HotelAvailRQ

var citycode=document.getElementById("citycode").value

var req='OTA_HotelSearchRQ xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.opentravel.org/OTA/2003/05

OTA_HotelSearchRQ.xsd"

Trang 6

EchoToken="HL" Target="Production" Version="1.003" PrimaryLangID="EN-US" ResponseType="PropertyList">'+

'<POS><Source AirlineVendorID="FG" PseudoCityCode="MIA" ISOCountry="US"

ISOCurrency="USD" AgentSine="A4444BM" AgentDutyCode="FR"></Source>'+

'<Source><RequestorID Type="5" ID="12345675"

ID_Context="IATA"/></Source></POS>'+

'<Criteria><Criterion><RefPoint></RefPoint><CodeRef LocationCode="23"

CodeContext="OTA-REF code list"/>'+

'<HotelRef HotelCityCode="'+citycode+'"/><Radius Distance="2"

DistanceMeasure="MILES"/>'+

'<RoomAmenity RoomAmenity="74"/><RoomAmenity RoomAmenity="123"/></Criterion>

</Criteria></OTA_HotelSearchRQ>';

Cuộc gọi danh sách khách sạn được gửi đến máy chủ ứng dụng như là một yêu cầu POST bằng cách sử dụng các API AJAX

Liệt kê 7 Tìm kiếm thông điệp khách sạn được gửi đến máy chủ ứng dụng

var msg='<request cmd="hotelrates">'+req+'</request>';

var xmlhttpObj= new XMLHttpRequest();

xmlhttpObj.open('POST', servletpath, true);

xmlhttpObj.onreadystatechange = function() { getRatescallback(xmlhttpObj); }; xmlhttpObj.setRequestHeader('content-type', 'text/xml');

xmlhttpObj.send(msg);

Máy chủ ứng dụng tạo cuộc gọi SOAP tới thủ tục lưu sẵn getHotelRates trong cơ sở dữ liệu article4 chạy phía sau bức tường lửa của phòng ban nội bộ tại tại địa chỉ

http://localhost:8080/article4 Yêu cầu tìm kiếm khách sạn của OTA (msg) nhận được từ trình khách được chuyển như một đối số đến thủ tục lưu sẵn

Ghi chú: Thuộc tính SOAPAction của thông điệp SOAP được đặt theo tên của cơ sở dữ liệu

Liệt kê 8 Ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn getHotelRates của DB2

String body="<db:getHotelRates xmlns:db='http://ibm.com/db2/soap'>"+

"<db:arg>"+msg+"</db:arg></db:getHotelRates>";

return sendURLMessage("http://localhost:8080/article4/db2soapdriver",

body,"http://ibm.com/db2/soap#article4");

Mặc dù có các API có sẵn để tạo thông điệp SOAP, bài viết này sử dụng mã lệnh gọi URL cơ bản để minh họa rằng cuộc gọi SOAP không gì khác hơn là một cuộc gọi POST của HTTP trong

đó phần thân của thông điệp phù hợp với lược đồ XML chuẩn hóa

Ghi chú: SOAPAction được đặt theo tên của cơ sở dữ liệu đích

Trang 7

Liệt kê 9 Ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn getHotelRates của DB2

URL u = new URL(url);

URLConnection uc = u.openConnection();

HttpURLConnection connection = (HttpURLConnection) uc;

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setRequestMethod("POST");

connection.setRequestProperty("SOAPAction", database_name);

OutputStream out = connection.getOutputStream();

Writer wout = new OutputStreamWriter(out);

wout.write("<?xml version='1.0'?>\r\n");

>

wout.write("xmlns:SOAP-ENV=");

wout.write("'http://schemas.xmlsoap.org/soap/envelope/' ");

wout.write("xmlns:SOAP-ENC=");

wout.write("'http://schemas.xmlsoap.org/soap/encoding/' " );

wout.write("SOAP-ENV:encodingStyle=");

wout.write("'http://schemas.xmlsoap.org/soap/encoding/' ");

wout.write("xmlns:xsi=");

wout.write("'http://www.w3.org/2001/XMLSchema-instance'> ");

wout.write(" <SOAP-ENV:Body>");

wout.write(msg);

wout.write(" </SOAP-ENV:Body>");

wout.write("</SOAP-ENV:Envelope>\r\n");

Vì rằng máy chủ ứng dụng không làm gì khác hơn là tạo ra lớp bao bọc SOAP và gọi cuộc gọi URL, nếu các hạn chế an ninh trong AJAX cho phép, ta có thể cho rằng cuộc gọi SOAP cũng đã

có thể được thực hiện trực tiếp từ trình khách Mặc dù các cuộc gọi trực tiếp đến cơ sở dữ liệu từ một trình khách Web bằng cách sử dụng trình điều khiển SOAP là khả thi, chúng không được mong muốn vì lý do an ninh và trình điều khiển SOAP cần được tăng cường để ngăn chặn điều này xảy ra

Thủ tục lưu sẵn getHotelRates chỉ nhận một tham đối XML là yêu cầu OTA XQuery chiết xuất HotelCityCode từ XML đầu vào và sử dụng nó để tìm kiếm và liệt kê tất cả các khách sạn có thuộc tính HotelCityCode so khớp

Liệt kê 10 Thủ tục lưu sẵn getHotelRates

CREATE PROCEDURE getHotelRates( IN request XML )

DYNAMIC RESULT SETS 1

LANGUAGE SQL

BEGIN

DECLARE c_cur CURSOR WITH RETURN FOR

Select XMLQuery('declare namespace ns1 =

"http://www.opentravel.org/OTA/2003/05";

$info//ns1:HotelDescriptiveContents' passing info as "info")

from hotel

where xmlexists('declare namespace ns1 =

"http://www.opentravel.org/OTA/2003/05";

Trang 8

$info//ns1:HotelDescriptiveContents[@HotelCityCode=$req//ns1:HotelRef/@HotelC ityCode]'

passing request as "req", info as "info" );

OPEN c_cur;

END

Đáp ứng SOAP được trả về cho máy chủ ứng dụng từ db2soapdriver, đến lượt nó, được gửi về máy khách mà không có bất kỳ sửa đổi nào Điều này một lần nữa nhấn mạnh rằng trong mô hình lập trình XML, cơ sở dữ liệu trở thành một nhân tố chính và trong nhiều trường hợp nó làm giảm vai trò của các máy chủ ứng dụng xuống là vai trò của cảnh sát giao thông

Trình khách gọi hàm getRatescallback khi nó nhận được đáp ứng từ máy chủ ứng dụng Đáp ứng SOAP đã trả về được phân tích cú pháp bằng cách sử dụng trình phân tích DOM Trình phân tích DOM được đặt cấu hình để xử lý các không gian tên trong đáp ứng SOAP

Liệt kê 11 Máy khách phân tích cú pháp đáp ứng SOAP từ máy chủ ứng dụng

soapxml= new xmlparse(xmlhttp.responseXML, false);

soapxml.xmlRoot.setProperty("SelectionNamespaces",

"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'

xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'

xmlns:db='http://ibm.com/db2/soap'");

var hstr='<table cellSpacing="0" width="100%" cellPadding="2" border="1" align="left">';

hstr+="<tr><td>name<td>rate<td>rooms<td>";

Mỗi hàng trong tập kết quả từ cơ sở dữ liệu được chiết xuất vào một cây DOM khác, sau đó được điều hướng bằng cách sử dụng XPath để trích xuất các thông tin liên quan Một khung nhìn mới được tạo ra cho trình khách, khung nhìn này cho thấy danh sách tất cả các khách sạn đã được trả

về Xin lưu ý việc sử dụng bí danh không gian tên trong các cuộc gọi XPath

Liệt kê 12 Máy khách trích xuất tập kết quả từ cơ sở dữ liệu từ phần thân của SOAP

soapxml.find("//SOAP-ENV:Body//db:row",null,true);

for(i=0;soapxml.currentFind.length>i;i++)

{

var result=soapxml.getValue("db:col/text()",i);

rateslist=new xmlparse(result,true);

rateslist.xmlRoot.setProperty("SelectionNamespaces",

"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'

xmlns:x='http://www.opentravel.org/OTA/2003/05' ");

var id=rateslist.getValue("//x:HotelDescriptiveContents/@HotelCode",null); var name=rateslist.getValue("//x:HotelName/@HotelShortName",null);

var rooms=rateslist.getValue("//x:GuestRoomInfo/@Quantity",null);

var charge=rateslist.getValue("//x:Charge/@Amount",null);

Trang 9

hstr+="<tr><td>"+name+"<td>"+charge+"<td>"+rooms+"<td>

<input type='button' onClick=\"javascript:bookRoom('"+id+"','"+charge+"'); \" value='select'/>";

}

document.getElementById("canvas").innerHTML=hstr;

Bước 3

Trong bước cuối cùng này khách hàng sẽ chọn một khách sạn và đặt một phòng trong khách sạn

đó Các thông tin về thẻ tín dụng được lấy từ hồ sơ khách hàng đã lưu trong cơ sở dữ liệu

Hình 7 Luồng lệnh và dữ liệu để đặt phòng

Bây giờ khách hàng có thể chọn khách sạn trong danh sách để đặt phòng tại khách sạn đó

Trang 10

Hình 8 Đặt phòng trong danh sách khách sạn

Khi khách hàng nhấn nút Select, hàm bookroom trong Javascript phía khách được gọi Một thông điệp XML với yêu cầu đặt phòng sẽ được gửi đến máy chủ ứng dụng như là một yêu cầu POST bằng cách sử dụng các API AJAX Yêu cầu này cũng có ID của khách sạn, tên khách hàng, số phòng muốn đặt, và số tiền sẽ tính vào thẻ tín dụng của khách hàng

Liệt kê 13 Máy khách gọi máy chủ ứng dụng với cuộc gọi REST để đặt phòng

function bookRoom(hotelid,amount)

{

var cid=document.getElementById("userid").value;

var msg='<request cmd="bookroom"><message><ccinfo units="1" invoice=""

amount="'+amount+'"/><username>'+cid+'</username>

<hotelid>'+hotelid+'</hotelid></message></request>';

var xmlhttpObj= new XMLHttpRequest();

xmlhttpObj.open('POST', servletpath, true);

xmlhttpObj.onreadystatechange = function() { bookRoomcallback(xmlhttpObj); }; xmlhttpObj.setRequestHeader('content-type', 'text/xml');

xmlhttpObj.send(msg);

}

Máy chủ ứng dụng phân tích cú pháp thông điệp đến và chiết xuất ID của khách hàng từ thông điệp đó Sau đó, nó gọi cơ sở dữ liệu nội bộ để có thông tin về hồ sơ khách hàng và thẻ tín dụng

từ bảng khách hàng

Ghi chú: Thông tin về thẻ tín dụng được lưu trữ trong một cột đã mật mã hóa trong bảng khách

hàng Mặc dù mật khẩu trong đoạn mã lệnh ví dụ là mã cứng (hardcode), trong kịch bản thế giới thực, nhiều khả năng nó sẽ là mật khẩu được khách hàng sử dụng để đăng nhập

Liệt kê 14 Máy chủ ứng dụng truy vấn thông tin về thẻ tín dụng đã mật mã hóa từ cơ sở

dữ liệu

XMLParse msgxml=new XMLParse(msg);

String userid=msgxml.getValue("//username/text()");

Connection conn= DriverManager.getConnection("jdbc:db2:article4");

Statement stmt = conn.createStatement();

stmt.setMaxRows(1);

ResultSet rs= stmt.executeQuery("select info,

decrypt_char(CC,'password') from customers where custid='"+userid+"'");

if(rs.next ())

{

String custinfo=rs.getString(1);

String CCInfo=rs.getString(2);

Ngày đăng: 22/02/2014, 15:20

HÌNH ẢNH LIÊN QUAN

Hình 1. Kiến trúc mức tính năng - Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx
Hình 1. Kiến trúc mức tính năng (Trang 2)
Hình 2. Kiến trúc mức thiết kế - Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx
Hình 2. Kiến trúc mức thiết kế (Trang 2)
Hình 3. Luồng lệnh và dữ liệu để đăng nhập và lấy hồ sơ - Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx
Hình 3. Luồng lệnh và dữ liệu để đăng nhập và lấy hồ sơ (Trang 3)
Hình 5. Luồng lệnh và dữ liệu để liệt kê danh sách khách sạn và giá phòng - Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx
Hình 5. Luồng lệnh và dữ liệu để liệt kê danh sách khách sạn và giá phòng (Trang 5)
Hình 7. Luồng lệnh và dữ liệu để đặt phòng - Tài liệu Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn pptx
Hình 7. Luồng lệnh và dữ liệu để đặt phòng (Trang 9)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w