`

j2ee高并发,生成静态页面代码解析

阅读更多

jsp解决高并发,其中一个方法就是生成静态页面,这样可以减少访问数据库次数,也可以省去后台处理逻辑。

 

那么实现生成静态页面的技术已经相当成熟了,向velocity,freemarks架构都已经包装好了。

 

但是在结合各种奇奇怪怪的架构中,还是在自己实现的代码复用最好,所以,接下来简单解析生成页面部分代码,

 

在这个生成静态页面代码中,URL的重定向,就是将URL改为约定好的html页面地址,这个步骤就是拼拼接接字符串,放在

requestDispatcher中,或是说requestDispatcher指向html页面资源

 

那么下面是关键生成讲台页面的代码,不管是哪个版本的,都会有如下代码:

 

Java代码  收藏代码
  1. {    
  2.              final ByteArrayOutputStream os = new ByteArrayOutputStream();    
  3.              final ServletOutputStream stream = new ServletOutputStream() {       
  4.       
  5.                   public   void   write(byte[] data,int offset, int length)   {    
  6.                          os.write(data,   offset,   length);    
  7.                   }        
  8.       
  9.                   public   void   write(int   b)   throws   IOException   {    
  10.                          os.write(b);    
  11.                   }    
  12.               };      
  13.       
  14.                final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, encoding));     
  15.       
  16.                HttpServletResponse rep =  new HttpServletResponseWrapper(response)   {     
  17.       
  18.                    public ServletOutputStream getOutputStream() {    
  19.                                   return stream;    
  20.                    }        
  21.       
  22.                    public PrintWriter getWriter() {    
  23.                                  return pw;    
  24.            }    
  25.                };     
  26.       
  27.               logger.debug("HtmlCreatorServlet RequestDispatcher = " + templatePath);    
  28.               RequestDispatcher  dispatcher = getServletContext().getRequestDispatcher(templatePath);    
  29.               dispatcher.include(request, rep);    
  30.               pw.flush();    
  31.               FileOutputStream fos = null;    
  32.               try {     
  33.       
  34.                   if(os.size() == 0) {    
  35.                   response.sendError(HttpServletResponse.SC_NOT_FOUND, "");    
  36.                   }    
  37.           else {    
  38.                   fos = new FileOutputStream(cachhtmlFileName);    
  39.                   os.writeTo(fos);    
  40.                   dispatcher = getServletContext(). getRequestDispatcher("/"+htmlName);    
  41.                         dispatcher.include(request, response);    
  42.                   }     
  43.       
  44.                   } finally {    
  45.                   if(fos != null) {    
  46.                       fos.close();    
  47.                   }    
  48.              }     
  49.       
  50. }     

 其目的就是从response中将目标资源jsp写入到静态页面html中,其中关键语句为

Java代码  收藏代码
  1. HttpServletResponse rep =  new HttpServletResponseWrapper(response)   {     
  2.       
  3.                    public ServletOutputStream getOutputStream() {    
  4.                                   return stream;    
  5.                    }        
  6.       
  7.                    public PrintWriter getWriter() {    
  8.                                  return pw;    
  9.            }    

他将输出流的方向改变了,将response中的内容转到打印流pw中,pw在写入到数组字节流os中,os就可以写到文件指定的html文件中了,可喜可贺可喜可贺。那么都是在哪句代码中实现的呢,在这句活

Java代码  收藏代码
  1. dispatcher.include(request, rep);    

disparcher的include,玩过jsp都知道,是将目标资源处理结果包括在当前资源中,呈现给用户,可是response被rep重现包装后,前段已经说过,将输出流改变了方向。

 

以此实现了生成静态页面。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics