Ajax cho các nhà phát triển Java Tuần tự hóa đối tượng Java cho Ajax
Tóm tắt: Nếu bạn đang tiến hành pháttriển Web ™ bằng cách sử dụng
JavaScript và XML không đồng bộ (Ajax), thì việc phân phát dữ liệu từ máy chủ
cho máy khách có lẽ là mối quan tâm hàng đầu của bạn. Trong bài viết thứ hai
trong loạt bài Ajax for Java developersnày, Philip McCarthy cùng bạn qua năm
cách tiếp cận để tuần tự hóa đối tượng Java và cung cấp cho bạn tất cả các thông
tin bạn cần để chọn định dạng và công nghệ dữ liệu thích hợp tốt nhất cho ứng
dụng của bạn.
Trong bài viết đầu tiêncủa loạt bài này, tôi đã giới thiệu cho bạn các khối tạo
dựng của Ajax:
Cách sử dụng một đối tượng JavaScript XMLHttpRequestđể gửi một yêu
cầu không đồng bộ tới một máy chủ từ một trang Web.
Cách xử lý và trả lời yêu cầu đó bằng một Java servlet trả về một tài liệu
XML tới máy khách.
Cách sử dụng tư liệu trả lời đó trên máy khách để cập nhật khung nhìn
trang của bạn.
Bây giờ, tôi sẽ tiếp tục thảo luận về các quy tắc cơ bản về phát triển của Ajax,
nhưng tôi sẽ tập trung vào những gì quan trọng nhất đối với nhiều nhà phát triển
Web với Java: tạo dữ liệu cho máy khách
rs: [{ name: "John", instruments: ["Vocals","Guitar","Piano"] },
{ name: "Paul", instruments :["Vocals","Bass","Piano","Guitar"] },
{ name: "George", instruments: ["Guitar","Vocals"] },
{ name: "Ringo", instruments: ["Drums","Vocals"] } ] };
// Interrogate the band object
var musician = band.members[3];
alert( musician.name + " played " + musician.instruments[0] + "with " +
band.name );
Do JSON là một tính năng ngôn ngữ thú vị, nhưng với Ajax nó phải làm gì? Phần
cuối của câu chuyện là bạn có thể sử dụng JSON để gửi một đồ thị đối tượng
JavaScript qua mạng dưới dạng trả lời của máy chủ Ajax. Điều này có nghĩa là
một sự thoát ra khỏi chuyển hướng XML trên máy khách thông qua DOM API --
bạn chỉ cần đánh giá câu trả lời JSON và bạn ngay lập tức có một đồ thị đối tượng
JavaScript có thể truy cập. Tất nhiên, trước tiên cần chuyển JavaBeans của bạn
thành JSON.
Tạo JSON từ các lớp Java
Những ưu điểm và nhược điểm giống nhau áp dụng cho các kỹ thuật tạo XML
khác nhau cũng áp dụng để tạo JSON. Người ta cho rằng, có một trường hợp để sử
dụng các công nghệ tạo lại khuôn mẫu trình bày. Tuy nhiên, việc sử dụng JSON
kỹ hơn để chuyển các đối tượng được tuần tự hóa giữa các tầng ứng dụng hơn là
để tạo một khung nhìn trạng thái của ứng dụng. Tôi sẽ chỉ cho bạn cách sử dụng
Java API org.json để tạo các phương thức toJSONObject() trên các lớp Java của
bạn. Rồi các JSONObject của bạn có thể được tuần tự hóa đơn giản tới JSON. Liệt
kê 8 kiểm tra lại Liệt kê 1 từ cuộc thảo luận XML, hiển thị việc thực hiện
toJSONObject() cho lớp Order.
Liệt kê 8. Thực hiện phương thức toJSONObject () cho lớp Order
public JSONObject toJSONObject()
{ JSONObject json = new JSONObject();
json.put("id",id);
json.put("cost",getFormattedCost());
json.put("date",date);
JSONArray jsonItems = new JSONArray();
for (Iterator iter = items.iterator() ; iter.hasNext() ; )
{ jsonItems.put(iter.next().toJSONObject()); }
json.put("items",jsonItems); return json;
}
Như bạn có thể thấy, API org.json rất đơn giản. JSONObject thể hiện một đối
tượng JavaScript (tức một mảng kết hợp) và có các phương thức put() khác nhau
lấy một khoá String và giá trị là một kiểu nguyên thủy, một kiểu String, hoặc một
kiểu JSON khác. JSONArray thể hiện một mảng có lập chỉ mục, để cho phương
thức put() của nó chỉ có một giá trị. Lưu ý rằng trong Liệt kê 8, một sự lựa chọn
cho việc tạo mảng jsonItems và sau đó gắn nó vào đối tượng json với put() sẽ gọi
json.accumulate("items",iter.next().toJSONObject()); cho mỗi mục. Phương thức
accumulate() giống như put() trừ việc nó gắn thêm giá trị của mình cho một mảng
có lập chỉ mục được xác định bằng khoá.
Liệt kê 9 cho thấy cách để tuần tự hóa một JSONObject và viết nó vào một trả lời
của servlet.
Liệt kê 9. Tạo một trả lời JSON được tuần tự hóa từ một JSONObject
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws java.io.IOException, ServletException
{ String custId = req.getParameter("username");
Customer customer = getCustomer(custId);
res.setContentType("application/x-json");
res.getWriter().print(customer.toJSONObject());
}
Như bạn thấy, thực sự không có gì với nó. Phương thức toString() trên
JSONObject, được gọi ngầm ở đây, thực hiện tất cả công việc. Lưu ý rằng kiểu nội
dung application/x-json ít tin cậy -- tại thời điểm của bài viết này không có sự nhất
trí nào về những gì mà kiểu MIME của JSON sẽ có. Tuy nhiên, application/x-json
là một lựa chọn nhạy cảm trong lúc này. Liệt kê 10 hiển thị một ví dụ trả lời từ mã
servlet này.
Liệt kê 10. Thể hiện JSON của một bean Customer
{ "orders":
[ { "items":
[ { "price": "$49.99",
"description": "512 Megabyte Type 1 CompactFlash card.
Manufactured by Oolong Industries",
"name": "Oolong 512MB CF Card",
"id": "i-55768" },
{ "price": "$299.99",
"description": "7.2 Megapixel digital camera featuring
six shooting modes and 3x optical zoom. Silver.",
"name": "Fujak Superpix72 Camera",
"id": "i-74491" }
],
"date": "08-26-2005",
"cost": "$349.98",
"id": "o-11123" }
],
"realname": "James Hyrax",
"username": "jimmy66"
}
Sử dụng JSON trên máy khách
Bước cuối cùng trong tiến trình là chuyển dữ liệu JSON thành các đối tượng
JavaScript trên máy khách. Điều này có thể được thực hiện bằng một cuộc gọi đơn
giản tới eval(), hàm diễn giải các chuỗi có chứa các biểu thức JavaScript đang hoạt
động. Liệt kê 11 chuyển đổi một trả lời của JSON thành đồ thị đối tượng
JavaScript và sau đó thực hiện nhiệm vụ của Liệt kê 5 về việc nhận được tên của
mục đầu tiên từ đơn hàng cuối cùng của khách hàng.
Liệt kê 11. Đánh giá một trả lời của JSON
var jsonExpression = "(" + req.responseText + ")";
var customer = eval(jsonExpression);
// Find name of first item in customer's last order
var lastOrder = customer.orders[customer.orders.length-1];
var name = lastOrder.items[0].name;
So sánh với Liệt kê 11 với Liệt kê 5 minh họa sự thuận lợi cho máy khách khi sử
dụng JSON. Nếu dự án Ajax của bạn liên quan đến rất nhiều việc chuyển hướng
của các trả lời máy chủ phức tạp trên máy khách, thì JSON cũng hấp dẫn với bạn.
Việc đặt JSON và XMLHttpRequest với nhau cũng tạo một sự khởi đầu tương tác
Ajax trông giống như một cuộc gọi RPC hơn là một yêu cầu SOA, có thể có sự
liên quan đến việc thiết kế ứng dụng của bạn. Trong bài viết tiếp theo, tôi sẽ xem
xét các khung công tác được thiết kế rõ ràng để cho phép mã JavaScript thực hiện
các cuộc gọi phương thức từ xa trên các đối tượng phía máy chủ.
Nhược điểm của JSON
JSON có nhược điểm của nó. Việc sử dụng cách tiếp cận JSON minh họa ở đây,
không có cách nào để điều chỉnh sự tuần tự hóa của đối tượng trên cơ sở cho mỗi
yêu cầu, vì vậy các trường không cần thiết thường có thể được gửi qua mạng.
Ngoài ra, việc bổ sung thêm phương thức toJSONObject() cho mỗi JavaBean
không mở rộng hơn, mặc dù nó sẽ hoàn toàn dễ hiểu để viết JavaBean chung cho
một trình tuần tự hóa (serializer) JSON khi sử dụng xem xét nội tại và các chú
thích. Cuối cùng, nếu mã phía máy chủ của bạn theo hướng dịch vụ và không biến
đổi chỉ để xử lý các yêu cầu từ một máy khách Ajax, thì XML là một lựa chọn tốt
hơn do sự hỗ trợ phổ biến của nó.
So sánh các kỹ thuật tuần tự hóa
Bây giờ bạn đã thấy năm kỹ thuật khác nhau để chuyển trạng thái phía máy chủ
Java cho một máy khách Ajax. Tôi đã thảo luận sự tuần tự hóa XML với mã hóa
thủ công riêng của bạn, liên kết XML qua việc tạo mã, liên kết XML thông qua
một cơ chế ánh xạ, việc tạo XML dựa trên khuôn mẫu và cuối cùng tuần tự hóa
mã hóa thủ công tới JSON. Mỗi cái có những lợi thế và bất lợi riêng của nó và phù
hợp tốt nhất với các kiến trúc ứng dụng khác nhau.
Trong một nỗ lực tổng kết những lợi ích và hạn chế của từng cách tiếp cận, Bảng 1
gán các điểm số gần đúng theo sáu loại:
Khả năng mở rộng
Mô tả cách tiếp cận thích nghi với một số lượng lớn các kiểu dữ liệu tốt như
thế nào. Liệu khối lượng công việc mã hóa và cấu hình của bạn sẽ tăng theo
mỗi kiểu bổ sung không?
Dễ dàng tích hợp
Đánh giá cách đơn giản để tích hợp công nghệ vào dự án của bạn. Nó có
đòi hỏi quy trình xây dựng phức tạp hơn không? Liệu nó làm tăng tính phức
tạp triển khai không?
API của lớp Java
Mô tả cách dễ dàng làm việc với các đối tượng Java phía máy chủ được sử
dụng trong cách tiếp cận này. Bạn có bắt đầu viết các bean thông thường
không hoặc bạn sẽ phải làm việc với các thể hiện tài liệu rắc rối không?
Kiểm soát đầu ra
Mô tả bạn có thể kiểm soát việc thể hiện tuần tự hóa của các lớp của bạn
chính xác như thế nào.
Tính linh hoạt của khung nhìn
Đánh giá xem sự tuần tự hóa dữ liệu có tùy chỉnh, khác nhau có thể được
tạo từ cùng một tập các đối tượng.
Truy cập dữ liệu khách
Mô tả mã JavaScript làm việc với dữ liệu trả lời của máy chủ dễ dàng như
thế nào.
Bảng 1. Các hành động có liên quan của các kỹ thuật tạo dữ liệu
Tự XML
Liên kết
XML qua
việc tạo mã
Liên kết
XML qua
ánh xạ
XML tạo
khuôn mẫu
trang
Tuần tự hóa
JSSON mã hóa
thủ công
Khả năng mở
rộng Kém Tốt Trung bình Trung bình Kém
Dễ tích hợp Tốt Kém Trung bình Trung bình Tốt
API của lớp
Java Tốt Kém Tốt Tốt Tốt
Kiểm soát
đầu ra Tốt Tốt Trung bình Tốt Tốt
Tính linh hoạt
của khung
nhìn
Kém Kém Kém Tốt Kém
Truy cập dữ
liệu khách Kém Kém Kém Trung bình Tốt
Kết luận
Dữ liệu được biên dịch trong Bảng 1 không có ý muốn nói rằng bất kỳ trong số
các công nghệ tuần tự hóa nào tốt hơn so với các công nghệ khác. Xét cho cùng,
tầm quan trọng tương đối của mỗi một trong sáu loại phụ thuộc vào các chi tiết
của dự án của bạn. Ví dụ, nếu bạn đang làm việc với hàng trăm kiểu dữ liệu, bạn
muốn có khả năng mở rộng, vì thế việc tạo mã có lẽ là suy nghĩ tốt nhất của bạn.
Nếu bạn cần phải tạo các khung nhìn khác nhau cho cùng một mô hình dữ liệu,
việc tạo khuôn mẫu trang là cách thực hiện. Nếu bạn đang làm việc với một dự án
quy mô nhỏ và muốn giảm bớt số lượng mã JavaScript mà bạn sẽ phải viết, hãy
xem JSON.
Hy vọng rằng bài viết này đã cho bạn những thông tin cần thiết để chọn một công
nghệ tuần tự hóa phù hợp với ứng dụng của bạn. Xem phần Tài nguyên để tìm
hiểu thêm về các công nghệ đã thảo luận tại đây. Bạn cũng nên để ý đến các phần
tiếp theo của loạt bài này, ở đây tôi sẽ cho bạn thấy cách viết một ứng dụng Java
Ajax bằng cách sử dụng Direct Web Remoting (DWR-Truy cập Web trực tiếp từ
xa). Khung công tác DWR cho phép bạn gọi các phương thức trên các lớp Java
của bạn trực tiếp từ mã JavaScript. Nói cách khác, nó sẽ giữ gìn công việc tuần tự
hóa dữ liệu cho bạn để cho bạn có thể sử dụng Ajax ở một mức độ trừu tượng cao
hơn.
Mục lục
Tạo XML từ các lớp Java
Tự tuần tự hóa
Các khung công tác liên kết XML
Các hệ thống tạo khuôn mẫu trang
Dữ liệu trả lời không có XML
Ký hiệu đối tượng JavaScript
So sánh các kỹ thuật tuần tự hóa
Kết luận
File đính kèm:
Ajax cho các nhà phát triển Java Tuần tự hóa đối tượng Java cho Ajax.pdf

