Ajax cho các nhà phát triển Java: Ajax với Direct Web Remoting Sự tuần tự hóa dữ liệu không dễ dàng hơn điều này! pdf

23 280 0
Ajax cho các nhà phát triển Java: Ajax với Direct Web Remoting Sự tuần tự hóa dữ liệu không dễ dàng hơn điều này! pdf

Đ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

Ajax cho các nhà phát triển Java: Ajax với Direct Web Remoting Sự tuần tự hóa dữ liệu không dễ dàng hơn điều này! Philip McCarthy, Nhà Phát triển, SmartStream Technologies Ltd Tóm tắt: Thật thú vị như nó có, việc thêm chức năng Ajax cho các ứng dụng của bạn có thể mang lại nhiều việc khó khăn. Trong bài viết thứ ba của loạt bài Ajax cho các nhà phát triển Java™ này, Philip McCarthy cho bạn thấy cách sử dụng Direct Web Remoting (DWR-Truy cập Web trực tiếp từ xa) để trực tiếp đặt các phương thức JavaBeans vào mã JavaScript của bạn và tự động hóa công việc đòi hỏi sự nỗ lực của Ajax. Hiểu biết những điều căn bản về lập trình Ajax (fundamentals of Ajax programming) là điều cần thiết, nhưng nếu bạn đang xây dựng các giao diện người dùng (UI) Ajax phức tạp, điều quan trọng là có thể làm việc ở một mức độ trừu tượng cao hơn. Trong bài viết thứ ba của loạt bài Ajax cho các nhà phát triển Java này, tôi thêm phần giới thiệu của số trước vào các kỹ thuật tuần tự hóa dữ liệu cho Ajax (data serialization techniques for Ajax), giới thiệu một kỹ thuật cho phép bạn tránh những chi tiết thực dụng của việc tuần tự hóa các đối tượng Java. Trong bài trước, tôi đã chỉ cho bạn cách sử dụng JavaScript Object Notation (JSON- Ký hiệu đối tượng JavaScript) để tuần tự hóa dữ liệu theo một định dạng dễ dàng được chuyển đổi thành các đối tượng JavaScript trên máy khách. Với thiết lập này, bạn có thể gọi các cuộc gọi dịch vụ từ xa khi sử dụng mã JavaScript và nhận các đồ thị đối tượng JavaScript trả lời, không giống như việc thực hiện một cuộc gọi thủ tục từ xa. Bây giờ, bạn sẽ tìm hiểu cách tiến thêm một bước nữa, bằng cách sử dụng một khung công tác chính thức hóa khả năng của bạn để thực hiện cuộc gọi thủ tục từ xa trên các đối tượng Java phía máy chủ từ mã máy khách JavaScript. DWR là một giải pháp được cấp phép Apache, mã nguồn mở gồm các thư viện Java phía máy chủ, một servlet DWR và các thư viện JavaScript. Trong khi DWR không chỉ là bộ công cụ Ajax-RPC có sẵn cho nền tảng Java, mà nó còn là một trong những giải pháp hoàn thiện nhất và cung cấp rất nhiều chức năng có ích. Xem Tài nguyên để tải về DWR trước khi tiếp tục các ví dụ. DWR là gì? Theo các thuật ngữ đơn giản nhất, DWR là một công cụ đặt các phương thức của các đối tượng Java phía máy chủ theo mã JavaScript. Thực tế, với DWR, bạn có thể loại bỏ tất cả máy theo chu trình yêu cầu-trả lời của Ajax ra khỏi mã ứng dụng của bạn. Điều này có nghĩa là mã phía máy khách của bạn không bao giờ phải xử lý trực tiếp một đối tượng XMLHttpRequest hoặc xử lý trả lời của máy chủ. Bạn không cần phải viết mã tuần tự hóa đối tượng hoặc sử dụng các công cụ của bên thứ ba để chuyển các đối tượng của bạn sang XML. Bạn thậm chí không cần phải viết mã servlet để dàn xếp các yêu cầu Ajax thành các cuộc gọi trên các đối tượng miền Java của bạn. DWR được triển khai như là một servlet trong ứng dụng Web của bạn. Được xem như hộp đen, servlet này thực hiện hai vai trò chính: Thứ nhất, với mỗi lớp được trưng ra, DWR tự động tạo Javascript để có trong trang Web của bạn. JavaScript được tạo có chức năng stub để thể hiện các phương thức tương ứng trên lớp Java và cũng thực hiện các XMLHttpRequest ở hậu trường. Các yêu cầu này được gửi tới servlet DWR, mà servlet DWR, trong vai trò thứ hai của mình, dịch chuyển yêu cầu đó thành một cuộc gọi phương thức trên một đối tượng Java phía máy chủ và gửi các giá trị trả về tới phía máy khách theo dạng trả lời servlet của nó, được mã hóa thành JavaScript. DWR cũng cung cấp các hàm tiện ích JavaScript giúp thực hiện các nhiệm vụ UI chung. Về ví dụ này Trước khi giải thích DWR chi tiết hơn, tôi sẽ giới thiệu một kịch bản ví dụ đơn giản. Như trong các bài viết trước đây, tôi sẽ sử dụng một mô hình tối thiểu dựa trên một cửa hàng trực tuyến, lúc này có một thể hiện sản phẩm cơ bản, một giỏ mua hàng của người dùng có thể chứa các mục và một đối tượng truy cập dữ liệu (DAO) để tìm kiếm các chi tiết sản phẩm từ một kho dữ liệu. Lớp Item là một lớp giống như được sử dụng trong bài viết trước, nhưng nó không còn thực hiện bất kỳ các phương thức tuần tự hóa nào bằng thủ công. Hình 1 mô tả thiết lập đơn giản này: Hình 1. Biểu đồ lớp mô tả các giỏ hàng, CatalogDAO và các lớp Item Tôi sẽ trình diễn hai trường hợp sử dụng rất đơn giản trong kịch bản này. Trước tiên, người dùng có thể thực hiện tìm kiếm văn bản trên danh mục và xem các mục phù hợp. Thứ hai, người sử dụng có thể thêm các mục vào giỏ mua hàng và xem tổng chi phí của các mục trong giỏ hàng. Thực hiện danh mục Điểm khởi đầu của một ứng dụng DWR là viết mô hình đối tượng phía máy chủ của bạn. Trong trường hợp này, tôi bắt đầu bằng cách viết một DAO để cung cấp các khả năng tìm kiếm trên kho dữ liệu (datastore) danh mục sản phẩm. CatalogDAO.java là một lớp không trạng thái, đơn giản với một số hàm tạo không-đối số. Liệt kê 1 cho thấy các điểm đặc trưng của các phương thức Java mà tôi muốn để trưng ra cho các máy khách Ajax: Liệt kê 1. Các phương thức CatalogDAO để trưng ra qua DWR /** * Returns a list of items in the catalog that have * names or descriptions matching the search expression * @param expression Text to search for in item names * and descriptions * @return list of all matching items */ public List<Item> findItems(String expression); /** * Returns the Item corresponding to a given Item ID * @param id The ID code of the item * @return the matching Item */ public Item getItem(String id); Tiếp theo, tôi cần cấu hình DWR, cho nó biết các máy khách Ajax nên có khả năng xây dựng một CatalogDAO và gọi các phương thức này. Tôi thực hiện việc này với tệp cấu hình dwr.xml được hiển thị trong Liệt kê 2: Liệt kê 2. Cấu hình để trưng ra các phương thức CatalogDAO <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="catalog"> <param name="class" value="developerworks.ajax.store.CatalogDAO"/> <include method="getItem"/> <include method="findItems"/> </create> <convert converter="bean" match="developerworks.ajax.store.Item"> <param name="include" value="id,name,description,formattedPrice"/> </convert> </allow> </dwr> Phần tử gốc của tài liệu dwr.xml là dwr. Bên trong nó là phần tử allow (cho phép), cho phép xác định các lớp mà DWR sẽ truy cập từ xa. Hai phần tử con của allow là create (tạo) và convert (chuyển đổi). Phần tử create Phần tử create báo cho DWR biết một lớp phía máy chủ nên được trưng ra cho các yêu cầu Ajax và định nghĩa cách DWR nhận được một cá thể của lớp đó từ xa. Thuộc tính creator ở đây được đặt tới giá trị new, có nghĩa là DWR sẽ gọi hàm tạo mặc định của lớp để nhận được một cá thể. Các khả năng khác là tạo một cá thể thông qua một đoạn kịch bản lệnh bằng cách sử dụng Bean Scripting Framework (BSF-Khung công tác tạo kịch bản lệnh Bean) hoặc để nhận được một cá thể thông qua việc tích hợp với thùng chứa IOC, Spring. Theo mặc định, khi yêu cầu Ajax với DWR gọi creator, đối tượng cụ thể được đặt trong phạm vi trang và do đó không còn tồn tại sau khi yêu cầu hoàn tất. Trong trường hợp của CatalogDAO không trạng thái, điều này là tốt. Thuộc tính javascript của phần tử create xác định tên mà đối tượng sẽ có thể truy cập từ mã JavaScript. Được lồng bên trong phần tử create , phần tử param xác định lớp Java mà phần tử creator sẽ tạo ra. Cuối cùng, các phần tử, include xác định các tên của các phương thức sẽ được trưng ra. Việc bắt đầu các phương thức để trưng ra là thực tế tốt để tránh vô tình cho phép truy cập chức năng có thể gây hại nếu phần tử này được bỏ qua, tất cả các phương thức của lớp sẽ được trưng ra các cuộc gọi từ xa. Lần lượt, bạn có thể sử dụng các phần tử exclude (loại trừ) để xác định chỉ những phương thức nào bạn muốn ngăn chặn truy cập vào. Phần tử convert Trong khi các creator có liên quan tới việc trưng ra các lớp và các phương thức của chúng cho việc truy cập Web từ xa, các convertor (trình chuyển đổi) có liên quan đến các kiểu tham số và kiểu trả về của các phương thức đó. Vai trò của phần tử convert là để nói cho DWR biết cách chuyển đổi các kiểu dữ liệu giữa việc thể hiện đối tượng Java phía máy chủ của chúng và việc thể hiện JavaScript được tuần tự hóa và ngược lại. DWR tự động dàn xếp các kiểu dữ liệu đơn giản giữa các thể hiện Java và JavaScript. Các kiểu này gồm các gốc Java, cùng với các thể hiện lớp tương ứng của chúng, cũng như các kiểu Strings và Dates, Mảng và các kiểu bộ sưu tập. DWR cũng có thể chuyển đổi JavaBeans thành các thể hiện JavaScript, nhưng vì lý do bảo mật, việc thực hiện như vậy cần cấu hình rõ ràng. Phần tử convert trong Liệt kê 2 báo cho DWR sử dụng trình chuyển đổi bean dựa trên phản chiếu của nó cho các Item được trả về bằng các phương thức đã cho biết của CatalogDAO và chỉ định các bộ phận của Item nào cần có trong tuần tự hóa. Các bộ phận được xác định bằng cách sử dụng quy ước đặt tên JavaBean, vì thế DWR sẽ gọi các phương thức get tương ứng. Trong trường hợp này, tôi đang bỏ qua trường price (giá cả) bằng số và thay vào đó có trường formattedPrice, có sẵn định dạng tiền tệ để hiển thị. Lúc này tôi đã sẵn sàng triển khai dwr.xml của tôi sang thư mục WEB-INF của ứng dụng Web của mình, ở đó DWR servlet sẽ chọn nó. Tuy nhiên, trước khi tiếp tục, để đảm bảo rằng tất cả mọi thứ đang làm việc như mong đợi là một ý tưởng tốt. Thử nghiệm triển khai Nếu định nghĩa web.xml của DWRServlet đặt init-param debug là true (đúng), thì sau đó chế độ thử nghiệm vô cùng có ích của DWR được kích hoạt. Việc chuyển hướng tới /{your-web-app}/dwr/ sẽ đưa ra một danh sách các lớp của bạn đã được DWR đặt cấu hình truy cập từ xa. Việc nhấn chuột sẽ đưa bạn tới màn hình trạng thái cho một lớp cụ thể. Trang thử nghiệm DWR cho CatalogDAO được hiển thị trong Hình 2. Cũng như việc cung cấp một thẻ script để dán vào các trang Web của bạn, việc trỏ tới JavaScript được tạo của DWR cho lớp đó, màn hình này cũng cung cấp một danh sách các phương thức của lớp. Danh sách này gồm các phương thức được thừa kế từ các siêu kiểu của lớp, nhưng chỉ những có các phương thức nào mà tôi xác định rõ ràng để truy cập từ xa trong dwr.xml được đánh dấu là có thể truy cập được. Hình 2. Trang thử nghiệm DWR cho CatalogDAO Có thể nhập các giá trị tham số vào các hộp văn bản bên cạnh các phương thức được phép truy cập và nhấn nút Execute (Thực hiện) để gọi chúng. Trả lời của máy chủ sẽ được hiển thị bằng cách sử dụng ký hiệu của JSON trong một hộp cảnh báo, trừ khi nó là một giá trị đơn giản; trong trường hợp này nó được hiển thị nội tuyến dọc theo các phương thức. Các trang thử nghiệm này rất có ích. Không chỉ chúng cho phép bạn dễ dàng kiểm các lớp và phương thức nào được trưng ra để truy cập từ xa, mà bạn cũng có thể thử nghiệm xem mỗi phương thức có đang hoạt động như mong đợi không. Một khi bạn đã hài lòng rằng các phương thức được truy cập từ xa của bạn đang hoạt động đúng, bạn có thể sử dụng các stub (nhánh rẽ) JavaScript được tạo của DWR để gọi các đối tượng phía máy chủ của bạn từ mã phía máy khách. Gọi một đối tượng được truy cập từ xa Việc ánh xạ giữa các phương thức đối tượng Java được truy cập từ xa và các hàm stub JavaScript tương ứng của chúng là đơn giản. Dạng chung là JavaScriptName.methodName(methodParams , callBack), ở đây JavaScriptName là bất kỳ tên đã được xác định như là thuộc tính javascript của creator, methodParams thể hiện các tham số n của phương thức Java và callback (gọi lại) là một hàm JavaScript, nó sẽ được gọi với giá trị trả về của phương thức Java. Nếu bạn quen với Ajax, bạn sẽ nhận ra cơ chế gọi lại như là cách tiếp cận thông thường cho sự không đồng bộ của XMLHttpRequest. Trong kịch bản ví dụ này, tôi sử dụng các hàm JavaScript trong Liệt kê 3 để thực hiện tìm kiếm và cập nhật giao diện người dùng theo các kết quả tìm kiếm. Danh sách này cũng sử dụng các hàm tiện ích từ util.js của DWR. Có chú ý đặc biệt là hàm JavaScript có tên là $(), nó có thể được dùng như một phiên bản được cải tiến của document.getElementById(). Tất nhiên là dễ dàng định kiểu hơn. Nếu bạn đã sử dụng thư viện JavaScript nguyên mẫu, bạn sẽ quen thuộc với hàm này. Liệt kê 3. Gọi phương thức findItems remoted () từ máy khách /* * Handles submission of the search form */ function searchFormSubmitHandler() { // Obtain the search expression from the search field var searchexp = $("searchbox").value; // Call remoted DAO method, and specify callback function catalog.findItems(searchexp, displayItems); // Return false to suppress form submission return false; } /* * Displays a list of catalog items */ function displayItems(items) { // Remove the currently displayed search results DWRUtil.removeAllRows("items"); if (items.length == 0) { alert("No matching products found"); $("catalog").style.visibility = "hidden"; } else { DWRUtil.addRows("items",items,cellFunctions); $("catalog").style.visibility = "visible"; } } [...]... của ứng dụng Ajax cho dù bạn chọn một cách tiếp cận dựa trên XMLHttpRequest với một khung công tác tuần tự hóa đối tượng hay trừu tượng mức độ cao hơn của DWR Hãy theo dõi các bài viết tiếp theo khám phá Ajax cho các nhà phát triển Java trong những số tháng tới Mục lục  DWR là gì?  Về ví dụ này  Thực hiện danh mục  Thử nghiệm triển khai  Gọi một đối tượng được truy cập từ xa  Triển khai thực... để gọi vào các nhánh DWR Thứ hai (và đáng kể hơn) , sự kết hợp này làm cho các mối quan tâm phía máy khách lọt vào trong mã phía máy chủ Ví dụ, vì không phải tất cả các kiểu Java có thể được chuyển đổi thành JavaScript, đôi khi cần thiết thêm các phương thức bổ sung cho các đối tượng Java để cho chúng có thể được truy cập từ xa dễ dàng hơn Trong kịch bản ví dụ, tôi giải quyết điều này bằng cách thêm... về Ajax, DWR và các công nghệ liên quan Một trong những điểm quan trọng nhất lấy ra từ loạt bài này là cho các ứng dụng Ajax, không có giải pháp một kích cỡ phù hợp cho tất cả Ajax là một lĩnh vực phát triển nhanh với các công nghệ và các kỹ thuật mới đang nổi lên trong suốt thời gian qua Trong ba bài viết của loạt bài này, tôi đã tập trung vào việc bạn bắt đầu sử dụng các công nghệ Java trong tầng Web. .. thấy cách dễ dàng để thực hiện một ứng dụng Ajax có Java ở phía sau khi sử dụng DWR Mặc dù kịch bản ví dụ là một ứng dụng đơn giản và tôi đã có một cách tiếp cận gần như tối thiểu để triển khai thực hiện các trường hợp sử dụng, bạn không nên đánh giá thấp số lượng công việc mà công cụ DWR có thể tiết kiệm cho bạn hơn một cách tiếp cận Ajax được tạo tại chỗ Trong khi ở bài viết trước tôi đi qua tất cả các. .. trình bao bọc (wrapper) để thêm các phương thức DWR cụ thể cho JavaBeans cũ của bạn Điều này có nghĩa là các máy khách Java của các lớp JavaBean sẽ không nhìn thấy những điều sai lầm tăng thêm có liên kết với việc truy cập từ xa và nó cũng sẽ cho phép bạn đưa ra các tên thân thiện hơn cho các phương thức được truy cập từ xa ví dụ getPrice() thay cho getFormattedPrice() Hình 4 hiển thị một lớp RemoteCart... nó cho phép bạn tạo một giao diện Ajax tới các đối tượng miền phía máy chủ của bạn nhanh chóng và đơn giản, không cần phải viết bất kỳ mã servlet nào, mã tuần tự hóa đối tượng hoặc mã XMLHttpRequest phía máy khách Vô cùng đơn giản để triển khai ứng dụng Web của bạn khi sử dụng DWR và các tính năng an ninh của DWR có thể được tích hợp với một hệ thống xác thực dựa trên vai trò J2EE Tuy nhiên DWR không. .. nhưng nếu không thì hoàn toàn thừa Căn cứ vào sự cần thiết cho một API có độ chi tiết thô trên các đối tượng được truy cập từ xa và vấn đề chuyển đổi các kiểu Java nào đó thành JavaScript, bạn có thể thấy cách JavaBeans được truy cập từ xa có thể trở nên bị hỏng với các phương thức chỉ có ích cho một máy khách Ajax Để bắt đầu việc này, bạn có thể sử dụng các lớp của trình bao bọc (wrapper) để thêm các phương... bao bọc Cart cho chức năng truy cập từ xa Cuối cùng, bạn cần phải nhớ rằng các cuộc gọi DWR Ajax là không đồng bộ và không nên dự kiến trả về theo thứ tự mà chúng đã được gửi đi Tôi bỏ qua rào cản nhỏ này trong mã ví dụ, nhưng trong bài viết đầu tiên của loạt bài này, tôi đã giải thích cách đánh dấu thời gian các trả lời như là một việc bảo vệ đơn giản dựa vào dữ liệu đến không theo thứ tự Kết luận... thể trong giỏ hàng này Vì vậy Cart.java có một trường, contents (các nội dung), được khai báo như là Map Việc sử dụng các kiểu phức tạp như là các khóa băm (hash key ) đặt ra vấn đề cho DWR trong JavaScript, các khóa mảng phải là các chữ Kết quả là contents Map có thể không được DWR chuyển đổi như nó có Tuy nhiên, với các mục đích của giao diện người dùng của giỏ mua hàng, tất cả những... thể dễ quên rằng mỗi cuộc gọi mà bạn thực hiện trên các đối tượng được truy cập từ xa tốn kém hơn nhiều so với một cuộc gọi hàm cục bộ DWR thực hiện nhiều công việc về ẩn bộ máy Ajax, nhưng điều quan trọng cần nhớ rằng mạng không trong suốt, có độ trễ liên quan đến việc thực hiện cuộc gọi DWR và ứng dụng của bạn phải được kiến trúc để cho các phương thức được truy cập từ xa có độ chi tiết thô Đối với . Ajax cho các nhà phát triển Java: Ajax với Direct Web Remoting Sự tuần tự hóa dữ liệu không dễ dàng hơn điều này! Philip McCarthy, Nhà Phát triển, SmartStream Technologies. trừu tượng cao hơn. Trong bài viết thứ ba của loạt bài Ajax cho các nhà phát triển Java này, tôi thêm phần giới thiệu của số trước vào các kỹ thuật tuần tự hóa dữ liệu cho Ajax (data serialization. năng Ajax cho các ứng dụng của bạn có thể mang lại nhiều việc khó khăn. Trong bài viết thứ ba của loạt bài Ajax cho các nhà phát triển Java™ này, Philip McCarthy cho bạn thấy cách sử dụng Direct

Ngày đăng: 07/08/2014, 10:22

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan