网站源码下载PR查询短网址
首页编程数据库网页图形冲浪邮件下载浏览器QQ系统办公软件站长安全手机邮件认证组网通信


网站首页 -> 网络编程 -> JSP技巧
JSP显示内容缓存技巧

发表日期:2003-12-5



  前段时间做自己社区的论坛,在jive的基础上做一个页面显示所有论坛的帖子,可以称之为总版,模仿Forum类的接口做个SuperForum并且实现Cachable,不过因为这个页面刷新量比较大,虽然被Cache了,我还是想办法进行页面的缓存,感觉用jsp产生的html静态内容当缓存,页面访问速度应该有所提高。

  首先想到的一种办法,是采用java.net的URLConnection把服务器上的jsp抓过来做缓存,不过我觉得这样做太见外了,自己服务器上的东西,为何要用HTTP去访问.于是想另外一个办法,把jsp的out对象的输出控制到自己希望的地方.比如输出到静态文件,又或者保存成全局的字符串变量.这样的话,浏览就不需要执行jsp,只是浏览该html了.仅仅在数据有更新的时候进行一次update操作,把jsp重新输出为html.

  我觉得,浏览事件比数据插入或更新发生的次数多的时候.不妨试试这个办法来提高页面访问速度.

  整件事情有点像把jsp当作模板,生成静态的html页面.

  将如下代码写入web-xml


<filter>
<filter-name>FileCaptureFilter</filter-name>
<filter-class>com.junjing.filter.FileCaptureFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>FileCaptureFilter</filter-name>
<url-pattern>/latest.jsp</url-pattern>
</filter-mapping> 

  latest.jsp是我要cache的页面

  java源码代码如下


/** * START File FileCaptureFilter.java */

package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class FileCaptureFilter implements Filter
{
 PRivate String protDirPath;
 public void init(FilterConfig filterConfig)
  throws ServletException
  {
   protDirPath = filterConfig.getServletContext().getRealPath("/");
  }
 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
  throws IOException, ServletException
  {
  String fileName = protDirPath + "forum/lastest.html";
  PrintWriter out = response.getWriter();
  FileCaptureResponseWrapper responseWrapper = new FileCaptureResponseWrapper((HttpServletResponse)response);
  chain.doFilter(request, responseWrapper);
  // fill responseWrapper up
  String html = responseWrapper.toString();
  //得到的html页面结果字符串
  // responseWrapper.writeFile(fileName);
  // dump the contents 写成html文件,也可以保存在内存
  //responseWrapper.writeResponse( out );
  // back to browser
  //responseWrapper.sendRedirect("lastestThread.jsp");
  }

  public void destroy() {}
}

/** * END File FileCaptureFilter.java */
/** * START File FileCaptureResponseWrapper.java */

package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class FileCaptureResponseWrapper
 extends HttpServletResponseWrapper
 {
  private CharArrayWriter output;
  public String toString()
  {
   return output.toString();
  }
  public FileCaptureResponseWrapper(HttpServletResponse response)
  {
   super(response);
   output = new CharArrayWriter();
  }

  public PrintWriter getWriter()
  {
   return new PrintWriter(output);
  }

  public void writeFile(String fileName)
   throws IOException
   {
    FileWriter fw = new FileWriter(fileName);
    fw.write( output.toCharArray() );
    fw.close();
   }

  public void writeResponse(PrintWriter out)
  {
   out.print( output.toCharArray() );
  }
 }
 /** * END File FileCaptureResponseWrapper.java */
 
  附件源代码

  不过采用resin服务器的话,以上代码会失效。因为resin没有实现getWriter方法,而是采用getOutputStream取而代之,所以必须修改些代码来迎合resin运行环境:


/** * START File FileCaptureResponseWrapper.java */

package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class FileCaptureResponseWrapper
 extends HttpServletResponseWrapper
{
 private CharArrayWriter output;
 public String toString()
 {
  return output.toString();
 }
 public FileCaptureResponseWrapper(HttpServletResponse response)
 {
  super(response);
  output = new CharArrayWriter();
 }

 public PrintWriter getWriter()
 {
  return new PrintWriter(output);
 }

 public void writeFile(String fileName)
  throws IOException
 {
  FileWriter fw = new FileWriter(fileName);
  fw.write( output.toString());
  fw.close();
 }

 public ServletOutputStream getOutputStream()
  throws java.io.IOException
  {
   return new ServletOutputStream();
  }

 public void write(int b)
  throws IOException
 {
  output.write(b);
 }

 public void write(byte b[])
  throws IOException
 {
  output.write(new String(b,"GBK"));
 }

 public void write(byte b[], int off, int len)
  throws IOException
 {
  output.write(new String(b, off, len));
 }
};
}

 public void writeResponse(PrintWriter out)
 {
  out.print(output.toCharArray());
 }
}
/** * END File FileCaptureResponseWrapper.java */ 



上一篇:学习在JSP中使用JavaBeans 人气:26623
下一篇:JSP实现论坛树型结构的具体算法 人气:39605
网站文章搜索
邮件订阅服务
输入你的邮件地址,你将不会错过任何关于<JSP技巧教程>的内容
今日更新文章
·教你一种新思路调色教程
·使用Lab颜色通道调出照片完美色彩
·PS打造柔美风格色调教程
·教你给宝宝皮肤美白教程
·利用风景图片制作特色明信片
·PS给照片制作蓝天背景
·Photoshop制作沧桑颓废的城市海报
·如何才能出现”添加至百度首页“标志
·没学历 没文凭 没背景 我选择了SEO
·不可小觑的论坛式外链
·SEO的价值并不仅仅体现在搜索引擎上
·Photoshop打造完美江景
本栏目推荐文章
·JAVA编程中异常问题处理方式的区别和分析
·揭开WebLogic Web服务安全性的面纱
·lzw压缩算法的c语言实现
·JDBC3.0新特性
·J2ME 2D小游戏入门之周边工具类
·JDBC导论
·Asp.Net2.0中实现多任务异步页的一点提示
·用VB设计条形码轻印刷系统
·关于JCreator Pro 3.0的一个折中处理方案
·使用java实现在文件中添加字符串
·规划SOA(2)构建SOA路线图
·Struts1.0学习文档-初学者入门
Copyright © 2005-2012 www.Devdao.com All rights reserved | 沪ICP备05001343号 sitemap