PDF:

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