`

通过urlrewrite和filter实现动态网站生成静态页并缓存的方案

    博客分类:
  • java
阅读更多

关于改造动态网站为生成静态页的方案

 

 

<!----><!----> <!---->

url 重写的好处 :

<!---->一, <!---->可以方便的实现对化化引擎的优化,并且比生成静态 更加方便。

<!---->二, <!---->占空间比较小。

<!---->三, <!---->首页每天都自动变化,不用维护。


1. 通过urlrewrite 进行静态页生成及缓存. http://tuckey.org/urlrewrite/ 下载.
2. 添加urlrewrite.xml配置文件到webroot/WEB-INF/下;添加urlrewrite-XXX.jar到webroot/WEB-INF/lib下;
3. 修改urlrewrite.xml为
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
        "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<urlrewrite>

    <rule>
        <from>^/index.html$</from>
        <to>/index.jsp</to>
    </rule>
   
    <rule>
        <from>^/product/detail-([0-9]+)\.html$</from>
        <to>/controler/PageControler?param=chan1=$1&page=productDetail.do</to>
    </rule>
<rule>
        <from>^/catalog/list-p-([0-9]+)-([0-9]+)\.html$</from>
        <to>/controler/PageControler?param=cataId=$1_cur=$2&page=productCatalogList.do</to>
    </rule>

    <outbound-rule>
        <from>/index.jsp</from>
        <to>index.html</to>
    </outbound-rule>


</urlrewrite>
关于urlrewrite的配置参见urlrewrite相关doc.
4. 新建过滤器HtmlCatchFilter用来检查静态页
import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HtmlCatchFilter implements Filter {

// 定义公用变量
public final static String staticRootUrl = "/WEB-INF/staticdoc/";
public final static String webroot = "D:/webroot";
public final static long overtime = 1000 * 60;// 一分钟为过期时间

public void destroy() {
System.out.println(getClass().getName() + "  destroy!");
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(getClass().getName() + " doFilter!");

String param = request.getParameter("param");
System.out.println("参数集合:" + param);

String page = request.getParameter("page");

String newUrl = page + "_" + param + ".html";

File file = new File(webroot + staticRootUrl + newUrl);
if (file.exists()) {
System.out.print("文件最后修改时间:");
System.out.println(new Date(file.lastModified()));
long lastModified = file.lastModified();
long currently = System.currentTimeMillis();
System.out.println(new Date(currently));
System.out.println("lastModified:" + lastModified + "|currently:"
+ currently + "|时间差:" + (currently - lastModified));
if (currently - lastModified > overtime) {
System.out.println("静态文件" + newUrl
+ "过期!转到PageControlerServlet进行生成");
chain.doFilter(request, response);
}
System.out.println("静态文件存在,并且是可用的,转到静态文件" + staticRootUrl + newUrl);
request.getRequestDispatcher(staticRootUrl + newUrl).forward(
request, response);
} else {
System.out.println("静态文件" + newUrl
+ "不存在!转到PageControlerServlet进行生成");
chain.doFilter(request, response);
}

}

public void init(FilterConfig arg0) throws ServletException {
System.out.println(getClass().getName() + " init!");

}

}

5. 新建servlet,用来生成静态页.
PageControlerServlet.java
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class PageControlerServlet implements Servlet {

public void destroy() {
System.out.println(getClass().getName() + " destroy");
}

public ServletConfig getServletConfig() {
System.out.println(getClass().getName() + " getServletConfig");
return null;
}

public String getServletInfo() {
System.out.println(getClass().getName() + " getServletInfo");
return null;
}

public void init(ServletConfig arg0) throws ServletException {
System.out.println(getClass().getName() + " init");

}

public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println(getClass().getName() + " service");
System.out.println("param="+request.getParameter("param"));
//通过此servlet来进行静态文件的生成和有效性检查.
System.out.println("=======进行生成静态文件处理,生成结束并转到静态页");

String param = request.getParameter("param");
System.out.println("参数集合:" + param);


String page = request.getParameter("page");

String newUrl =  page +"_"+param+".html";


String newFileName = HtmlCatchFilter.webroot+HtmlCatchFilter.staticRootUrl+newUrl;

String str = "生成的新的静太文件内容";
String params = param.replace('_', '&');
System.out.println("请求动态参数:"+params);

str = str + "请求:"+page+"?"+params+"取得页面内容";

FileOutputStream fos = new FileOutputStream(newFileName);
Writer out = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(out);
// 将字符串写入文件
bw.write(str);
bw.flush();// 将数据更新至文件
fos.close();// 关闭文件流
System.out.println("生成新的文件结束,并转向静态文件!");
request.getRequestDispatcher(HtmlCatchFilter.staticRootUrl+newUrl).forward(request, response);
}

}


6. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 
  <!-- UrlRewriteFilter config start -->
  <filter>                                      
     <filter-name>UrlRewriteFilter</filter-name>
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
  </filter>              
  <filter-mapping>       
     <filter-name>UrlRewriteFilter</filter-name>                             
     <url-pattern>*.html</url-pattern>                          
  </filter-mapping>
  <!-- UrlRewriteFilter config end -->
 
  
 
  <!-- HtmlCacheFilter config start -->
  <filter>
    <filter-name>HtmlCacheFilter</filter-name>
    <filter-class>HtmlCatchFilter</filter-class>      
  </filter>
  <filter-mapping>   
    <filter-name>HtmlCacheFilter</filter-name>      
    <url-pattern>/controler/*</url-pattern>                               
<dispatcher>FORWARD</dispatcher>                             
  </filter-mapping>
<!-- HtmlCacheFilter config end -->

  <servlet>
    <servlet-name>PageControlerServlet</servlet-name>
    <servlet-class>PageControlerServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>PageControlerServlet</servlet-name>
    <url-pattern>/controler/PageControler</url-pattern>
  </servlet-mapping>
</web-app> 
7. 测试;
访问http://localhost/catalog/list-p-1-2.html  在/WEB-INF/staticdoc/目录下生成productCatalogList.do_cataId=1_cur=2.html 静态文件,扩展上边demo可以改造成生成目录和文件过期时间可配的.来实现改造现有网站的静态化方案.

 

 

分享到:
评论
2 楼 aning543 2009-07-25  
在刷新周期60秒之后, 在次访问报:Cannot forward after response has been committed
在传递过滤器链之后return,让PageControlerServlet重新生成静态文件
1 楼 surpass_li 2008-10-13  
添加squid缓存和urlrewrite伪静态配合也可以实现优化的目的。

相关推荐

Global site tag (gtag.js) - Google Analytics