动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Jsp → 阅读文章

 JSP显示内容缓存技巧

作者来源: 
阅读 1537 人次 , 2006-3-29 4:24:00 


  前段时间做自己社区的论坛,在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 */ 


 本文Tagssession  application  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:JSP实现论坛树型结构的具体算法
· 下一篇:学习在JSP中使用JavaBeans
· 让JSP页面过期, 每次JSP页面都是最新
· 安装 WebSphere应用服务器 
· 令人兴奋的脚本编程
· 初学jsp心得
· Apache+Servlet+Jsp环境设置(下)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077