首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

施用Servlet分段输出构建BigPipe服务端

2012-08-09 
使用Servlet分段输出构建BigPipe服务端BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页

使用Servlet分段输出构建BigPipe服务端
     BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。

      使用JAVA实现BigPipe服务端的例子在网上很难寻觅,笔者经过多次尝试,在Servlet3.0和Servlet2.5规范下成功实现了BigPipe的分段输出效果。好东西不敢独享,在这里与大家分享。
      要搭建BigPipe服务端程序,首先我们必须了解BigPipe服务端的工作原理。BigPipe的最终目标是通过一次请求向浏览器输出页面框架和若干个Pagelet。浏览器在接收完页面框架后立即进行展现,然后并行的接收后面的Pagelets,从而加快页面的渲染速度。Pagelet是通过调用前端的一个JS方法向页面输出的。
      为了达到一次请求多次输出的效果,服务端程序必须采用分段输出的技术(chunked)。这里所说的chunked是指HTTP 1.1规范中定义的一个特殊的HTTP头信息,下面的一段HTTP响应头包含了chunked定义:

public class BigpipeServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");final PrintWriter pw = response.getWriter();final StringBuffer content = new StringBuffer("<html><body>");content.append("<div id='a1' style='width:100px;height:100px;border:1px solid black'></div>");content.append("<div id='a2' style='width:100px;height:100px;border:1px solid black'></div>");content.append("<div id='a3' style='width:100px;height:100px;border:1px solid black'></div>");content.append("<div id='a4' style='width:100px;height:100px;border:1px solid black'></div>");content.append("</body></html>");pw.println(content.toString());pw.flush();final Paglet paglet1 = new Paglet(pw, 1);final Paglet paglet2 = new Paglet(pw, 2);final Paglet paglet3 = new Paglet(pw, 3);paglet1.start();paglet2.start();paglet3.start();try {paglet3.join();paglet2.join();paglet1.join();} catch (InterruptedException e) {e.printStackTrace();}pw.close();}class Paglet extends Thread {private int id;private PrintWriter out;public Paglet(PrintWriter out, int id) {this.out = out;this.id = id;}@Overridepublic void run() {try {sleep(id * 1000);final String content = "<script>document.all.a" + id + ".innerHTML='<h1>" + id + "</h1>'</script>";synchronized (out) {out.println(content);out.println();out.flush();}} catch (InterruptedException e) {e.printStackTrace();}}}}

      原文地址:http://www.coolfancy.com/log/26.html

      更多精彩原创文章请关注笔者的原创博客:http://www.coolfancy.com



热点排行