动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.利用JMS和JCA实现应用之间的解偶.
.Robocode 高手的秘诀:因数避墙法.
.Java核心代码例程之:JavaMail -.
.Java违例控制.
.让JavaME程序真正Run Anywhere.
.一个绝对害了不少人的Java技术问.
.构建更好的异常处理框架.
.DeleteFolder 方法.
.如何设计用JSF和MyFaces上传文件.
.开发框架hibernate3.0开发实例.
.Java 的可移植性.
.Java Tip: 实现Command模式.
.MVC 构架学习之渐行渐进(四).
.JBuilder改旗易帜 Java IDE市场重.
.J2ME MIDP开发综合实例.
.除岁迎新 Java 2005回顾&2006展望.
.Hibernate中的Middlegen入门指南.
.Enterprise bean的开发(1).
.Java学习之了解Java的运行环境.
.将Java程序变成Windows系统服务.

高级:使用异步Servlet扩展AJAX应用程序

发表日期:2008-3-4 |


作为Web应用程序模型的AJAX的出现使服务器端的面貌发生了巨大的变化。用户对着Web页面填写表单并单击提交按钮转到下一个链接的典型Web使用模式现在正在转变为更先进的客户端JavaScript以及功能更丰富的用户界面,只要对表单进行操作,比如单击一个复选框、按下一个键或将鼠标移到一个选项卡上,该用户界面就会不断地与服务器交互。

考虑一下从客户端传输到服务器的数据量有多大。从可用性的角度来看,用户在一个薄客户端浏览器上获得了富用户界面,无需安装任何东西。但是,当在服务器端扩展这些应用程序时就要付出代价了。AJAX应用程序的典型容量规划数可能会是标准Web应用程序的3到4倍。

有人可能会问:这对WebLogic Server有何影响?每个发送给WebLogic的HTTP请求都要使用一个执行线程。根据AJAX编程的性质以及许多短期的请求会以轮询的形式不断发送的情况,该行为模式可能造成大量客户端请求不断冲击服务器的局面。多年来,WebLogic都将这一问题考虑在内,并构建了一个相当棒的特性,即FutureResponseServlet。该范型构建于异步servlet理念的基础之上。从版本6.1开始,该功能就允许开发人员提供真正异步的来自服务器的通知,而无需对事件进行客户端轮训并在服务器端使用执行线程。在9.x之前,BEA还不急于公开该类。

如何在现实中利用该类呢?我们来看一个例子。假定业务需求是要构建一个基于Web的应用程序,该应用程序以近乎实时的方式向服务器发送数据而无需刷新浏览器。这样的应用程序可以向服务器提交一个需要花很长时间处理的请求,而仍然能够接收到关于其状态的异步事件并监听事件。从技术角度来看,这有许多实现方法。其中一种方法就是使用一个与Java Servlet通信的Java Applet来获得异步信息。这是一种不错的方法,但是对于用户来说有些不太方便,因为他们必须下载一个JVM,还要下载一个applet到浏览器。此外,还必须维护一个从客户端到服务器的持久性套接字连接,以便接收异步消息。设想一下,如果有1000个用户使用该applet,那么就有1000个执行线程几乎是在空等着发送事件通知到客户端。当然了,还有其它方法,比如从applet或AJAX应用程序构建轮询机制来定期检查新数据。而如果不经常接收到数据,那么轮询就显得无用了,而且还浪费了服务器资源,占用了执行线程。反之,服务器可以定期轮询,将事件传播回客户端,并维护套接字线程,而无需使用持久性执行线程。这非常类似于Java NIO的运行方式。理想情况下,我们都希望构建一个从服务器“异步”接收事件通知而无需在服务器端使用持久性执行线程的应用程序,不管它是一个applet还是一个基于AJAX的薄Web应用程序。

此问题的一种解决方案是创建一个扩展FutureResponseServlet类的servlet。浏览器建立了到FutureResponseServlet类的单一连接,并在另一个线程中将它自身注册为一个监听程序。只要在服务器端接收到一个事件,线程就向客户端通知该事件。服务器与客户端保持异步,无需使用持久性执行线程。该模型可扩展用于多个并发用户的情况。

本文并不打算介绍如何构建AJAX应用程序。这方面的文章已经有很多了。本文的重点在于讨论表示层(比如AJAX、applet或者任何前端应用程序)的异步处理的重要性。清单1展示了一个例子。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Stack; 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; 
import weblogic.servlet.FutureResponseServlet;
import weblogic.servlet.FutureServletResponse; 
// An AsynchronousServlet that handles HTTP requests from a "separate" thread and
// not the execute thread used to invoke this servlet.
public class AsynchronousServerResponseServlet extends FutureResponseServlet { 
 
 private final Notifier notifier;
 
 public AsynchronousServerResponseServlet() {  
  this.notifier = new Notifier();  
  this.notifier.start(); 
 }  
 
 public void service(HttpServletRequest request, FutureServletResponse response) throws IOException,ServletException {   
  // push this client's request to a buffer and return immediately.  
  // asynchronous processing occurs in the run method of the Notifier Thread  
  notifier.poll(request, response); 
 }  
 
 class Notifier extends Thread {   
  private static Stack clients = new Stack();   
  void poll (HttpServletRequest request, FutureServletResponse response) {   
   clients.push(new Client(request, response));  
  }   
 
 public void run() {   
  while (!clients.empty()) {    
   Client client = null;    
   try{     
    client = (Client) clients.pop();     
    PrintWriter pw = client.response.getWriter();     
    for(int j = 0; j < 10; j++) {      
     pw.println("Time is:" + new Date() + "");      
     pw.flush();
    }     
    pw.close();    
   }
   catch(Throwable t) {     
    t.printStackTrace();    
   }
   finally {     
    try {     
     client.response.send();      
    }
    catch(IOException ioe) {     
     ioe.printStackTrace();     
    }    
   }    
  }  
 } 

// inner class that holds o-n to the clients http request and response 
class Client {  
 private HttpServletRequest request;  
 private FutureServletResponse response;   
 private Client(HttpServletRequest request, FutureServletResponse response) {   
  this.request = request;   
  this.response = response;  
 } 
}
 


可以看出,该例子非常简单。AsynchronousServerResponseServlet类扩展了FutureResponseServlet,并重写了service方法。只使用一个线程(即Notifier类)来处理所有的客户端连接响应。对于每个HTTP请求,servlet向Notifier线程注册套接字连接,然后返回。异步事件被交付给客户端,而持久性套接字连接被维持。

单个线程可管理多个客户端连接!run()方法可用于根据某种消息选择条件回调事件到客户端。该例子只执行了一个服务器端的push操作,有些过分简单了。线程池可被用于某些类型的事件处理。

总而言之,在处理长期运行的任务时,FutureResponseServlet是一个好特性,它允许开发人员提高性能,在独立的线程中处理响应,并将开销降至最低。在构建异步应用程序时,该方法支持可伸缩性

上一篇:J2SE综合-关于字符串的一些处理技巧 人气:646
下一篇:Java入门-讨论String中三种加法的区别 人气:520
浏览全部Servlet扩展的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-8 OpenPNE中文 v2.12.3 bulid 0810
2008-10-8 ADN视频收藏专家 v3.5.1008 标准
2008-10-8 捌度出品之Google近日收录查询系
2008-10-8 捌度出品之Google近日收录查询系
2008-10-8 94xhcms v1.1 bulid 081006 beta
2008-10-8 天空网络电影系统SKYUC v2.5.9 简
2008-10-8 60度CMS v1.0 Build 081007
2008-10-8 SiteDynamic企业网站管理系统 v1
2008-10-8 FeitecCMS 40T免费资源网整站源码
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成