温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

异步Servlet在AJAX程序中的应用方法是什么

发布时间:2021-12-27 16:27:43 来源:亿速云 阅读:121 作者:iii 栏目:编程语言

本篇内容主要讲解“异步Servlet在AJAX程序中的应用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“异步Servlet在AJAX程序中的应用方法是什么”吧!

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

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

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

异步Servlet特别的出现在这里面对此问题,其中一种解决方案是创建一个扩展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操作,有些过分简单了。线程池可被用于某些类型的事件处理。

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

到此,相信大家对“异步Servlet在AJAX程序中的应用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI