Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Dùng Dojo, sự hỗ trợ Comet của Tomcat và Direct Web Remoting (DWR) để sử dụng Ajax cho ứng dụng của bạn Manu T. George ([email protected]) Kỹ sư phần mềm IBM 15 01 2010 Vamsavardhana Reddy Chillakuru ([email protected]) Kỹ sư tư vấn phần mềm EMC Bài viết này tóm tắt danh sách một vài chức năng và khung làm việc Ajax được bao gồm trong phiên bản 2.1 của Community Edition® và cùng bạn phát triển một ứng dụng mẫu Web 2.0 mà dùng các khung làm việc đó để phát triển dễ dàng hơn. Giới thiệu Ajax (Asynchronous JavaScript and XML) là một thuật ngữ được tạo ra để chỉ một tập công nghệ cho phép tạo các ứng dụng Internet phong phú. Dùng các công nghệ này bạn có thể tạo các ứng dụng Web có khả năng đáp ứng tốt và có các giao diện người dùng "giàu có" tương tự các ứng dụng desktop. Chúng cho phép các ứng dụng Web của bạn lấy dữ liệu một cách không đồng bộ ngầm dưới nền mà không ảnh hưởng tới trang được hiển thị, chẳng hạn như yêu cầu dữ liệu không phải toàn bộ trang. Bạn dùng XmlHttpRequest hoặc đối tượng tương đương mà các trình duyệt hiện đại cung cấp để thực hiện giao tiếp không đồng bộ ngầm phía dưới như thế này. IBM WebSphere Application Server Community Phiên bản 2.1.x (từ đây về sau được gọi là Phiên bản Community (Cộng đồng)) được đóng gói cùng với một số các khung làm việc (framework) thông dụng để phát triển và chạy (hosting) các ứng dụng Ajax. Trong bài viết này, chúng tôi nghiên cứu làm cách nào để cấu hình và dùng ba trong số các khung làm việc đó, tên chúng là: • The Dojo Toolkit • Direct Web Remoting (DWR) • Tomcat Comet Support © Copyright IBM Corporation 2010 Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Nhẫn hiệu đăng ký Trang 1 của 14 developerWorks® ibm.com/developerWorks/vn/ Chúng tôi cũng phát triển một ứng dụng Web đơn giản dùng các công nghệ đó để cung cấp một trải nghiệm người dùng tốt hơn. Để đi cùng bài viết, bạn cần WebSphere Application Server Community Phiên bản 2.1.x. Bộ công cụ Dojo (Dojo Toolkit) Dojo là một bộ công cụ DHTML mã nguồn mở viết bằng JavaScript. Dojo giải quyết một vài vấn đề liên quan đến dùng JavaScript, bao gồm xử lý các hành vi cụ thể của trình duyệt. Các hành vi này đã được trừu tượng hóa với người dùng thông qua bộ công cụ Dojo. Nó cũng cung cấp một tập các widget (ứng dụng nhỏ) có thể cấu hình mà có thể dùng để phát triển nhanh các trang Web động và độc lập với trình duyệt. Bộ công cụ Dojo bao gồm một tập các API (Giao diện lập trình ứng dụng) JavaScript, và được nằm trong WebSphere Application Server Community phiên bản v 2.1. Nó cũng có thể được truy cập thông qua ngữ cảnh gốc /dojo. Dojo cũng cung cấp các API để sinh các lời gọi XMLHttpRequest không đồng bộ nhằm lấy dữ liệu từ máy chủ mà không cần làm tươi lại trang. Direct Web Remoting (DWR) DWR cho phép một nhà phát triển phơi bày các đối tượng Java™ phía máy chủ cho máy khách thông qua các proxy JavaScript. Nó tạo các proxy cho tất cả các đối tượng Java™ mà có thể được gọi sau đó từ các máy khách. Để hồi đáp, DWR gọi các phương thức Java tương ứng ở máy chủ và trả lại đối tượng gọi đoạn script ở định dạng JSON (JavaScript Object Notation). Bạn có thể cấu hình DWR gọi máy chủ một cách đồng bộ hoặc không đồng bộ ngầm phía dưới. Vì thế, nó tránh việc làm tươi lại trang web như với mô hình yêu cầu - hồi đáp HTTP thông thường. DWR cũng cung cấp Reverse Ajax, là cơ chế để gửi thông tin không đồng bộ từ máy chủ tới trình duyệt. Nó cho phép máy chủ công bố với các máy khách khoảng thời gian định kỳ, theo các cách sau đây: • Polling: Khách tiếp tục pool máy chủ theo khoảng thời gian thông thường. • Comet (Quét): Khi khách đưa một yêu cầu, máy chủ giữ một handle (quai) để hồi đáp những gì nó ghi lại trong trường hợp khách không cần pool. • Piggy back: Hồi đáp mang tính thô và được gửi lại cùng lời hồi đáp tới yêu cầu tiếp theo mà máy khách đưa ra. Hỗ trợ Tomcat Comet Comet là một thuật ngữ được đưa ra bởi Alex Russel của Dojo Foundation để mô tả một cơ chế đẩy vào máy chủ hướng sự kiện thông qua giao thức HTTP. Trong giao tiếp HTTP thông thường, máy khách thường xuyên thiết lập truyền dữ liệu bằng cách mở kết nối tới máy chủ và gửi một yêu cầu. Máy chủ xử lý yêu cầu này, gửi lại một lời phản hồi trên cùng kết nối đó, và sau đó đóng kết nối. Vì thế kết nối sống trong thời gian tương đối ngắn. Trong Comet, máy chủ giữ kết nối đó mở và tiếp tục ghi dữ liệu bất cứ khi nào sự kiện liên quan xảy ra. Tomcat cung cấp sự hỗ trợ này thông qua các kết nối NIO và APR. Kết nối BIO không cung cấp hỗ trợ Comet. Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 2 của 14 ibm.com/developerWorks/vn/ developerWorks® Tạo một trình kết nối NIO (NIO connector) Mặc định, Phiên bản Community không có các trình kết nối NIO được cài đặt trước. Chúng ta phải tạo và bắt đầu một trình kết nối connector từ console (chương trình dạng cửa sổ dòng lệnh) quản trị trước khi chạy các ứng dụng dùng giao thức Comet. Trước hết, chúng ta xóa trình kết nối BIO đang chạy trên cổng 8080, và sau đó tạo một trình kết nối NIO mới chạy trên cùng cổng đó. Làm theo các bước sau để tạo trình kết nối NIO: 1. Bắt đầu phiên bản Community, và mở https://localhost:8443/console/ trong trình duyệt của bạn. 2. Nhập system vào mục user name và manager cho phần password. Nhấn vào Login, sẽ hiển thị trang trong bảng điều khiển quản trị. 3. Ở phần ô điều hướng bên trái, nhấn vào Web Server liên kết đến trang Web Server Manager, như là Hình 1 chỉ ra sau đây: Hình 1. Web Server Manager 4. Xóa trình kết nối tên là TomcatWebConnector. 5. Ở phần Add New, nhấn vào liên kết Trình kết nối Tomcat NIO, sẽ hiển thị màn hình như Hình 2. Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 3 của 14 developerWorks® ibm.com/developerWorks/vn/ Hình 2. Thêm vào một trình kết nối Tomcat NIO 6. Điền vào trường uniqueName giá trị TomcatNIOConnector và nhấn vào Save, sẽ tạo và bắt đầu trình kết nối NIO. Cửa sổ nhìn giống như Hình 3. Hình 3. TomcatNIOConnector được thêm vào các trình nghe mạng Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 4 của 14 ibm.com/developerWorks/vn/ developerWorks® Phát triển Ứng dụng Web Bây giờ chúng ta thiết lập mọi thứ cho phát triển ứng dụng Web. Đó sẽ là một ứng dụng báo thông tin chứng khoán cập nhập 5 giây một lần các giá mới nhất. Chúng ta sẽ dùng tính năng Reverse Ajax của DWR thông qua triển khai Comet được cung cấp bởi Tomcat. Để hiển thị giá, chúng ta sẽ dùng một widget Dojo từ bộ công cụ Dojo, đó là widget dojox.Grid. Chúng ta cũng sẽ viết một servlet dùng sự hỗ trợ Comet trong Tomcat để in ra thông tin chứng khoán. Viết Servle Comet Apache Tomcat cung cấp giao diện org.apache.catalina.CometProcessor , là tất cả các servlet mà bạn có thể triển khai để dùng sự hỗ trợ Comet. Giao diện này định nghĩa một phương thức đơn, tên là public void event (CometEvent event) để triển khai trong servlet của chúng ta. Ví dụ 1 hiển thị hai phương thức chính của servlet này: Ví dụ 1: Servlet Comet public void init() throws ServletException { super.init(); Runnable r = new Runnable() { public void run() { while (!stop) { synchronized (openConnections){ List<Stock> stocks = new StockService().getStocks(); for (HttpServletResponse response : openConnections) { try { PrintWriter pw = response.getWriter(); for (Stock stock : stocks) { pw.println(stock.getSymbol() + ":" + stock.getPrice()); } pw.flush(); } catch (IOException e) { e.printStackTrace(System.out); } } } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(System.out); } } } }; Thread stockThread = new Thread(r); stockThread.setDaemon(true); stockThread.start(); } public void event(CometEvent event) throws IOException, ServletException { HttpServletRequest request = event.getHttpServletRequest(); HttpServletResponse response = event.getHttpServletResponse(); if (event.getEventType() == CometEvent.EventType.BEGIN) { synchronized (openConnections){ openConnections.add(response); } } else if (event.getEventType() == CometEvent.EventType.ERROR) { synchronized (openConnections){ openConnections.remove(response); } } else if (event.getEventType() == CometEvent.EventType.END) { Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 5 của 14 developerWorks® ibm.com/developerWorks/vn/ synchronized (openConnections){ openConnections.remove(response); } } else if (event.getEventType() == CometEvent.EventType.READ) { } } Trong phương thức init chúng ta thiết lập một luồng (thread) lấy giá chứng khoán và viết nó vào tất cả các trình khách đang lắng nghe, là các đối tượng phản hồi trong danh sách openConnections. Phương thức sự kiện được kích hoạt khi bất kỳ sự kiện nào trong số BEGIN, ERROR, END, READ xảy ra. Chúng ta lấy phản hồi từ đối tượng org.apache.catalina.CometEvent mà được truyền vào như là một tham số. Đối với sự kiện BEGIN ta thêm phản hồi vào sưu tập (collection). Đối với sự kiện ERROR và END, chúng ta xóa phản hồi khỏi danh sách. Sự kiện BEGIN biểu diễn sự bắt đầu xử lý kết nối đó, vì thế chúng ta thêm phản hồi này vào danh sách các phản hồi. Các sự kiện END và ERROR biểu diễn sự kết thúc kết nối hoặc xảy ra một lỗi. Để biết thêm thông tin những sự kiện này có nghĩa là gì, xem tài liệu Apache Tomcat. Cấu hình DWR Ứng dụng có một tập mã chứng khoán cứng được hiển thị. Các giá trị chứng khoán được cập nhật một cách ngẫu nhiên thông qua lớp com.dev.trade.service.StockQuoteGenerator. Ví dụ 2 hiển thị phần thích đáng của mã nguồn lớp này. Ví dụ 2: Lớp sinh ra các giá chứng khoán package com.dev.trade.service; import import import import import java.util.HashSet; java.util.List; java.util.Set; java.util.Collections; com.dev.trade.bo.Stock; public class StockQuoteGenerator { private StockService ss = new StockService(); private List<Stock> stocks = null; private static StockQuoteGenerator generator = new StockQuoteGenerator(); private Set<QuoteListener> listeners = Collections.synchronizedSet(new HashSet<QuoteListener> ()); private volatile boolean contextDestroyed = false; private StockQuoteGenerator() { Runnable r = new Runnable() { public void run() { try { while (!contextDestroyed) { update(generateStockQuotes()); Thread.sleep(5000); } }catch (Exception e) { e.printStackTrace(System.out); } } }; Thread t = new Thread(r); t.setDaemon(true); t.start(); } Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 6 của 14 ibm.com/developerWorks/vn/ developerWorks® public static StockQuoteGenerator getInstance() { return generator; } public void setContextDestroyed(boolean cd) { this.contextDestroyed = cd; } public void addListener(QuoteListener listener) { listeners.add(listener); } private void update(List<Stock> stocks) { for (QuoteListener listener : listeners) { listener.updateStockQuotes(stocks); } } private List<Stock> generateStockQuotes() { stocks = ss.getStocks(); return stocks; } } Trong phương thức khởi tạo của lớp đơn thể - singleton (chỉ cho phép tạo 1 thể hiện) StockQuoteGenerator, chúng ta bắt đầu một luồng mới và gán đối tượng Runable (Có thể chạy) cho luồng đó. Vì thế phương thức run của đối tượng này tiếp tục thực thi cho đến khi biến contextDestroyed được thiết lập thành true. Biến này được thiết lập thành true chỉ khi ngữ cảnh ứng dụng sắp bị hủy. Để làm như vậy, chúng ta sẽ đăng ký một trình nghe ngữ cảnh trong web.xml tên là com.dev.trade.listener.ServletContextListener. Phương thức generateStockQuotes gọi phương thức getStocks của StockService để lấy giá chứng khoán được sinh ra. Bạn dùng phương thức addListener để thêm các trình nghe. Các trình nghe này triển khai giao diện (interface) com.dev.trade.service.QuoteListener, và vì thế cài đặt phương thức updateStockQuotes. Các trình nghe đều là các thể hiện của com.dev.trade.service.StockQuoteListenerImpl. Lớp này trong các hàm tạo của nó thiết lập một thể hiện của lớp org.directwebremoting.WebContext được cung cấp bởi DWR, và sau đó tự nó đăng ký với danh sách các trình nghe của StockQuoteGenerator. Ví dụ 3 thể hiện phương thức updateStockQuotes của lớp này. Ví dụ 3: Mẫ để đẩy dữ liệu đến các trình khách khác public void updateStockQuotes(List<Stock> stocks) { ScriptBuffer script = new ScriptBuffer(); script.appendScript("updateStocks(").appendData(stocks).appendScript( ");"); Collection<ScriptSession> sessions = wctx.getAllScriptSessions(); for (ScriptSession session : sessions) { if(!session.isInvalidated()){ session.addScript(script); } else { wctx.getAllScriptSessions().remove(session); } } } Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 7 của 14 developerWorks® ibm.com/developerWorks/vn/ Phương thức này sinh ra một hàm JavaScript gọi tất cả các trình khách đang mở. Nó gọi hàm updateStocks và truyền giá trị cổ phiếu. Phương thức JavaScript này thực tế cập nhật mô hình widget lưới Dojo mà chúng ta sẽ hiển thị và sau đó gọi phương thức cập nhật của nó vì thế lưới sẽ hiển thị với dữ liệu mới. DWR tạo các phiên script cho mỗi trang báo chứng khoán đang mở. Chú ý rằng đối với công việc này hàm khởi tạo của lớp StockQuoteListenerImpl cần được gọi bởi mã DWR trong luồng đang thực thi. Vì thế chúng ta cần cấu hình DWR để thiết lập đối tượng của StockQuoteListenerImpl. Cho cấu hình này, chúng ta tạo một tệp dwr.xml mà chúng ta đặt trong thư mục WEB-INF của ứng dụng. Ví dụ 4 hiển thị tệp này. Ví dụ 4: dwr.xml <dwr> <allow> <create creator="new" javascript="Ticker" scope="application"> <param name="class" value="com.dev.trade.service.StockQuoteListenerImpl"/> </create> <create creator="new" javascript="StockService" scope="application"> <param name="class" value="com.dev.trade.service.StockService"/> </create> <convert converter="bean" match="com.dev.trade.bo.Stock"/> </allow> </dwr> Chú ý rằng StockQuoteListenerImpl đã được phơi bày ra trong dwr.xml thông qua một trình tạo. Chúng ta thiết lập phạm vi của đối tượng tới application, chẳng hạn như chỉ một thể hiện cần cho mỗi ứng dụng. Lớp khác chúng ta phơi bày qua JavaScript là com.dev.trade.service.StockService, là lớp cung cấp cho chúng ta một phương thức getStocks để lấy danh sách các cổ phiếu. Chúng ta cũng cần thêm DWRServlet vào web.xml ứng dụng của chúng ta vì thế DWR được thiết lập và phơi bày các proxy của các đối tượng được cấu hình ở trên cho JavaScript. Ví dụ 5 hiển thị tệp web.xml. Hình 5: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>brokerage</display-name> <listener> <listener-class> com.dev.trade.listener.DwrContextListener </listener-class> </listener> <servlet> <display-name>DWR Servlet</display-name> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>initApplicationScopeCreatorsAtStartup</param-name> Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 8 của 14 ibm.com/developerWorks/vn/ developerWorks® <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/stocks.html</welcome-file> </welcome-file-list> </web-app> Thuộc tính activeReverseAjaxEnabled được thiết lập thành true vì thế DWR dùng Comet để kích hoạt Reverse Ajax. Nếu nó được thiết lập thành false, DWR sẽ dùng tùy chọn piggy-back. InitApplicationScopeCreatorsAtStartup các đối tượng khi bắt đầu DWR. dùng cho thiết lập tất cả các ứng dụng giới hạn phạm vi Bây giờ, ở phía khách, chúng ta cần nhập hai tệp script: động cơ (engine) phía khách và proxy JavaScript mà DWR tạo đối tượng được phơi ra com.dev.trade.service.StockService. Ví dụ 6 hiển thị mã cho việc nhập này. Ví dụ 6: Truy cập vào khách <script type="text/javascript" src="dwr/engine.js"></script> <script type='text/javascript' src='/brokerage/dwr/interface/StockService.js'></script> Chúng ta cũng cần cấu hình động cơ phía khách DWR để dùng Reverse Ajax hoạt động, vì thế chúng ta cần gọi dwr.engine.setActiveReverseAjax(true). Chúng ta có thể gọi phương thức getStocks của StockService để chuyển định cư (populate) widget lưới Dojo mà sẽ được hiển thị, dùng StockService.getStocks({callback:getModel,async:false}). Tham số getModel tham chiếu đến một phương thức JavaScript sẽ được gọi mà kết quả của lời gọi này được truyền như là một tham số phương thức. Phương thức được đưa ra trong ví dụ 7 trả về mô hình cho lưới dojo sẽ được hiển thị. Ví dụ 7: Web Remoting (gọi web từ xa) function getModel(stocks) { var data = new Array(); for ( var i = 0; i < stocks.length; i++) { var subData = new Array(); subData[0] = stocks[i].symbol; subData[1] = stocks[i].companyName subData[2] = stocks[i].price subData[3] = stocks[i].eps data[i] = subData; } updatedModel = new dojox.grid.data.Table(null, data); return updatedModel; } Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 9 của 14 developerWorks® ibm.com/developerWorks/vn/ Cấu hình Dojo Community Edition được đóng gói cùng thư viện JavaScript Dojo. Nó dùng Dojo cho một vài console portlet quản trị. Dojo được đóng gói như là một ứng dụng Web sẵn sàng để dùng ở ngữ cảnh gốc /dojo. Để dùng Dojo ở trang khách HTML, chúng ta cần nhập script (kịch bản) dojo.js, dùng các script trong ví dụ 8. Ví dụ 8: Nhập dojo.js <script type="text/javascript" src="/dojo/dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script> Khi các script Dojo được nhập vào, chúng ta có thể cải thiện các thứ phụ thuộc còn lại thông qua các lời gọi dojo.require. Widget (ứng dụng nhỏ) dojox.Grid mà chúng ta sẽ tạo ra cần một mô hình và một cấu trúc. Mô hình biểu diễn dữ liệu được hiển thị, và cấu trúc biểu diễn chúng ta sẽ hiển thị nó như thế nào. Mô hình thực thế là một mảng của các mảng. Ví dụ 9 biểu diễn định nghĩa cấu trúc: Ví dụ 9: Định nghĩa cấu trúc var view1 = { noscroll :false, cells : [ [ { name :'Symbol', width :'auto' }, { name :'Company Name', width :'auto' }, { name :'Price', width :'auto' }, { name :'Earnings Per Share', width :'auto' } ] ] }; var gridLayout = [ { type :'dojox.GridRowView', width :'20px' }, view1 ]; <div class="tundra" id="stock_grid" dojoType="dojox.Grid" model="updatedModel" structure="gridLayout" elasticView="1" defaultHeight="37em"></div> Trong ví dụ này, chúng ta thấy rằng div với id="stock_grid" đóng gói lưới (grid) thực tế. Cấu trúc được định nghĩa bởi đối tượng gridLayout, là một mảng chứa view1. Biến view1 cũng là một mảng, chứa các thuộc tính cells cung cấp các chi tiết về tất cả các cột nên hiển thị như thế nào trong lưới. Xây dựng và triển khai Ứng dụng Web (Web Application) Để xây dựng ứng dụng bạn cần có Apache Maven2. Cài đặt Maven2 và theo các bước sau để xây dựng ứng dụng: Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 10 của 14 ibm.com/developerWorks/vn/ developerWorks® 1. Giải nén tệp ticker.zip, sẽ tạo một thư mục được gọi là ticker. 2. Mở command shell (dòng lệnh) và thay đổi thư mục hiện tại thành ticker. 3. Chạy mvn install. Hành động này sẽ xây dựng ứng dụng và đặt tệp WAR đầu ra vào thư mục target directory nằm trong ticker. Tên của tệp WAR là ticker.war. 4. Mở console (chương trình nhập dòng lệnh) Community Edition trong trình duyệt của bạn và đi đến portlet Deploy New. 5. Trong ô chữ (text box) Archive nhập vào đường dẫn sinh ra ticker.war và nhấn vào Install. Kiểm thử Ứng Dụng Web 1. Mở http://localhost:8080/ticker trong trình duyệt Web của bạn để hiển thị báo giá chứng khoán, như được chỉ ra trong Hình 4. Hình 4. Báo giá chứng khoán chạy trong trình duyệt 2. Mở http://localhost:8080/ticker/comet trong trình duyệt Web của bạn để xem đầu ra của servlet Comet, như Hình 5. Hình 5. Đầu ra servlet Comet Kết luận Chúng ta đã tạo ra và cấu hình trình kết nối NIO của thể hiện Tomcat được nhúng trong Community Edition thông qua console quản trị. Chúng ta cũng đã phát triển một ứng dụng Web Java EE dùng chức năng DWR's Reverse Ajax để đẩy dữ liệu từ máy chủ tới trình duyệt thông qua phần xây dựng sẵn hỗ trợ trong trình kết nối NIO. Cuối cùng, chúng ta xem xét làm thế nào để triển khai giao diện CometProcessor của Tomcat để viết một servlet phơi bày (expose) các chức năng Comet của nó. Lời cảm ơn Xin gửi lời cảm ơn tới Phani Madgula và Ashish Jain vì đã xem trước bài viết này. Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 11 của 14 developerWorks® ibm.com/developerWorks/vn/ Các tải về Mô tả Tên Kích thước Sample source code ticker.zip 8KB Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 12 của 14 ibm.com/developerWorks/vn/ developerWorks® Tài nguyên Học tập • • • • • • • • • • • • • • • • developerWorks Ajax Resource Center Direct Web Remoting (DWR) The Dojo Toolkit JavaScript Object Notation (JSON) What’s new in WebSphere Application Server Community Edition V2.1 Developing JPA Applications with WebSphere Application Server Community Edition WebSphere Application Server Community Edition support site WebSphere Application Server Community Edition documentation WebSphere Application Server Community Edition samples Apache Geronimo site Develop applications on all the Java EE5 APIs Get to know Java EE 5 WebSphere Application Server Community Edition Technical Support offerings WebSphere Application Server Community Edition resources developerWorks Open Source zone developerWorks Web development zone Lấy sản phẩm và công nghệ • Download Community Edition • Community Edition Eclipse plug-in update • Apache Tomcat Thảo luận • developerWorks WebSphere Application Server Community Edition and Apache Geronimo forum • developerWorks Open Source forum Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 13 của 14 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về các tác giả Manu T. George Manu T. George là một Kỹ sư Phần mềm ở phòng thí nghiệm tại Bangalore, IBM Ấn Độ. Ông là người quản trị mã của các dự án Apache Geronimo và Apache OpenEJB, và là một phần của đội hỗ trợ mức 3 IBM WebSphere Application Server Community Edition. Ông ta đã nhận bằng cử nhân Công nghệ về lĩnh vực Điện tử ứng dụng của trường Engineering Trivandrum vào năm 2001. Vamsavardhana Reddy Chillakuru Vamsavardhana Reddy Chillakuru, hay còn được biết đến với tên Vamsi, là một Kỹ sư Tư vấn Phần mềm ở Phòng thí nghiệm phần mềm IBM Ấn Độ tại Bangalore, Ấn Độ. Ông ta là người quản trị mã của các dự án Apache Geronimo và Apache Tuscany, một thành viên của Ủy ban quản lý dự án Apache Geronimo, và là một thành viên của đội hỗ trợ mức 3 IBM WebSphere Application Server Community Edition. Ông đã nhận bằng cử nhân và thạc sỹ thống kê của học việc thống kê Ấn Độ, Kolkata, tại Ấn Độ lần lượt năm 1994 và 1996 © Copyright IBM Corporation 2010 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition Trang 14 của 14