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. maven属性

    Maven内置了三大特性:属性.Profile和资源过滤来支持构建的灵活性. 内置属性:主要有两个常用内置属性 ${basedir}表示项目根目录,即包含pom.xml文件的目录 ${version} ...

  2. JPA学习---第十节:JPA中的一对一双向关联

    1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.pe ...

  3. 四则运算(2)之软件单元测试:Right-BICEP

    一.Right-BICEP主要测试以下几方面的问题: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制 ...

  4. ueditor:原谅我这一生不羁放纵爱独特

    客户指明道姓需要使用百度编辑器,好吧,虽然自从李彦宏把一个好好的千千静听搞得节操尽碎之后,我就对百度的东西毫无好感,但是客户是上帝嘛,不就一个文本编辑器嘛,弄之,始料未及的是,就是这样一个简单的文本编 ...

  5. Careercup - Microsoft面试题 - 5752271719628800

    2014-05-10 20:31 题目链接 原题: Given an array of integers and a length L, find a sub-array of length L su ...

  6. 使用log4javascript记录日志

    1.定义log4js服务类,用于初始化log4javascript相关参数 log4jsService.js //启用javascript 日志功能 var logger = log4javascri ...

  7. Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏

    #include<iostream> #include<cstdio> #include<algorithm> #define Max 1005 using nam ...

  8. datepicker,结束时间必须大于开始时间

    $('#js-start-time').datepicker({ dateFormat:'yy-mm-dd', onSelect: function( startDate ) { var $start ...

  9. ASP.NET - 演练:创建网页以显示 XML 数据

    数据通常是以 XML 格式提供给 Web 应用程序的.但是,XML 数据本质上是分层的,因此您可能希望能够在基于列表的控件中使用 XML 数据,如 GridView 或 DropDownList 控件 ...

  10. 关于JS中的constructor与prototype

    ======================================================================== 在学习JS的面向对象过程中,一直对constructo ...