异步Servlet应用扩展AJAX应用程序是构建于异步Servlet理念的基础之上的一种范型,那么到底是什么含义呢?本文将向你介绍使用异步Servlet扩展AJAX应用程序。

异步Servlet扩展AJAX使用程序为什么有用呢,咱们知道作为Web使用程序模型的AJAX的呈现使服务器端的相貌发生了巨大的改变。用户对着Web页面填写表单并单击提交按钮转到下一个链接的典型Web运用办法现在正在转变为更先进的客户端JavaScript以及功用更丰厚的用户界面,只需对表单进行操作,比方单击一个复选框、按下一个键或将鼠标移到一个选项卡上,该用户界面就会不断地与服务器交互。

异步Servlet在AJAX程序中的使用(servlet和ajax交互)  异步Servlet AJAX 第1张

异步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展现了一个比方。

  1. importjava.io.IOException;
  2. importjava.io.PrintWriter;
  3. importjava.util.Date;
  4. importjava.util.Stack;
  5. importjavax.servlet.ServletException;
  6. importjavax.servlet.http.HttpServletRequest;
  7. importweblogic.servlet.FutureResponseServlet;
  8. importweblogic.servlet.FutureServletResponse;
  9. //AnAsynchronousServletthathandlesHTTPrequestsfroma"separate"threadand
  10. //nottheexecutethreadusedtoinvokethisservlet.
  11. publicclassAsynchronousServerResponseServletextendsFutureResponseServlet{
  12. privatefinalNotifiernotifier;
  13. publicAsynchronousServerResponseServlet(){
  14. this.notifier=newNotifier();
  15. this.notifier.start();
  16. }
  17. publicvoidservice(HttpServletRequestrequest,FutureServletResponseresponse)throwsIOException,ServletException{
  18. //pushthisclient'srequesttoabufferandreturnimmediately.
  19. //asynchronousprocessingoccursintherunmethodoftheNotifierThread
  20. notifier.poll(request,response);
  21. }
  22. classNotifierextendsThread{
  23. privatestaticStackclients=newStack();
  24. voidpoll(HttpServletRequestrequest,FutureServletResponseresponse){
  25. clients.push(newClient(request,response));
  26. }
  27. publicvoidrun(){
  28. while(!clients.empty()){
  29. Clientclient=null;
  30. try{
  31. client=(Client)clients.pop();
  32. PrintWriterpw=client.response.getWriter();
  33. for(intj=0;j<10;j++){
  34. pw.println("Timeis:"+newDate()+"");
  35. pw.flush();
  36. }
  37. pw.close();
  38. }
  39. catch(Throwablet){
  40. t.printStackTrace();
  41. }
  42. finally{
  43. try{
  44. client.response.send();
  45. }
  46. catch(IOExceptionioe){
  47. ioe.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  52. }
  53. //innerclassthatholdso-ntotheclientshttprequestandresponse
  54. classClient{
  55. privateHttpServletRequestrequest;
  56. privateFutureServletResponseresponse;
  57. privateClient(HttpServletRequestrequest,FutureServletResponseresponse){
  58. this.request=request;
  59. this.response=response;
  60. }
  61. }

能够看出,该比方十分简略。AsynchronousServerResponseServlet类扩展了FutureResponseServlet,偏重写了service办法。只运用一个线程(即Notifier类)来处理一切的客户端衔接呼应。关于每个HTTP恳求,Servlet向Notifier线程注册套接字衔接,然后回来。异步事情被交付给客户端,而持久性套接字衔接被保持。

单个线程可办理多个客户端衔接!run()办法可用于依据某种音讯挑选条件回调事情到客户端。该比方只履行了一个服务器端的push操作,有些过火简略了。线程池可被用于某些类型的事情处理。

异步Servlet的使用总而言之,在处理长时间运转的使命时,FutureResponseServlet是一个好特性,它答应开发人员进步功能,在独立的线程中处理呼应,并将开支降至***。在构建异步Servlet使用程序时,该办法支撑可伸缩性。

【修改引荐】

  1. Servlet多线程的相关问题浅析
  2. Servlet容器之安全多线程问题
  3. JSP Servlet开发开始那点事
  4. Servlet的运转环境装备浅谈
  5. Servlet页面跳转完成办法的差异
转载请说明出处
知优网 » 异步Servlet在AJAX程序中的使用(servlet和ajax交互)

发表评论

您需要后才能发表评论