`

jsp标签实现facebook的BigPipe

 
阅读更多
   facebook的bigpipe,使页面的加载速度加快。并且可以用来替换ajax。
   具体的介绍以及stutrus2版本的可以参考
    http://www.ibm.com/developerworks/cn/java/j-lo-bigpipe/
    上面有相当大的篇幅是介绍原理、效果的。以及相应的stutrus2源码下载。
   
    在这里,我实现了jsp的自定义标签的多线程版本。

    使用后的效果是6秒多。
    如果没有使用多线程。每个模块都是单独加载的话,即使用前是21秒。


/**
 * bigpipe包围的标签。
 * 在标签内的相应的标签,可以用多线程来加载。
 * 
 * bigpipe的多线程容器。
 *
 * @author shanzhu
 * @version 1.0 2011-10-11
 */

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class JspMultiThreadTag extends BodyTagSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 844627840543112685L;

    //多线程容器
    public static ExecutorService exe = Executors.newFixedThreadPool(20);
    //有多个分割PageLet需要加载,这个必须与jsp页面上的分割PageLet对象的数目一致。
    private String pageLetNum;
    public static final String COUNT_DOWN1 = "countDown1";

    @Override
    public int doEndTag() throws JspException {
        CountDownLatch c = (CountDownLatch)pageContext.getRequest().getAttribute(COUNT_DOWN1);
        try {
            c.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return super.doEndTag();
    }

    @Override
    public int doStartTag() throws JspException {
        //CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。
        CountDownLatch countDownLatch = new CountDownLatch(Integer.parseInt(pageLetNum));   
        pageContext.getRequest().setAttribute(COUNT_DOWN1, countDownLatch);
        return super.doStartTag();
    }

    public String getPageLetNum() {
        return pageLetNum;
    }

    public void setPageLetNum(String pageLetNum) {
        this.pageLetNum = pageLetNum;
    }   
    
    
}
/**
 * 具体的每个线程处理
 *
 * @author shanzhu
 * @version 1.0 2011-10-11
 */

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class JspShowTag extends BodyTagSupport{

    /**
     * 
     */
    private static final long serialVersionUID = -1293048704943284655L;
    private String value;//显示的字符串的值
    private int time;//休眠的时间

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    @Override
    public int doEndTag() throws JspException {
       int end = super.doEndTag();
        JspMultiThreadTag.exe.execute(new Runnable() {
            
            @Override
            public void run() {
                CountDownLatch c = (CountDownLatch)pageContext.getRequest().getAttribute(JspMultiThreadTag.COUNT_DOWN1);
                try {
                    try {
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    pageContext.getOut().write(value);
                    pageContext.getOut().flush();   //刷新缓冲区。如果调试的时候,可以把这段代码注释后对比效果。
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                c.countDown();//减一
            }
        });
        
        return end;
    }

}


在相对应的jsp页面
<%@taglib prefix="jspp" uri="/jspp-tags"%>
<% long l = System.currentTimeMillis(); %>
<jspp:multiThread pageLetNum="6">

	<jspp:jspshow value="http://www.koubei.com/city/11111111" time="1000">
	</jspp:jspshow>
	
	<jspp:jspshow value="http://www.koubei.com/city/222222" time="2000">
	</jspp:jspshow>
	
	<jspp:jspshow value="http://www.koubei.com/city/333333" time="3000">
	</jspp:jspshow>
	
	<jspp:jspshow value="http://www.koubei.com/city/444444" time="4000">
	</jspp:jspshow>
	
	<jspp:jspshow value="http://www.koubei.com/city/55555" time="5000">
	</jspp:jspshow>
	<jspp:jspshow value="http://www.koubei.com/city/6666666" time="6000">
	</jspp:jspshow>
	
	
	
</jspp:multiThread>

<% long ll = System.currentTimeMillis();

	System.out.println(ll-l);
%>



自定义标签的定义:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>2.2.3</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>jspp</short-name>
  <uri>/jspp-tags</uri>
  <display-name>"bigpipe Tags"</display-name>
  <description><![CDATA["jsp bigpipe"]]></description>
  
  <tag>
    <name>multiThread</name>
    <tag-class>JspMultiThreadTag</tag-class>
    <body-content>JSP</body-content>
    <description><![CDATA[duo xian cheng biaoqian]]></description>
    <attribute>
      <name>pageLetNum</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
      <description><![CDATA[must equal to PageLet number]]></description>
    </attribute>
  </tag>
  
  <tag>
    <name>jspshow</name>
    <tag-class>JspShowTag</tag-class>
    <body-content>JSP</body-content>
    <description><![CDATA[PageLet model]]></description>
    <attribute>
      <name>value</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
      <description><![CDATA[the string for show ]]></description>
    </attribute>
    <attribute>
      <name>time</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
      <description><![CDATA[sleep time]]></description>
    </attribute>
  </tag>
</taglib>

分享到:
评论

相关推荐

    facebook bigpipe Java版本实现

    Facebook的BigPipe是一种高效网页加载技术,旨在提升用户体验,通过分块加载页面内容来显著减少网页的加载时间。它最初由Facebook开发,并已开源。在这个Java版本的实现中,我们有机会深入理解BigPipe如何在非PHP...

    bigpipe 基于struts2标签实现

    - **自定义标签库**:可能包括一个`.tld`文件定义标签库和对应的Java类实现标签功能。 - **JavaScript文件**:负责在客户端处理异步请求和页面渲染。 结合`Struts2`和`BigPipe`,开发者可以显著提升Web应用的用户...

    Bigpipe命令_V45

    ### Bigpipe命令_V45 知识点解析 #### 一、Bigpipe 命令概览 在 Dell PowerApp.BIG-IP 参考指南中提到的 Bigpipe 命令_V45 是一系列用于管理和配置 PowerApp.BIG-IP 设备的工具集。这些命令可以帮助管理员执行各种...

    java实现bigpipe(上)

    它最初由 Facebook 提出,目的是将一个大页面拆分成多个小的部分(称为“管道”或“页面片段”),然后逐个异步加载这些部分,从而实现页面的渐进式渲染。本文将深入探讨如何使用 Java 来实现 BigPipe,并逐步解析其...

    bigPipe Net

    【标签】"bigPipe Net" 标签明确指出了这个项目是关于网络优化和实现类似微博 BIGPIPE 的功能。BIGPIPE 是一种页面渲染优化技术,通过分块加载(Pagelet)和异步执行,显著提升了页面的响应速度,尤其在高并发访问的...

    C#实现仿新浪微博BigPipe

    BigPipe是Facebook提出的一种页面加载技术,它通过将一个网页拆分成多个小的部分或模块,然后并行加载,显著提升了用户体验,尤其是在网络带宽有限或者用户设备性能较低的情况下。 在传统的网页加载方式中,浏览器...

    高性能页面加载技术--BigPipe设计原理及Java简单实现

    BigPipe是一种由Facebook提出的高效页面加载策略,它通过将一个页面拆分成多个部分(或称为“管道”),并逐个异步加载这些部分,来显著加快网页的初始展现速度。在本文中,我们将探讨BigPipe的设计原理以及如何使用...

    BigPipe技术java源代码

    BigPipe是由Facebook开发的一种页面加载优化技术,它的主要目的是为了提高网页的加载速度,提升用户体验。在传统的网页加载过程中,浏览器会一次性下载整个页面的所有资源,这往往导致用户需要等待较长的时间才能...

    基于Struts2标签的BigPipe技术实现

    本文基于BigPipe的思想,开发了BigPipe的JSP实现,该技术可以实现JSP页面的快速加载,增强用户体验,读者不仅可以从本文了解BigPipe原理,还可以使用开发的Struts2标签进行实际的开发,相信对读者的学习和开发有很大...

    Asp.net MVC2.0 BigPipe假想

    ASP.NET MVC 2.0 BigPipe 假想是一种优化Web应用性能的技术,灵感来源于Facebook的BigPipe。BigPipe的主要思想是将页面加载分为多个独立的部分,这些部分可以并行加载,从而显著提高页面渲染速度,提升用户体验。在...

    BigPipe技术后端实现分享 新浪微博新版中的Bigpipe Server端的php实现 共39页.ppt

    BigPipe技术是一种优化网页加载速度的方法,最初由Facebook提出,其核心思想是将一个完整的网页分割成多个小的、独立的模块,称为Pagelet,然后逐个加载这些模块,就像流水线作业一样,从而显著减少用户等待整个页面...

    node.js实现BigPipe详解

    BigPipe是由Facebook开发的一种网页加载优化技术,旨在显著提升用户在浏览网页时的加载速度。它通过将页面分割为多个独立的部分(称为Pagelets),并利用HTTP的流式传输特性,允许浏览器逐步接收和渲染页面内容,而...

    NET BIGPIPE vs2010

    此技术灵感来源于Facebook的BigPipe,旨在改善用户在浏览网页时的感知速度。在.NET中实现BigPipe,主要是通过将一个大的页面响应分解为多个小的部分(称为"管道"),然后逐个发送给客户端,而不是等待所有内容准备好...

    net bigPipe

    "net bigPipe" 是一种优化网页性能的技术,最初由Facebook提出,后来被广泛应用于许多大型社交网络,如微博等。它借鉴了操作系统中的管道(pipe)概念,将一个完整的页面拆分成多个小的部分(称为流或管道),然后...

    nodejs实现bigpipe异步加载页面方案

    BigPipe 技术,最初由 Facebook 提出,是一种有效的页面异步加载策略,它能显著降低页面加载时间,尤其是在处理复杂、数据丰富的动态页面时。本文将探讨如何使用 Node.js 结合 BigPipe 来实现这一技术,并讨论其优...

    bigpipe-example, 使用koa和组件的[DEPRECATED] BigPipe.zip

    bigpipe-example, 使用koa和组件的[DEPRECATED] BigPipe BigPipe示例 使用 koa 和组件插件构建的应用程序,实现了facebook的 BigPipe 。给定 subreddit,这里应用程序执行以下操作:一个基于 horizontal-grid-...

    webx之bigpipe

    7. **兼容性**:虽然BigPipe最初由Facebook提出,但Webx的实现使其具有跨平台和跨浏览器的兼容性,适用于各种现代浏览器。 8. **源码分析**:了解Webx BigPipe的源码可以帮助开发者深入理解其工作原理,进行定制化...

Global site tag (gtag.js) - Google Analytics