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

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.

Manu T. George, Kỹ sư phần mềm, IBM

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.


Cấp độ đóng góp cho developerWorks của
        tác giả

Vamsavardhana Reddy Chillakuru, Kỹ sư tư vấn phần mềm, EMC

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


Cấp độ đóng góp cho developerWorks của
        tác giả

15 01 2010

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

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.


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
    Screen shot of the Web Server Manager, showing the list of network listeners
  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.
    Hình 2. Thêm vào một trình kết nối Tomcat NIO
    Screen shot of window for adding a new NIO connector
  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
    Screen shot showing the new NIO connector in the list of network listeners

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) {
                   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 ERROREND, 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 ENDERROR 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 java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Collections;
import 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();
            }

	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ươ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>
    <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 dùng cho thiết lập tất cả các ứng dụng giới hạn phạm vi các đối tượng khi bắt đầu DWR.

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;
	}

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:

  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
    Screen shot showing the running application
  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
    Screen shot showing the output of the Comet servlet in the browser

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.


Tải về

Mô tảTênKích thước
Sample source codeticker.zip8KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=462396
ArticleTitle=Phát triển các ứng dụng Internet phong phú cho WebSphere Application Server Community Edition
publish-date=01152010