注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

古城风~~~

竹密无妨溪水过,天高不碍白云飞。这天下总有一份是属于我古城的天地!

 
 
 

日志

 
 

JSP页面静态化总结之三采用过滤器Filter【转】  

2009-09-23 14:29:05|  分类: java/jsp |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这里介绍一下用JAVA 的Filter来实现页面静态化
4.1Filter简介
Filter是Servlet 2.2规范中最激动人心的特性。Filter能过滤特定URL如/admin/*并进行必要的预处理,如修改Request和Response,从而实现定制的输入输出。更强大的是,Filter本身是一个责任链模式,它能一个接一个地传递下去,从而将实现不同功能的Filter串起来,并且可以动态组合。 通过Filter可以比较轻松的过滤HTTP请求,可以针对全局性的一些事务进行处理,如判断IP属于哪个城市等。
4.2 Filter实现
(1) Filter过滤器编写
HttpServletRequest hreq = (HttpServletRequest) req;
   HttpServletResponse hresp = (HttpServletResponse) res;

   StringBuffer url = hreq.getRequestURL();
   System.out.println(url);
   String name = url.substring(hreq.getRequestURL().lastIndexOf("/") + 1,hreq.getRequestURL().lastIndexOf("."));

   System.out.println(name);
   // 取得相应的URL,URI
   String str_uri = hreq.getRequestURI();
   System.out.println(str_uri);

   // 构建HTML静态页面
   File file = new File(hreq.getSession().getServletContext().getRealPath(
     "/")
     + "html\\" + str_uri.substring(0, str_uri.lastIndexOf("/"))
     // +"/"+time
     + "/" + name + ".html");

   if (!file.exists()) {// 如果文件不存在,加了个type参数
    if ((hreq.getRequestURL().indexOf(".jsp") > 0
      //&& hreq.getParameter("type") != null)&& !"".equals(hreq.getParameter("type")
      )) {
     System.out.println("Filter:不存在该页面,创建");
     hresp.sendRedirect(hreq.getContextPath() + "/ToHtml?file_name=" + name + "&uri=" + str_uri);
    }

   } else {
    System.out.println("Filter:存在该页面,直接跳转");
    hresp.sendRedirect(hreq.getContextPath() + "/html" + str_uri.substring(0, str_uri.lastIndexOf("/"))+ "/" + name + ".html");
   }

   /**
   * else if((hreq.getRequestURL().indexOf(".jsp") >0 &&
   * hreq.getParameter("type")!= null ) &&
   * !"".equals(hreq.getParameter("type"))) { System.out.println("可以了没啊");
   *
   * hresp.sendRedirect(hreq.getContextPath() + "/ToHtml?file_name=" +
   * name + "&uri=" + str_uri); }
   */
   chain.doFilter(req, res);

Filter将拦截到的请求转向一个Servlet,通过该Servlet生成静态化页面。

(2)Servlet代码部分

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

   ServletContext sc = getServletContext();  
   //取得文件名
   String file_name = request.getParameter("file_name");

   String uri = request.getParameter("uri");
   String uri_new = uri;
   String url = uri.substring(uri.indexOf("/", 1), uri.length());
   // System.out.println("uri_new:" + uri_new);
   // System.out.println("url:" + url);
   String name = file_name + ".html";
   // String date = time();  
   //构建文件
   String pName = request.getSession().getServletContext()
     .getRealPath("/")
     + "html/"
     + uri.substring(0, uri.lastIndexOf("/"))
     + "/"
     + file_name + ".html";
   // + date_time + "\\" + file_name + ".html";
   String PName = pName.replace("/", "\\");

   File file = new File(PName.substring(0, PName.lastIndexOf("\\") + 1));
   file.mkdirs();
  
   RequestDispatcher rd = sc.getRequestDispatcher(url);
  
   final ByteArrayOutputStream os = new ByteArrayOutputStream();
   final ServletOutputStream stream = new ServletOutputStream() {
    public void write(byte[] data, int offset, int length) {
     os.write(data, offset, length);
    }

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

   //String str = os.toString();
   //System.out.println("servlet 输出流:str:" + str);
   final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
   HttpServletResponse rep = new HttpServletResponseWrapper(response) {
    public ServletOutputStream getOutputStream() {
     return stream;
    }

    public PrintWriter getWriter() {
     return pw;
    }
   };
   // System.out.println("3333333333333333" );

   rd.include(request, rep);
   // // System.out.println("44444444444444444444444" );
   pw.flush();
  
   os.reset();
   byte[] b2 = str.getBytes();
   os.write(b2);
   FileOutputStream fos = new FileOutputStream(PName);

   os.writeTo(fos);
   fos.close();

   rep.sendRedirect(request.getContextPath() + "/html"
     + uri_new.substring(0, uri_new.lastIndexOf("/")) + "/" + name);

}

在该类中制定好HTML文件的命名规则,然后直接由Servlet的输出流生成该文件,最后跳转到该HTML中去。

(3)配置web.xml
<filter>
<filter-name>jspfilter</filter-name>
<filter-class>net.bolve.util.CacheFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>jspfilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>ToHtml</servlet-name>
<servlet-class>net.bolve.util.ToHtml</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ToHtml</servlet-name>
<url-pattern>/ToHtml</url-pattern>
</servlet-mapping>

4.3 小结
通过Filter比较方便地判断请求的URL是否已经被静态化了,对于没有静态化的请求URL跳转到Servlet里去生成HTML文件。其生成方式是直接由原始的请求得到的响应流生成。相比其他几种方式而言其好处有:
(1)判断更新方便,而且代码修改量小;
(2)针对不同的请求方便实现不同的静态化方案,便于管理;
(3)不过,重新生成时采用将生成的文件删除的方式,管理起来并不太方便。

  评论这张
 
阅读(888)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017