关于改造动态网站为生成静态页的方案
发布日期:2021-09-18 01:36:50 浏览次数:4 分类:技术文章

本文共 5938 字,大约阅读时间需要 19 分钟。

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

 

 

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可以改造成生成目录和文件过期时间可配的.来实现改造现有网站的静态化方案.

转载地址:https://blog.csdn.net/yuezu1026/article/details/4548545 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:大型网站采用什么系统架构保证性能稳定性
下一篇:多节点的分布式Mecache的java客户端的使用体会

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月28日 22时41分46秒