• 页面静态化是把servlet请求的资源所做输出保存到html中, 然后重定向到 html 页面,

    二次访问时,这个html已经存在,那么直接重定向,不用再去访问servlet!
// StaticFilter
public class StaticFilter implements Filter{
private FilterConfig config; public void destory(){}
public void init(FilterConfig fConfig) throws ServletException{
this.config = fConfig;
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException{ /*
* 思路:
* 1. 第一次访问时,查找请求对应的html页面是否存在,如果存在,则重定向到html;
* 2. 如果不存在,放行! 把 servlet 访问数据库后,输出给客户端的数据保存到一个
* html文件中, 在重定向到html
*
* 获取 Category 参数!
* Category有四种可能:
* null 对应 null.html
* 1 对应 1.html
* 2 对应 2.html
* 3 对应 3.html
*
* html 页面的保存路径: htmls 目录下
*/ // 判断对应的 html 文件是否存在, 如果存在,直接重定向! HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response; String category = request.getParameter("category"); // 获取对应的文件名
String htmlPage = category + ".html"; //得到文件的存放目录
String htmlPath = config.getServletContext().getRealPath("/htmls"); // 创建文件
File destFile = new File(htmlPath,htmlPage); // 如果该文件存在
if(destFile.exists()){
response.sendRedirect(request.getContextPath()+"/htmls/"+htmlPage);
return;
} /*
* 如果该文件不存在, 生成html
* 首先放行, show.jsp 会做出很多的输出, 我们要让它不再输出给客户端, 而是输出给我们指定
* 的一个 html 文件中
*
* 调包 response, 让它的 getWriter() 与一个html 文件绑定, 那么 show.jsp 的输出就到了
* html 文件中
*/ StaticResponse sr = new StaticResponse(resp,destFile.getAbsolutePath()); // 放行, 即生成了html 文件
chain.doFilter(request,sr); // 这时,页面已经存在, 重定向到html文件
res.sendRedirect(req.getContextPath()+"/htmls/"+htmlPage);
}
} // response 的装饰类, StaticResponse.java
public class StaticResponse extends HttpServletResponseWrapper {
private HttpServletResponse response;
private PrintWriter pw; // 参数 path, 表示 html 文件的路径
public StaticResponse(HttpServletResponse response, String path)
throws FileNotFoundException {
super(response);
this.response = response; // 创建一个与html文件路径绑定在一起的流对象
pw = new PrintWriter(path, "utf-8");
} // 增强的方法
public PrintWriter getWriter(){
// 返回一个与html绑定在一起的 printWriter 对象
// jsp 会使用它进行输出, 这样数据都输出到 html 文件中
return pw;
}
}

参考资料:

JavaWeb 过滤器应用之页面静态化的更多相关文章

  1. JavaWeb笔记——利用过滤器实现页面静态化

    1.说明 页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面. * 核心思路为拦截请求,实现请求转发指向静态页面 ...

  2. JavaWeb页面静态化之使用freemarker模板生成一个html静态页面

    题外话:       页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...

  3. MVC页面静态化

    MVC 页面静态化   最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...

  4. MVC 页面静态化

    最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc提供的过滤器扩展点实现页 ...

  5. 利用ResultFilter实现asp.net mvc 页面静态化

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  6. ASP.NET MVC中,动态处理页面静态化

    首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...

  7. ASP.NET MVC中,动态处理页面静态化 【转载】

    首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...

  8. 利用ResultFilter实现asp.net mvc3 页面静态化

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  9. freemark 页面静态化

    1. 页面静态化是什么? 页面静态化有非常多含义,在WEB开发中.静态网页一般理解为站点中大部分超级链接所引用的页面是单独的HTML静态页面文件(如.htm..html等页面文件,html语言本身是静 ...

随机推荐

  1. Pycharm 安装scrapy

    因为scrapy需要依赖第三方的包,所以直接使用Pycharm安装Scrapy包无法安装成功.网上已经有很多使用cmd安装scrapy的优秀教程,此处不再介绍. 基于下图所示的结构之下向上即可完成sc ...

  2. JavaScript在IE浏览器和Firefox浏览器中的差异总结

    JavaScript在IE浏览器和Firefox浏览器中存在一些差异,以下对这些差异部分进行了总结,以及解决方案: 1.HTML对象的 id 作为对象名的问题 IE:HTML 对象的 ID 可以作为 ...

  3. CentOS-6.*安装配置SVN

    安装说明 系统环境:CentOS-6.3 安装方式:yum install (源码安装容易产生版本兼容的问题) 安装软件:系统自动下载SVN软件 检查已安装版本 #检查是否安装了低版本的SVN [ro ...

  4. asp.net mvc 4多级area实现技巧

    今天在工作要实现这个多级area.其原因是这个项目需要多级的功能,大的类别里有小的类别,小的类别里有具体的功能项,每一个功能项还有若干动作Action,所以在菜单和mvc工程的结构上都需要有体现多级的 ...

  5. 利用python拼接图片

    问题描述: 将16张图片拼接成4x4的图片, 且不改变每单张图片的像素值. 代码如下: import os from PIL import Image path = '/share1/home/con ...

  6. leetCode 30.Substring with Concatenation of All Words (words中全部子串相连) 解题思路和方法

    Substring with Concatenation of All Words You are given a string, s, and a list of words, words, tha ...

  7. linq基础,正则表达式,.net相关

    声明扩展方法的步骤:类必须是static,方法是static,第一个参数是被扩展的对象,前面标注this.使用扩展方法的时候必须保证扩展方法类已经在当前代码中using.  LINQ:将int数组中大 ...

  8. Java并发编程(十四)并发容器类

    同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低. 另一个方面,并发容器是针对多个线程并发访问设计的.在java 5 ...

  9. hash和encrypt区别及应用_转

    转自:哈希(Hash)与加密(Encrypt)的基本原理.区别及工程应用 0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理 ...

  10. plsql programming 20 管理PL/SQL代码(个人感觉用不到)

    这一章的内容, 只完成了一部分, 剩下的用到再补充吧 由于依赖关系, 而编译失败, 需要重新编译. ( 所谓依赖, 是指存储过程, 函数等在运行中调用的对象, 比如table 等, 比如你删除了过程中 ...