• 页面静态化是把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. python challenge - orc.py

    http://www.pythonchallenge.com/pc/def/ocr.html recognize the characters. maybe they are in the book, ...

  2. LoadRunner+Java接口性能测试

    想必各位小伙伴们会对LR还可以调用java感到好奇,之前我也这么一直认为LR只支持C语言.其实LR脚本支持的语言有:C.Java.Visual Basic.VbScript.JavaScript,只不 ...

  3. 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符

    string stra = "abcdefghijk";string strtempa = "c";string strtempb = "j" ...

  4. Android Framework 分析---2消息机制Native层

    在Android的消息机制中.不仅提供了供Application 开发使用的java的消息循环.事实上java的机制终于还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提 ...

  5. FZU2171:防守阵地 II(线段树)

     Problem Description 部队中总共同拥有N个士兵,每一个士兵有各自的能力指数Xi.在一次演练中,指挥部确定了M个须要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务.获得 ...

  6. C语言基础(15)-多文件编译

    一.头文件的使用 如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型.如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了 ...

  7. java计算两个日期相差多少天小时分钟等

    1.时间转换 data默认有toString() 输出格林威治时间,比如说Date date = new Date(); String toStr = date.toString(); 输出的结果类似 ...

  8. MVC-Model

    用模型取代字典理由: **使用字典的坏处 一般情况下,存入数据和取出数据都使用“字典类型的key”,编写这些key时,编译时不会有任何的友善提示,需要手敲,容易出错. dict[@“name”] = ...

  9. C/C++知识要点4——printf函数以及cout的计算顺序

    printf函数的计算顺序:先从右到左压栈,然后从左到右出栈. 例程: #include"stdio.h" int main() { int arr[] = { 1, 2, 3, ...

  10. Introdution to Spring Mobile

    1. In Eclipse, create a new Maven Project using the spring-mvc-jpa-archetype. 2. Add the spring-mobi ...