JSP显示内容缓存技巧

  JSP   显示内容缓存技巧  
  前段时间做自己社区的论坛,在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显示内容缓存技巧)