您的位置: 首页 >> 新闻中心 >> 计算机 >> 软件开发
使用异步Servlet扩展AJAX应用程序
■ 最新课程推荐更多课程>>
学校培训课程开课时间上课地点精英价报名
正辰培训 微软软件测试工程师电话预约西直门教学区¥4704
新 科 海 软件测试工程师就业班电话预约海淀长远天地¥6280
北师大IT 软件工程与测试实战班电话预约北京师范大学¥1800
北师大IT 高级网络工程师就业班电话预约北京师范大学¥13000
金 同 方 网络工程师就业周末班电话预约人大总部¥7000

  作为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应用程序。

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

本新闻共2页,当前在第1页  1  2

  影视动画培训   北大BEC培训官方报名网站   2008美国夏令营启航官方指定报名网站   2008留学第一站!  
  北师大 火星时代
共举影视动画培训之鼎
  北大BEC培训官方报名网站
现在报名独享95折!
  2008年国家职业资格考试
一次过关完全备考手册
  2008留学第一站
留学资讯尽在精英留学站!
 
上一篇:VC++开发的应用技巧三则放送
下一篇:开源以后 Java还能继续创造神话吗?
 相关新闻
·JSP中基于Session的在线用户统计分析·解决JSP开发Web程序中的中文问题
·JSP 2.0下的动态内容缓存分析讲解·软件保护之为应用软件加上时间限制
·如何安装微软IIS5.1安装文件·理解软件保护技术之序列号方式
·QQTalk:跨越空间 问鼎多人语音·Google地图搜索嵌入实景照片看得更真切
·在J2ME手机程序开发中使用颜色·教你如何用Visual Basic编写病毒
·Visual Basic中实现带预览的对话框·理解ASP.NET与客户端缓存之HTTP协议
·Java异常处理的特殊情况·提升JSP页面响应速度的四大秘籍绝招
·IE浏览器中一个值得关注的JS问题·开源以后 Java还能继续创造神话吗?
 
◇ 重点栏目导航
◇ 精英服务承诺
教育顾问:010-51660910
QQ交流:138660910
相关资料
·软件测试新手的修炼之路
·Smarty简体中文参考手册
·Struts中文手册
·Struts快速学习指南
·ultradev动态网页制作教程
·UML工具箱
·《设计模式》中文版
·学友Flash伴侣 1.11
·阿须图像水印(AssureMark)V2.0
·超级语霸
相关试题
·2007年全国CPA考试试卷及答案解析之《会
·2007年CPA试卷及答案解析之《财务成本管
·2008年注会考前模拟试题之《财务成本管理
·2007年全国CPA《税法》考试试卷及答案解
·2008年中级会计职称《经济法》试题及答案
·2008年注册会计师考前模拟试题参考答案之
·2008年注册会计师考前模拟试题之《会计》
·2008年注册会计师考前模拟试题之《税法》
·2008年高校招生全国统考理数试题(四川延
·2008年全国高考物理科试题参考答案(上海
相关热贴
·如何改QQ IP地址!
·恰当选择软件测试自动化方案
·ADO.NET学习总结
·.net操纵xml文件类(c#)
·Log4net教程
·VPN技术详解
·高手必读 网络端口安全防护技巧放送
·访问XP共享出现的问题解决办法
·Web2.0时代,RSS你会用了吗?(技术实现总
·.NET下正则表达式应用的四个示例