`

使用异步Servlet扩展AJAX应用程序

    博客分类:
  • Java
阅读更多
作为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是一个好特性,它允许开发人员提高性能,在独立的线程中处理响应,并将开销降至最低。在构建异步应用程序时,该方法支持可伸缩性
分享到:
评论

相关推荐

    基于jsp+servlet+Ajax异步登陆模拟web项目

    Ajax使用XMLHttpRequest对象来实现这个功能,它可以在后台与服务器进行通信,用户感知不到页面刷新,提升了交互体验。 在文件名称列表中,我们看到"TestAjax",这可能是一个包含所有Ajax测试代码的文件或者目录。在...

    java+servlet+ajax程序

    【Java + Servlet + Ajax 程序详解】 Java、Servlet 和 Ajax 是构建动态网站的关键技术,它们共同为用户提供了交互性和实时更新的能力。本指南将深入解析这些技术,并结合实际应用,帮助您理解和掌握如何利用它们来...

    JSP+Servlet+AJAX的dao设计模式

    **JSP+Servlet+AJAX DAO设计模式详解** 在Web开发中,DAO(Data Access Object)...通过分析和学习这些代码,你可以更好地理解JSP、Servlet、AJAX和DAO设计模式如何协同工作,为Web应用程序提供高效的数据交互功能。

    使用jsp+servlet+ajax技术

    通过Servlet,开发者可以实现更复杂的Web应用程序,包括会话管理、安全性控制等。 3. **AJAX**:AJAX不是一种单一的技术,而是一种使用现有Web技术(JavaScript、XML、HTML、CSS等)创建异步Web应用的方法。它允许...

    html+Servlet+ajax实现登录修改

    在IT领域,构建Web应用程序是常见的任务之一,而"html+Servlet+ajax实现登录修改"是一种常见的技术组合,用于创建动态、交互式的用户界面。在这个项目中,我们使用HTML作为前端展示层,Servlet作为服务器端处理逻辑...

    Servlet图片批量上传ajax异步上传

    在IT行业中,Web开发是不可或缺的一部分,而Servlet、图片批量上传和Ajax异步技术则是构建高效、用户友好的Web应用的关键技术。以下是对这些知识点的详细说明: **Servlet上传** Servlet是Java EE平台中用于扩展...

    使用JSP/Servlet/Ajax技术开发新闻发布系统1

    在本课程中,我们将深入探讨如何使用JSP(JavaServer Pages)、Servlet和Ajax技术来构建一个新闻发布系统。这个系统能够实现实时的数据交互,提供动态更新的新闻展示,提升用户体验。以下是这些关键技术的详细说明:...

    jsp+servlet+Ajax 购物车

    2. 使用Ajax发送异步请求到Servlet,携带商品ID和数量信息。 3. Servlet接收到请求后,验证参数合法性,查询数据库中的商品信息,更新购物车数据。 4. 如果购物车数据有变化,Servlet将更新后的购物车内容返回给Ajax...

    Servlet+ajax+CURD实现增删改查功能程序

    Servlet、Ajax 和 JSON 技术在 Web 开发中扮演着重要的角色,特别是在构建动态、交互性强的Web应用程序时。此“Servlet+ajax+CURD实现增删改查功能程序”是一个典型的示例,展示了如何利用这些技术来实现数据的CRUD...

    使用JSP/Servlet/Ajax技术开发新闻发布系统

    总结,"使用JSP/Servlet/Ajax技术开发新闻发布系统"涉及到的技术栈广泛,包括前后端交互、数据库操作、MVC设计模式等多个方面,开发者需要掌握这些技能才能成功构建出高效、用户体验良好的新闻发布平台。

    Servlet及Ajax数据交互

    Servlet运行在服务器端,扩展了服务器的功能,使得我们能够构建动态、交互式的Web应用。在本示例中,我们将探讨Servlet如何与Ajax进行数据交互,从而实现无刷新页面更新。 首先,让我们了解一下Servlet的工作原理。...

    Servlet+Ajax实现智能搜索

    Servlet负责处理服务器端的业务逻辑,而Ajax则在客户端和服务器之间建立异步通信,实现了搜索结果的即时显示,提高了用户的交互体验。理解并掌握这两项技术,对于开发高效、用户体验优秀的Web应用至关重要。通过实践...

    jsp+servlet+ajax实现登录

    在IT行业中,构建Web应用程序是常见的任务之一,而"jsp+servlet+ajax实现登录"的案例则是一个典型的前后端交互示例。这个案例利用了JavaServer Pages (JSP)、Servlet和Asynchronous JavaScript and XML (AJAX)的技术...

    Servlet+ajax+jsp 购物车系统

    【Servlet+Ajax+jsp 购物车系统】是一个典型的Web应用程序示例,它整合了Java后端技术、异步JavaScript和XML(Ajax)以及JavaServer Pages(jsp)来实现动态网页交互。在这个系统中,MySQL数据库用于存储商品信息和...

    使用JSP/Servlet/Ajax技术开发新闻发布系统2

    在本项目中,“使用JSP/Servlet/Ajax技术开发新闻发布系统2”是北大青鸟ACCP6.0课程的一部分,旨在教授学员如何...通过这个项目,学员能够掌握JSP、Servlet和Ajax的综合运用,为构建更复杂的Web应用程序打下坚实基础。

    饿了么后端项目+使用VUE+Servlet+AJAX技术开发前后端分离的Web应用程序。

    本项目是基于饿了么平台的一个后端实现,采用了Vue.js作为前端框架,Servlet作为后端处理技术,并结合AJAX实现前后端数据交互的Web应用程序。以下是对该项目中涉及的关键技术点的详细解释: 1. **Vue.js**: Vue....

    Servlet+Ajax实现简易的仿百度搜索框智能提示

    在IT行业中,构建一个功能完善的Web应用程序是至关重要的。这里我们关注的是"Servlet+Ajax实现简易的仿百度搜索框智能提示"这一主题。这个技术组合主要用于创建动态、交互性强的用户体验,尤其是对于搜索功能,它...

    servlet-Ajax-jQuery学习手册

    Tomcat的安装和使用使得Web开发人员能够方便地构建和部署基于Servlet的应用程序。 文档强调了了解和掌握Servlet对于Web开发的重要性,因为Servlet提供了一种高效的方式来进行服务器端编程,是处理HTTP请求、生成...

    Eclipse平台下的 Servlet AJAX代码实例.rar

    这些文件共同构成了一个完整的Web应用程序,演示了如何在用户界面上使用AJAX与服务器进行通信,从而提高用户体验,比如无刷新的表格数据更新或表单验证。 在JSP中,通常会有一个AJAX事件监听器,比如按钮点击事件,...

Global site tag (gtag.js) - Google Analytics