`
secondhrc
  • 浏览: 3654 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java实现bigpipe(下)

阅读更多

这里开始讲述后台部分的实现

 

 

<filter>
  		<filter-name>indexFilter</filter-name>
  		<filter-class>hrc.web.test.filter.IndexFilter</filter-class>
</filter>
<filter-mapping>
  		<filter-name>indexFilter</filter-name>
  		<url-pattern>/index.jsp</url-pattern>
</filter-mapping>

<servlet>
  		<servlet-name>PageletServlet</servlet-name>
  		<servlet-class>hrc.web.bigpipe.BigpipeServlet</servlet-class>
  		<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
  		<servlet-name>PageletServlet</servlet-name>
  		<url-pattern>/pageletServlet</url-pattern>
</servlet-mapping>
  	

这里的filter规定了那些页面需要使用bigpipe,servlet则是对具体的bigpipe进行具体的处理。在这个例子中,当用户访问index时,会先被IndexFilter处理。

 

 

public class IndexFilter extends AbstractBigpipeFilter {

	
	@Override
	protected List<PageletModel> getPageletModels(String path) {
		List<PageletModel> list=new ArrayList<PageletModel>();
		PageletModel model=new PageletModel();
		model.setPath("/pagelet1.jsp");
		model.setCss(path+"/css/page1.css");
		model.setJs(new String[]{path+"/js/page1.js"});
		model.setPid("p1");
		list.add(model);
		
		PageletModel model2=new PageletModel();
		model2.setPath("/pagelet2.jsp");
		model2.setCss(path+"/css/page2.css");
		model2.setJs(new String[]{path+"/js/page2.js"});
		model2.setPid("p2");
		list.add(model2);
		
		PageletModel model3=new PageletModel();
		model3.setPath("/pagelet3.jsp");
		model3.setCss(path+"/css/page3.css");
		model3.setJs(new String[]{path+"/js/page3.js"});
		model3.setPid("p3");
		list.add(model3);
		return list;
	}

}

 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req=(HttpServletRequest) request;
		
		String url=req.getServletPath();
		
		logger.info(this.getClassNameAndMethod()+"url:"+url);
			
		req.setAttribute("page", url);
		req.setAttribute("list", getPageletModels(req.getContextPath()));
		req.getRequestDispatcher("/pageletServlet").forward(request, response); 
		
	}

 

 IndexFilter主要用来定义index.jsp需要用到的pagelet页面集合,每一个pagelet都设置了css、js、html、pid属性(这些属性用来干什么上一节有说)然后放进list中。它的父类AbstractBigpipeFilter得到这个list后,会把请求交给pageletServlet来处理。

 

BigpipeServlet

 

private void doPagelet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	
		final PageletCount pageletCount = new PageletCount();	
		response.setContentType("text/html");
		response.setCharacterEncoding("gbk");
		
		String url=(String) request.getAttribute("page");
		RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher(url);
		dispatcher.include(request, response);
		response.getWriter().flush();      //先把主页面的内容全部输出出来
		
		List<PageletModel> list=(List<PageletModel>) request.getAttribute("list"); 
		for(PageletModel model:list){
			executor.execute(new Pagelet(pageletCount,request,response,model));  //pagelet逐个页面底部输出
		}
		
		synchronized (pageletCount) {
			try {
				pageletCount.wait();
			} catch (Exception e) {
				
			}
		}	
	}

 doGet、doPost会调用下列代码。它先将主页面(在这里例子中时index.jsp)的内容flush给浏览器,让用户可以先看到页面的大概样子。然后取得从AbstractBigpipeFilter中得到的pagelet消息,并通过ExecutorService把pagelet一个一个输出到页面底部。

 

synchronized (pageletCount) {
			try {
				pageletCount.wait();
			} catch (Exception e) {
				
			}
		}	

 最后的这句很关键。由于pagelet是多线程执行,如果执行这行,响应会在pagelet输出之前结束。

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java实现bigpipe(上)

    Java 实现 BigPipe 技术详解(上) 在 Web 应用开发中,为了提高页面加载速度和用户体验,BigPipe 技术应运而生。它最初由 Facebook 提出,目的是将一个大页面...后续的"Java实现BigPipe(下)"将进一步探讨这些问题。

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

    高性能页面加载技术是现代Web开发中的重要议题,旨在提升用户体验,减少用户等待时间。...在Java环境中实现BigPipe,需要结合服务器端和前端技术,充分利用现代Web栈的优势,以实现最佳的页面加载性能。

    facebook bigpipe Java版本实现

    在Java实现中,我们可以关注以下几个关键技术点: 1. **模块化与异步处理**:BigPipe将页面拆分成独立的模块,每个模块可以单独处理和渲染。这些模块通常包括动态内容(如新闻feed)和静态组件(如导航栏)。Java中...

    BigPipe技术java源代码

    在Java实现中,BigPipe技术可以支持单线程和多线程加载策略。单线程加载虽然简单,但可能会限制并行处理的能力,导致页面加载速度的上限。而多线程加载则能充分利用现代多核处理器的性能,将不同Pagelet的加载任务...

    bigpipe 基于struts2标签实现

    在Java Web环境中,结合`Struts2`框架,我们可以实现`BigPipe`技术,以提升基于`Struts2`应用的性能。 `BigPipe`的核心思想是将一个大的HTML页面拆分为多个小的部分(通常称为Pagelets),每个部分独立加载和渲染。...

    webx之bigpipe

    Webx是一个基于Java的开源Web框架,而BigPipe则是Webx框架中的一个特性,用于实现快速、高效的页面分片加载。 在传统的网页加载过程中,浏览器会等待所有资源下载完毕后再一次性渲染页面,这可能导致用户看到空白页...

    利用Maven开发的一个基于Servlet的BigPipe简单案例.zip

    BigPipe的主要思想是实现浏览器和服务器的并发执行,实现页面的异步加载从而提高页面加载速度.为了达到这个目的,BigPipe首先根据页面的功能或位置将一个页面分成若干模块(模块称作pagelet),并对这几个模块进行...

    前端页面加载优化

    Struts2 是一个流行的 Java Web 框架,而 BigPipe 技术则是 Facebook 提出的一种优化页面加载速度的方法,它借鉴了服务器端渲染的优势,将大型页面拆分为多个小块,逐个加载,从而显著提高了页面的加载效率。...

    plumber:一个支持 pagelets 并发执行和 BigPipe 的网站框架

    plumber 是一款实现页面 pagelet 并发执行的 java web 框架,支持以 的方式返回你的 pagelet 执行结果,以一切可能并发的方式提高你的页面响应速度。 ##Core Features 支持将页面划分成多个可以并发执行的 pagelet ,...

    springMVC纯净工程

    SpringMVC是一个强大的Java web应用程序开发框架,它是由Spring生态系统的一部分,主要负责处理HTTP请求和响应,实现了模型-视图-控制器(MVC)的设计模式。这个“springMVC纯净工程”应该是一个专为电子商务或其他...

    Rose全程实战介绍 pdf 入门+提高 示例+代码 公司内部学习资料

    - **Pipe支持:**类似于Facebook的BigPipe技术,优化页面加载速度。 - **上传文件:**提供文件上传功能的支持。 **3.2 DAO层:** - **基本配置与使用:**介绍如何配置和使用DAO层,实现数据访问操作。 - **SQLParm...

    米聊服务端开源实践

    - **Portal/pipe**:类似于Facebook BigPipe的机制,支持多线程运行,提高页面加载速度。 - **相关URL**:http://code.google.com/p/paoding-rose/wiki/Rose_SJ ##### 10. Thrift - **功能简介**:Apache Thrift是...

    高并发高负载网站系统架构

    通过静态化架构设计,可以实现更高的响应速度和更低的延迟,从而更好地支持大规模的用户访问。 #### 六、结论 对于高并发高负载的网站系统而言,通过实施静态化架构设计不仅可以有效提高系统的性能,还能增强系统...

Global site tag (gtag.js) - Google Analytics