Lập trình với XML cho DB2, Phần 3: Lập trình với XML ở phía khách

Sự phổ biến ngày một tăng của Web 2.0 phần lớn là nhờ tính linh hoạt của các thế hệ trình duyệt

web hiện nay. Các trình duyệt này sử dụng Ajax để giao tiếp với máy chủ để trao đổi dữ liệu

XML và sau đó sử dụng DHTML để dẫn hướng XML và trình bày nó cho người dùng. Các tính

năng trình duyệt cho phép chúng được sử dụng như là các trình khách đầy đủ trong các ứng dụng

dựa trên web.

Các công nghệ cơ sở đã sản sinh một số công nghệ và sáng kiến mới để đáp ứng sự phổ biến

ngày càng tăng của Web 2.0. Các thư viện trình trợ giúp như Dojo và Sarissa đã được tạo ra

nhằm làm cho việc sử dụng XML ít khó khăn hơn, và các hỗ trợ cho Đồ họa véc tơ co giãn được

(Scalable Vector Graphics -SVG) cũng đã tăng thêm. Các trình ti ện ích (widget) nhúng được như

Google và Yahoo Maps, các phương thức chia sẻ và tích hợp dữ liệu như nguồn cấp dữ liệu RSS

và Atom, và mẫu hình phát tri ển mới bằng cách sử dụng hỗn hợp dữ liệu đã được phát triển để

đáp ứng các nhu cầu ngày càng tăng của văn hóa Web 2.0.

pdf11 trang | Chuyên mục: XML | Chia sẻ: dkS00TYs | Ngày: 17/10/2014 | Lượt xem: 1250 | Lượt tải: 2download
Tóm tắt nội dung Lập trình với XML cho DB2, Phần 3: Lập trình với XML ở phía khách, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ụng lớp 
bao bọc DOM. 
Vì customerid là một thuộc tính trong lược kê ban đầu của khách hàng được gửi đến trình khách, 
nên không cần phải gửi tham số phụ chứa ID khách hàng trong yêu cầu. 
Liệt kê 8 cho thấy cách để trích xuất customerid từ XML và sử dụng nó để tạo ra lệnh SQL cập 
nhật cho cơ sở dữ liệu. Dữ liệu lược kê của khách hàng từ yêu cầu HTTP được chuyển như một 
tham số đến câu lệnh cập nhật, không cần có thay đổi gì. 
Liệt kê 8. Tạo một lệnh SQL cập nhật 
else if(cmd.equalsIgnoreCase("updateuserprofile")) 
{ 
 XMLParse custxml=new XMLParse(msgtext); 
 String cid= custxml.getValue("/Customer/@customerid"); 
 //update customer_table set custxml=? where customerid=cid 
 //stmt.setString(1,msgtext); 
} 
Hãy lưu ý sự tương tự trong mã ứng dụng được sử dụng để điều hướng các XML trong cả trình 
khách lẫn máy chủ. Cũng lưu ý rằng máy chủ ứng dụng trong cả hai yêu cầu HTTP đã hành động 
một cách đơn giản như là một người trung gian giữa trình khách và cơ sở dữ liệu - không có dữ 
liệu nào được thao tác trong trao đổi này. 
Tính toán mức bảo hiểm cho các hạng mục đã mua 
Người sử dụng lựa chọn một công ty bảo hiểm từ danh sách thả xuống chứa tên của tất cả các 
hãng bảo hiểm. Công ty bảo hiểm có một dịch vụ web có thể truy vấn để lấy mức giá bảo hiểm 
hiện tại. Các thông tin về mức bảo hiểm được cung cấp như là một tài liệu XML và được sử 
dụng bởi ứng dụng để tính toán mức bảo hiểm trên mỗi hạng mục. 
Mã Java của trình khách 
URL của dịch vụ web đi kèm mà công ty bảo hiểm cung cấp cũng được chọn từ một danh sách. 
Vì Ajax ngăn ngừa đổi hướng URL, nên bạn cần phải gọi dịch vụ web từ máy chủ ứng dụng. 
Bạn chuyển URL trong yêu cầu đến máy chủ ứng dụng để tính toán chi phí bảo hiểm của mỗi 
hạng mục đã mua. Liệt kê 9 cho thấy quá trình này: 
Liệt kê 9. Trình khách lựa chọn URL 
function itemsPurchased(url,cid) 
{ 
 var msg='<data 
customerid="cid"> 
 '; 
 var xmlhttpObj= new XMLHttpRequest(); 
 xmlhttpObj.open('POST', hostname, true); 
 xmlhttpObj.onreadystatechange = function() { temsPurchasedCallback 
(xmlhttpObj); }; 
 xmlhttpObj.setRequestHeader('content-type', 'text/xml'); 
 xmlhttpObj.send(msg); 
} 
} 
Lưu ý : Vì URL có thể chứa các ký tự đặc biệt, chúng ta đã nhúng nó vào bên trong một đoạn 
CDATA để tránh việc yêu cầu XML bị biến dạng 
Mã Java của máy chủ ứng dụng 
Thông điệp yêu cầu được phân tích cú pháp bằng cách sử dụng lớp bao bọc DOM và URL của 
nhà bảo hiểm được tách ra từ nó. Liệt kê 10 cho thấy cách ứng dụng sử dụng URL này để thực 
hiện cuộc gọi đến dịch vụ web của nhà cung cấp bảo hiểm để lấy ra tài liệu XML có chứa các 
mức bảo hiểm. 
Liệt kê 10. Máy chủ ứng dụng lấy ra mức bảo hiểm 
else if(cmd.equalsIgnoreCase("getPurchaseInfoWithInsurance")) 
{ 
 XMLParse dataxml=new XMLParse(msgtext); 
 String url= dataxml.toString("/data/text()"); 
 String insurancestr=callWebServiceUsingHTTPClient(url); 
Lưu ý: Tài liệu XML về mức bảo hiểm được định nghĩa trong bài viết Phần 2, trong mục có tên 
là "Một ví dụ phức tạp hơn". 
ID của khách hàng cũng được trích ra từ thông điệp và được sử dụng để truy vấn cơ sở dữ liệu 
lấy thông tin về các hạng mục đã mua của khách hàng. 
String cid= dataxml.getValue("/data/@customerid"); 
Phần còn lại của logic nghiệp vụ để tạo danh sách các mục đã mua được thực hiện theo một 
trong hai cách: 
1. Thực hiện cuộc gọi đến thủ tục lưu sẵn của cơ sở dữ liệu đã tạo ra trong bài viết phần 2 > 
Liệt kê 6. 
// returnvalue = call customerItemsWithInsurance (cid, insurancestr); 
2. Mã hóa logic này trong máy chủ ứng dụng bằng cách sử dụng đoạn mã trong bài viết đầu 
tiên. Sử dụng customerXML trong Phần 1: Liệt kê 6, lặp lần lượt qua từng hạng mục, tính 
toán chi phí bảo hiểm và bổ xung nó vào mục thông tin. 
Hãy thay thế các dòng 9-11 trong mã gốc bằng các dòng sau: 
Liệt kê 11. Thay thế cho các dòng 9-11 
XMLParse insurancexml=new XMLParse(insurancestr); 
customerXML.find("/Customer/Items/item",true); 
String currency= insurancexml.getValue("//rate/@currency"); 
for(int i=0; customerXML.currentFind.getLength()>i;i++) 
{ 
 price = customerXML.getValue("@price",i)); 
 if(price>500) rate= insurancexml.getValue("//rate[@price=""]/@rate")); 
 else If(price>100) rate= 
insurancexml.getValue("//rate[@price="500"]/@rate")); 
 else rate= insurancexml.getValue("//rate[@price="100"]/@rate")); 
 String iteminsurance=""+price*rate 
+"" 
 customerXML. appendElement(customerXML.createNode (iteminsurance), 
 customerXML.getNode (null,i), false ) 
} 
// returnvalue = customerXML.toString(); 
Nếu bạn so sánh các mã trên với truy vấn trong thủ tục lưu sẵn customerItemsWithInsurance của 
bài viết thứ 2, bạn sẽ thấy rằng có rất nhiều điểm giống nhau giữa chúng, đặc biệt là trong các 
XPaths đã được sử dụng. Thực tế này một lần nữa củng cố lợi thế của việc sử dụng mô hình 
XML và sự dễ dàng của việc đẩy logic nghiệp vụ vào cơ sở dữ liệu. 
Bạn cũng lưu ý sức mạnh của biểu thức XPath để tìm kiếm và điều hướng bên trong mô hình dữ 
liệu XML phân cấp. Việc tái tạo loại tìm kiếm này trong mô hình dữ liệu đối tượng bằng cách sử 
dụng mã java sẽ đòi hỏi rất nhiều nỗ lực. Việc sử dụng XPath đơn giản hóa quá trình và cho phép 
nó được thực hiện bằng chỉ một chuỗi ký tự. 
Mã Java của trình khách 
Đáp ứng của máy chủ gọi hàm itemsPurchasedCallback mà trong đó dữ liệu XML trả về được 
phân tách cú pháp bằng cách sử dụng lớp bao bọc DOM. Liệt kê 12 cho thấy cách để làm điều 
này: 
Liệt kê 12. XML được phân tích cú pháp bằng cách sử dụng lớp bao bọc DOM 
function itemsPurchasedCallback (xmlhttp) 
{ 
 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
 { 
 var itemInfo= new xmlparse(xmlhttp.responseXML, false); 
Đầu tiên bạn hãy trích xuất tên người dùng từ XML đã trả về: 
Liệt kê 13. Trích xuất tên người dùng 
var firstname = userinfo.getValue("/Customer/@firstname",null); 
var lastname = userinfo.getValue("/Customer/@lastname",null); 
var htmlstr="" 
htmlstr+='firstname:'+firstname 
htmlstr+='lastname:'+lastname 
Sau đó lặp lần lượt qua tất cả các mục trong tài liệu và trích xuất các thông tin liên quan để tạo 
chuỗi HTML được sử dụng để xuất bản thông tin này tới người sử dụng. 
Liệt kê 14. Trích xuất HTML cho phép xuất bản 
itemInfo.find("//item",null,true); 
htmlstr+='itemIDdescriptiondatepriceinsurance'; 
for(var j=0;itemInfo.currentFind.length>j ;j++) 
{ 
 var id= itemInfo.getValue("@ID",j); 
 var description= itemInfo.getValue("@description",j); 
 var purchaseDate= itemInfo.getValue("@purchaseDate",j); 
 var price= itemInfo.getValue("@price",j); 
 var insurance= itemInfo.getValue("insurance/text()",j); 
 var currency= itemInfo.getValue("insurance/@currency",j); 
 htmlstr+=''+id+''+description+'' +purchaseDate+ 
 '' +currency+price++'' +insurance; 
} 
document.getElementById("profilediv").innerHTML=htmlstr; 
} 
Hãy lưu ý sự tương tự giữa mã JavaScript trong trình khách đã sử dụng XPath để tìm kiếm và lặp 
lần lượt qua các phần tử mục hàng và mã lệnh Java trong máy chủ ứng dụng được định nghĩa từ 
trước. 
Về đầu trang 
Mô hình dữ liệu đối tượng 
Ngay cả khi bạn đã sử dụng cách tiếp cận mô hình dữ liệu đối tượng tiêu chuẩn, các đối tượng dữ 
liệu tầng ứng dụng của bạn vẫn sẽ cần phải được tuần tự hóa thành một định dạng mà trình khách 
hiểu được. Vì các đối tượng rất phức tạp, nên bạn về cơ bản sẽ có hai lựa chọn: 
1. Tạo trang cho trình khách trong tầng ứng dụng và điền dữ liệu vào trong phần thích hợp của 
trang web (cách tiếp cận ASP/JSP). Sau đó đưa ra nhiều API để chấp nhận bất kỳ sửa đổi nào 
của người sử dụng đối với dữ liệu. Các vấn đề với cách tiếp cận này là: 
 Nó hòa lẫn mã của trình khách và của máy chủ ứng dụng, tạo ra một kiến trúc cẩu thả; 
 Nó đòi hỏi phải tạo ra và viết tư liệu giải thích thêm nhiều API để trình khách chuyển trở 
lại bất kỳ thay đổi dữ liệu đáng kể nào. 
2. Tạo ra một cấu trúc dữ liệu có thể được gửi cho trình khách dưới dạng chuỗi ký tự. Định dạng 
được chấp nhận nhất để biểu diễn một cấu trúc dữ liệu đã tuần tự hóa như vậy là XML. Vấn đề 
với cách làm này là: 
 Bây giờ bạn phải viết thêm mã lệnh để thực hiện việc tuần tự hóa 
 Nếu dữ liệu được cập nhật từ máy khách là XML, thì sau đó cần nhiều mã hơn trong máy 
chủ ứng dụng để diễn giải XML đã sửa đổi trở lại thành đối tượng dữ liệu của ứng dụng. 
Một câu hỏi hiển nhiên nảy sinh là: Nếu bạn phải dùng đến mô hình dữ liệu XML để giao tiếp 
với trình khách, thì tại sao không sử dụng nó trong chính tầng ứng dụng? 
Bạn vẫn còn cần thao tác các thông tin mà bạn đã nhận như là một kết quả với dịch vụ trang web 
về mức bảo hiểm. Vì rằng các thông tin này ở dạng XML, nên đầu tiên bạn cần phải phân rã nó 
thành mô hình đối tượng của bạn. Nếu dữ liệu của bạn đã được lưu trữ trong cơ sở dữ liệu như 
XML, bạn có thể chuyển XML tới cho thủ tục lưu sẵn customerItemsWithInsurance. Vấn đề với 
cách tiếp cận này là nếu bạn đang lưu trữ dữ liệu dưới dạng XML và bạn đang sử dụng mô hình 
đối tượng trong ứng dụng, thì tất cả các loại vấn đề về ánh xạ và biến đổi sẽ phát sinh. 
Nếu dữ liệu được lưu trữ trong cơ sở dữ liệu trong một lược đồ quan hệ, thì các truy vấn của bạn 
vào cơ sở dữ liệu sẽ trở nên phức tạp hơn. Hơn nữa, bạn sẽ phải viết mã bổ xung ở tầng giữa để 
ánh xạ dữ liệu quan hệ tới mô hình dữ liệu đối tượng hoặc mô hình dữ liệu XML. 
Về đầu trang 
Kết luận 
Trong kiến trúc hướng Web, dữ liệu cần phải được tuần tự hóa qua các tầng khác nhau của ứng 
dụng. Cách thức dễ được chấp nhận nhất để chuyển các dữ liệu phức tạp giữa một trình khách 
web và máy chủ ứng dụng là XML. Trong mỗi tầng, các dữ liệu có thể được truy vấn, chuyển 
đổi, và cập nhật, vì nếu bản chất XML của dữ liệu được duy trì, thì sau đó nó có thể sử dụng các 
công nghệ dựa trên XML như XPath, DOM và XQuery để thao tác dữ liệu. Đây là mô hình dữ 
liệu XML cho lập trình và trong thế giới đầy thách thức của tích hợp dữ liệu nghiệp vụ, nó cũng 
có thể là thuốc chữa bách bệnh. 

File đính kèm:

  • pdfLập trình với XML cho DB2, Phần 3 Lập trình với XML ở phía khách.pdf
Tài liệu liên quan