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