1、说明

页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面。

* 核心思路为拦截请求,实现请求转发指向静态页面。

* 静态化页面实现方法为自定义类继承HttpServletResponseWrapper,修改构造函数参数,并重写getWriter()方法,使其原本输出至浏览器额内容写入静态页面中
===============================

2、查看图书分类

我们先来写一个小例子,用来查看不同分类的图书。然后我们再去思考如何让动态页面静态化的问题。

index.jsp

<body>

<a href="<c:url value='/BookServlet'/>">全部图书</a><br/>

<a href="<c:url value='/BookServlet?category=1'/>">JavaSE分类</a><br/>

<a href="<c:url value='/BookServlet?category=2'/>">JavaEE分类</a><br/>

<a href="<c:url value='/BookServlet?category=3'/>">Java框架分类</a><br/>

</body>

BookServlet.java

public class BookServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

BookService bookService =new
BookService();

List<Book> bookList = null;

String param = request.getParameter("category");

if(param == null || param.isEmpty()) {

bookList = bookService.findAll();

} else {

int category = Integer.parseInt(param);

bookList = bookService.findByCategory(category);

}

request.setAttribute("bookList",
bookList);

request.getRequestDispatcher("/show.jsp").forward(request, response);

}

}

show.jsp

<table border="1" align="center" width="50%">

<tr>

<th>图书名称</th>

<th>图书单价</th>

<th>图书分类</th>

</tr>

<c:forEach items="${bookList }" var="book">

<tr>

<td>${book.bname }</td>

<td>${book.price }</td>

<td>

<c:choose>

<c:when test="${book.category eq 1}"><p style="color:red;">JavaSE分类</p></c:when>

<c:when test="${book.category eq 2}"><p style="color:blue;">JavaEE分类</p></c:when>

<c:when test="${book.category eq 3}"><p style="color:green;">Java框架分类</p></c:when>

</c:choose>

</td>

</tr>

</c:forEach>

</table>

===============================

3 分析

我们的目标是在用户第一次访问页面时生成静态页面,然后让请求重定向到静态页面上去。当用户再次访问时,直接重定向到静态页面上去。

我们需要为不同的请求生成静态页面,例如用户访问BookServlet?category=1时,我们要生成静态页面,当用户访问BookServlet?category=2时,也要生成静态页面。即不同的参数生成不同的静态页面!

我们可以使用category为key,静态页面的路径为value,保存到一个Map中,然后再把Map保存到ServletContext中。没有对应的静态页面时,我们生成静态页面,再重定向到静态页面,如果存在静态页面,那么直接重定向即可。

StaticResponse.java

public class StaticResponse extends HttpServletResponseWrapper {

private PrintWriter pw;

public StaticResponse(HttpServletResponse response, String filepath)

throws FileNotFoundException, UnsupportedEncodingException {

super(response);

pw = new PrintWriter(filepath,
"UTF-8");

}

public PrintWriter getWriter()
throws IOException {

return pw;

}

public void close() throws IOException {

pw.close();

}

}

StaticFilter.java

public class StaticFilter implements Filter {

private ServletContext sc;

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

String key ="key_" + request.getParameter("category");

Map<String,String> map = (Map<String, String>)sc.getAttribute("pages");

if(map == null) {

map = new HashMap<String,String>();

sc.setAttribute("pages", map);

}

if(map.containsKey(key)) {

res.sendRedirect(req.getContextPath() + "/staticPages/" + map.get(key));

return;

}

String html = key +".html";

String realPath =sc.getRealPath("/staticPages/"
+ html);

StaticResponse sr =new StaticResponse(res,
realPath);

chain.doFilter(request, sr);

sr.close();

res.sendRedirect(req.getContextPath() +"/staticPages/"
+ html);

map.put(key, html);

}

public void init(FilterConfig fConfig) throws ServletException {

this.sc = fConfig.getServletContext();

}

}

JavaWeb笔记——利用过滤器实现页面静态化的更多相关文章

  1. JavaWeb 过滤器应用之页面静态化

    页面静态化是把servlet请求的资源所做输出保存到html中, 然后重定向到 html 页面, 二次访问时,这个html已经存在,那么直接重定向,不用再去访问servlet! // StaticFi ...

  2. php页面静态化技术;学习笔记

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 利用php的ob缓存机制实现页面静态化

    利用php的ob缓存机制实现页面静态化 首先介绍一下php中ob缓存常用到的几个常用函数ob_start():开启缓存机制ob_get_contents():获取ob缓存中的内容ob_clean()清 ...

  4. Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter

    上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能.后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现 Asp.Net ...

  5. Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter

    由于公司现在所采用的是一套CMS内容管理系统的框架,所以最近项目中有一个需求提到要求实现页面静态化的功能.在网上查询了一些资料和文献,最后采用的是小尾鱼的池塘提供的 利用ResultFilter实现a ...

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

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

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

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

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

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

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

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

随机推荐

  1. 读:HIS 与医保系统的接入方案及实现

    HIS 与医保系统的接入方案及实现刘剑锋 李刚荣第三军医大学西南医院信息科(重庆 400038) 医院HIS和医保系统的接口设计方案涉及两个部分,分别由医院和医保中心分别完成相,应的程序设计,这两部分 ...

  2. activemq整合spring

  3. P1233: [Usaco2009Open]干草堆tower

    这道题,首先想到的就两个,一是贪心,二是动规,然而 1<=N<=100000;1<=w_i<=10000 的数据范围实在不敢恭维,所以说第一想法是错的.仔细一想,首先,我们需要 ...

  4. Liunx0000(初步认识)

    都要放假了,学习一下吧,毕竟还有课设,虽然我真的懒得看Linux,不想接触这破玩意!各应人的东西! 一.发展趋势 1\无操作系统阶段20s60 2\简单操作系统阶段 3\试试操作系统阶段 4\面向In ...

  5. Spring事务总结

    事务是什么? 事务就是用来解决类似问题,事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败,那么事务就会回滚到最开始的状态,仿佛什么都没有发生过.在企业级应 ...

  6. Careercup - Microsoft面试题 - 5684901156225024

    2014-05-10 23:45 题目链接 原题: Arrange the numbers in an array in alternating order. For example if the a ...

  7. Windows桌面开发者的必备软件

    如果你新安装好了一台WindowsXP或者Windows7的机器,作为一个开发人员,我建议安装下面这些软件: 1,WinMerge. http://winmerge.org/ 2, Lua for w ...

  8. Orchard中文学习视频录制完成

    Orchard学习视频已登录百度传课: http://www.chuanke.com/3027295-124882.html http://pan.baidu.com/s/13zc0u 1.orcha ...

  9. Notes on the Dirichlet Distribution and Dirichlet Process

    Notes on the Dirichlet Distribution and Dirichlet Process In [3]: %matplotlib inline   Note: I wrote ...

  10. SQLServer中查询的数字列前面补0返回指定长度的字符串

    SQLServer中查询的数字列前面补0返回指定长度的字符串: 如: 角本如下: /****** Script for SelectTopNRows command from SSMS ******/ ...