• 页面静态化是把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. 命名空间System.Configuration中不存在类型或命名空间名称ConfigurationManager

    C#连接数据库时.这是个非经常见的错误,我刚開始就直接using System.Configuration;还是没能解决,真相是要手动加入这个程序集的引用,在项目右键加入引用选择System.Conf ...

  2. 架构师-盛大许式伟VS金山张宴

    许式伟:作为系统架构师,您一般会从哪些方面来保证网站的高可用性(降低故障时间)? 张宴:很多因素都会导致网站发生故障,从而影响网站的高可用性,比如服务器硬件故障.软件系统故障.IDC机房故障.程序上线 ...

  3. Hackerrank - Game Of Rotation 题解

    旋转一个数组以得到最大值. 陷阱就是:不能排序.须要模拟操作旋转,并设计公式计算旋转后的和. 要求是O(n)时间完毕. 原题: https://www.hackerrank.com/challenge ...

  4. 转: android emulator 命令详解

    在命令行输入: emulator -help,即可显示emulator支持的所有命令. Android Emulator usage: emulator [options] [-qemu args] ...

  5. Atitit.atijson 类库的新特性设计与实现 v3 q31

    Atitit.atijson 类库的新特性设计与实现 v3 q31 1. V1版本---集成了多引擎1 2. V2版本新特性 --bsh脚本化2 3. V3版本新特性---循环引用解决使用fastjs ...

  6. osd char

    osdchar.c #include<stdio.h> #include "TimeNewRoman.h" #define TNR 0x00 //Time New Ro ...

  7. shell脚本中多命令单行执行_转

    多命令一起执行 如果希望把几个命令合在一起执行, shell提供了两种方法.既可以在当前shell也可以在子shell中执行一组命令. 对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的 ...

  8. Git使用技巧(3)-- 远程操作

    Git远程操作详解 作者: 阮一峰 编辑更新:shifu204 日期: 2016年9月1日 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操 ...

  9. 如何使用 TP中的公共函数 (定义在common/common.php中的函数)

    如何使用 TP中的公共函数 (定义在common/common.php中的函数) (2011-09-30 15:32:09) 转载▼ 标签: 杂谈   1.在common/common.php 中有个 ...

  10. 前端webview开发中遇到的一些问题及其解决方法

    最近做了一个webview中的兑换页面,本来以为很简单,想不到遇到了远远超出预期数量的BUG,记下来,以备后患. 1 inline-block元素折行 BUG描述:现在我有三个DIV,要在一列等宽排列 ...