您的位置:首页 > 运维架构 > 网站架构

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

2009-09-13 16:56 281 查看
关于改造动态网站为生成静态页的方案

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可以改造成生成目录和文件过期时间可配的.来实现改造现有网站的静态化方案.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: