基于Struts2標签的BigPipe技术实现.docxVIP

  • 2
  • 0
  • 约1.67万字
  • 约 19页
  • 2016-11-27 发布于重庆
  • 举报
基于Struts2標签的BigPipe技术实现

引言 Facebook 创立了一项技术名为 BigPipe。该技术改善了 Facebook 用户的用户体验,减少页面加载等待时间,它的原理简单、合理。本文借鉴 BigPipe 的思想,针对 Struts2 和 JSP 技术的特点,实现了单线程与多线程版的 BigPipe。两种版本的实现各有优缺点,它们与 Facebook 的 BigPipe 不尽相同,其中多线程版的 BigPipe 实现与 Facebook 较为类似。单线程与多线程实现方式都可以明显改善用户体验,文章之所以要介绍两种实现,是笔者认为二者都有更加适用的情境,在很多情况下,单线程的使用情况更多、更简单。文章将用实际的使用实例,对两种实现进行详细的介绍。在阅读文章之前,读者最好先了解一下 Struts2 自定义标签的开发方法、Java 的 Concurrent 多线程框架以及 FreeMarker 模板引擎,这将帮助你更好的理解文章的 BigPipe 实现方式。 HYPERLINK /developerworks/cn/java/j-lo-bigpipe/index.html \l ibm-pcon 技术简介 现在的浏览器,显示网页时需要经历连续的几个步骤,分别是请求网页 - 服务器端的页面生成 - 返回全部内容 - 浏览器渲染,在这一过程中,“服务器的页面生成”到“返回全部内容”阶段,浏览器什么也不做,大部分浏览器就直接显示空白。可想而知,如果页面庞大,那么等待的时间就很长,这很可能导致大量的用户丢失。Facebook 提出的 BigPipe 技术就是为了解决这个问题,它是基于多线程实现,原理大致可以分为以下两点。 将一个页面分为多个的 PageLet,每个的 PageLet 实际上就是一个 HTML 片段,每个 PageLet 的页面内容由单独的线程生成与处理。 由于使用了多线程,PageLet 内容的返回顺序无法确定,因此如果将内容直接写回 HTML 文档内,它的位置是无法确定的,因此需要借助 JavaScript 将内容插入到正确的位置,因为脚本代码的位置无关紧要。 实现了以上两点,最终的效果将是网页中首先出现网页结构和基本的、简单的信息,然后才会在网页的各个 PageLet 位置出现具体内容,这些 PageLet 没有按流模型从上到下从左到右出现,而是“并行出现”,加载页面速度加快。从以上的分析,这种技术至少有两种好处。 首先出现的结构和基本信息,告诉用户页面正在加载,是有希望的。 并行加载的机制使得某个 PageLet 的缓慢不会影响到别的 PageLet 的加载。 所有的 PageLet 在同一个 HTTP 请求内处理。 接下来,文章先进行示例程序的展示与分析,给出各种实现方式的对比,然后讲解了基于 Struts2 的 BigPipe 标签开发,最后总结了单线程与多线程实现方式的优缺点。 HYPERLINK /developerworks/cn/java/j-lo-bigpipe/index.html \l ibm-pcon 示例展示 为了让读者对本文所讲内容有一个实际的印象,提升您对该技术的兴趣,本文以一个例子,采用三种实现方式来实现。该例子实现了一个 2*3 的表格,按从左到右、从上到下的顺序(也就是文档流模型的加载顺序),标明了序号。每个单元格的内容,都使用 Thread.sleep 方法模拟了加载时间较长的 HTML 内容。按照文档流顺序,每个单元格的线程等待时间分别是 1、2、3、4、5、6 秒。我们观察三种实现方式:普通实现、单线程 BigPipe、多线程 BigPipe,看它们对结果的影响。 示例程序在附件部分,它是一个 JEE Eclipse 工程,读者可以到 HYPERLINK / Eclipse 官方网站下载 JEE Eclipse,下载后导入工程。另外运行示例程序需要 Tomcat 6+ 的支持。 HYPERLINK /developerworks/cn/java/j-lo-bigpipe/index.html \l ibm-pcon 普通方式 打开附件,查看 WebContent 下的 normal.jsp 源码,如清单 1 所示。 清单 1. normal.jsp 源码 %@ page language=java contentType=text/html; charset=utf-8 pageEncoding=utf-8% %long pstart = System.currentTimeMillis();% table border=1 width=100% height=500 caption 普通例子 /caption tr td % lo

文档评论(0)

1亿VIP精品文档

相关文档