Lập trình với XML cho DB2

Một mục tiêu chính của XML là làm cho quá trình phát triển ứng dụng

đơn giản, rẻ tiền, cơ động và có chất lượng cao. Việc lập trình XML đang dẫn đến

một loại biến chuyển cơ bản tương tự về mô hình phát triển ứng dụng trong thập

kỷ này như là các phương pháp luận đối tượng đã làm trong thập kỷ qua. Trong

bài đầu tiên của loạt bàinày về lập trình bằng XML với DB2® của IBM®cho

Linux® UNIX® và Windows®, bạn sẽ học những điều cơ bản về mô hình dữ liệu

XML và những ưu điểm mà nó mang lại cho môi trường lập trình của bạn trên một

mô hình đối tượng thuần túy.

pdf102 trang | Chuyên mục: XML | Chia sẻ: dkS00TYs | Lượt xem: 2069 | Lượt tải: 2download
Tóm tắt nội dung Lập trình với XML cho DB2, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g 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); 
Simpo PDF Merge and Split Unregistered Version - 
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=' 
xmlns:x=' "); 
 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); 
hstr+=""+name+""+charge+""+rooms+" 
<input type='button' onClick=\"javascript:bookRoom('"+id+"','"+charge+"'); 
 \" value='select'/>"; 
} 
Simpo PDF Merge and Split Unregistered Version - 
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 
Simpo PDF Merge and Split Unregistered Version - 
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 đó. 
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='<ccinfo units="1" invoice="" 
amount="'+amount+'"/>'+cid+' 
Simpo PDF Merge and Split Unregistered Version - 
'+hotelid+''; 
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 
Simpo PDF Merge and Split Unregistered Version - 
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); 
Tiếp theo, máy chủ ứng dụng tạo cuộc gọi SOAP đến thủ tục lưu sẵn bookaroom 
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ộ. ID 
của khách sạn và các thông tin về hồ sơ của khách hàng được chuyển như một đối 
số đến thủ tục lưu sẵn. 
Liệt kê 15. Máy chủ ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn 
bookaroom 
Simpo PDF Merge and Split Unregistered Version - 
String hotelid=msgxml.getValue("//hotelid/text()"); 
String body=""+ 
""+hotelid+""+ 
""+custinfo+""+ 
""+ 
""; 
String soapstr=sendURLMessage("", 
body,""); 
Thủ tục lưu sẵn bookaroom chỉ là một thủ tục giả luôn luôn trả về giá trị hoá đơn 
cố định trong đối số đầu ra của thủ tục lưu sẵn. Nó nhằm mục đích cho thấy 
db2soapdriver xử lý đối số đầu ra và biểu diễn chúng trong đáp ứng SOAP. 
Ghi chú: Nếu đó là một thủ tục lưu sẵn đang làm việc, thực sự đặt phòng, thì nó 
cũng sẽ yêu cầu các thông tin như ngày tháng nhập phòng và loại phòng để xử lý 
các giao dịch. Đây là một bài tập, bạn có thể mở rộng các kịch bản bằng cách tăng 
cường mã phía trình khách để chấp nhận các thông tin vể ngày tháng nhập phòng 
và loại phòng cũng như tạo ra thông điệp về đặt phòng tại OTA. Bạn cũng cần 
thêm một bảng khác để xử lý thông tin đặt phòng. 
Simpo PDF Merge and Split Unregistered Version - 
 Liệt kê 16. Máy chủ ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn 
bookaroom 
create procedure bookaroom (in hotelid varchar(12), in userinfo xml, 
 out invoice varchar(64)) 
language SQL 
begin 
set invoice = 'INV001'; 
return 1; 
end 
Chuỗi trả lời SOAP được phân tích cú pháp như là một đối tượng DOM bằng cách 
sử dụng lớp bao bọc XML, và số hoá đơn được chiết xuất bằng cách sử dụng cuộc 
gọi XPath. Xem tệp db2soapdriver.java để hiểu lược đồ trả lời SOAP sinh ra từ 
một cuộc gọi đến thủ tục lưu sẵn của DB2. 
Liệt kê 17. Máy chủ ứng dụng chiết xuất số hóa đơn từ trả lời SOAP 
Simpo PDF Merge and Split Unregistered Version - 
XMLParse soapXML= new XMLParse(true); 
soapXML.createDOM(soapstr,false); 
String namespaces= "SOAPENV= 
db2="; 
soapXML.setNamespaces(namespaces,"="); 
String invoice=soapXML.getValue("//db2:out/text()",null); 
Giá trị hóa đơn được thiết lập trong thông điệp của trình khách và được chuyển 
cho hàm giao dịch thẻ tín dụng. Kết quả của giao dịch thẻ tín dụng được gửi lại 
cho trình khách cùng với các thông tin về hóa đơn. 
Liệt kê 18. Máy chủ ứng dụng trả về kết quả của giao dịch thẻ tín dụng đến 
trình khách 
if(invoice!=null) 
{ 
Simpo PDF Merge and Split Unregistered Version - 
msgxml.setValue("//ccinfo/@invoice",invoice); 
retValue=""+makePayment(msgxml,CCInfo)+""; 
Trong hàm giao dịch thẻ tín dụng, các thông tin về thẻ tín dụng và giỏ mua hàng 
được chiết xuất từ thông điện của trình khách. 
Liệt kê 19. Ứng dụng chiết xuất thông tin về thẻ tín dụng và giỏ mua hàng từ 
DOM 
XMLParse ccinfo=new XMLParse(cc); 
String units=msg.getValue("//ccinfo/@units"); 
String invno=msg.getValue("//ccinfo/@invoice"); 
String amount=msg.getValue("//ccinfo/@amount"); 
String ctype=ccinfo.getValue("//CC/@type"); 
String cnumber=ccinfo.getValue("//CC/@number"); 
String cexpdate=ccinfo.getValue("//CC/@expirydate"); 
String ccvv=ccinfo.getValue("//CC/@cvv"); 
Simpo PDF Merge and Split Unregistered Version - 
String cname=ccinfo.getValue("//CC/name/text()"); 
String note="Paid by "+cname+" for "+units+" room(s) "; 
Các thông tin này được chuyển đến trung tâm dịch vụ thẻ tín dụng của PayPal 
bằng cách sử dụng các API cặp tên-giá trị (NVP) của chúng. 
API NVP là một giao diện đơn giản với các hàm nghiệp vụ, quản lý rủi ro và lô-
gic nghiệp vụ của PayPal. Ở mức cơ bản nhất, việc sử dụng các API NVP rất dễ 
dàng, giống như gửi một chuỗi NVP qua kết nối HTTPS đến máy chủ của PayPal, 
và sau đó xử lý đáp ứng, nó cũng là một chuỗi NVP. Việc thực hiện cuộc gọi API 
NVP bao gồm các bước cơ bản sau đây: 
1. Xây dựng chuỗi tham số yêu cầu các NVP cho một phương thức API cụ 
thể. 
2. Gửi bằng HTTPS chuỗi tham số này đến một máy chủ PayPal. 
3. Xử lý các NVP trong đáp ứng từ máy chủ. 
Liệt kê 20. Ứng dụng trích xuất và tạo các cuộc gọi API NVP đến dịch vụ web 
của PayPal 
NVPEncoder encoder = new NVPEncoder(); 
Simpo PDF Merge and Split Unregistered Version - 
encoder.add("METHOD","DoDirectPayment"); 
encoder.add("PAYMENTACTION","Sale"); 
encoder.add("AMT",amount); 
encoder.add("CREDITCARDTYPE",ctype); 
encoder.add("ACCT",cnumber); 
encoder.add("CVV2",ccvv); 
encoder.add("EXPDATE",cexpdate); 
encoder.add("FIRSTNAME",cname); 
encoder.add("CURRENCYCODE","USD"); 
 encoder.add("INVNUM",invno); 
 encoder.add("CUSTOM",note); 
String NVPString = encoder.encode(); 
String ppresponse = (String) caller.call(NVPString); 
NVPDecoder resultValues = new NVPDecoder(); 
resultValues.decode(ppresponse); 
String transactionId = (String)resultValues.get("TRANSACTIONID"); 
String amt = (String)resultValues.get("AMT"); 
Simpo PDF Merge and Split Unregistered Version - 
String avsCode = (String)resultValues.get("AVSCODE"); 
String cvv2Match = (String)resultValues.get("CVV2MATCH"); 
String strAck = resultValues.get("ACK"); 
String strAckSMSG = resultValues.get("L_SHORTMESSAGE0"); 
String strAckLMSG = resultValues.get("L_LONGMESSAGE0"); 
String strAckLERR= resultValues.get("L_ERRORCODE0"); 
if(strAck !=null && !(strAck.equals("Success") || 
strAck.equals("SuccessWithWarning"))) 
{ 
return("PAYPAL Failed "+strAckLERR+" "+strAckSMSG+" "+strAckLMSG ); 
} 
Tóm tắt 
Các ứng dụng dựa trên kiến trúc hướng Web có thể làm giảm sự phức tạp của thiết 
kế và của mã lệnh bằng cách sử dụng mô hình dữ liệu XML. Khi cơ sở dữ liệu 
được truy cập bằng cách sử dụng các API mức cao, chẳng hạn như SOAP và 
REST, thì khả năng tích hợp dữ liệu từ nhiều cơ sở dữ liệu đa dạng sẽ trở nên dễ 
Simpo PDF Merge and Split Unregistered Version - 
dàng. Trong một thế giới doanh nghiệp luôn luôn tiến triển với những cuộc sáp 
nhập và các đột nhập về an ninh, thì cách tiếp cận hộp đen ẩn giấu dữ liệu doanh 
nghiệp sau các dịch vụ Web là một đòi hỏi quan trọng. XML là chất keo gắn kết 
kiến trúc này với nhau và mô hình dữ liệu XML là mô hình lập trình tự nhiên 
trong môi trường này. 
Simpo PDF Merge and Split Unregistered Version - 

File đính kèm:

  • pdfLập trình với XML cho DB2, Phần 1 Hiểu biết mô hình dữ liệu XML.pdf
Tài liệu liên quan