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. JAVA栈实例—括号匹配

    import java.util.Stack; public class test { public static void main(String[] args){ System.out.print ...

  2. P1689: [Usaco2005 Open] Muddy roads 泥泞的路

    水题,模拟就行了,别忘了L>=r的时候直接更新下一个的L然后continue type node=record l,r:longint; end; var n,l,i,ans:longint; ...

  3. SQL Server 2008 没有可用于 charge_sys_Log.LDF 的编辑器

    因为上网问题重新装了系统.今天在整 SQL Server  的时候出现了这样一个问题. 因为之前装 SQL Server  的时候没有遇到过这种情况,感觉很新奇.所以详细的记录一下,希望对别人能有一定 ...

  4. self.a 和 _a 的区别

    在OC中我们可以通过指令@property定义属性. OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些. 一般定义属性的方法如下,在Class Test中定义属性i ...

  5. JQuery 对 Select option 的操作---转载

    <select id="selectID" > <option value="1">1</option> <optio ...

  6. Socket的双网卡收发(C#)

    最近的一个项目中需要同时使用两块网卡收发UDP组播数据包,并且要求使用Socket的方式接收和发送网络数据包(我不会告诉你们我之前是直接使用SharpPcap来实现的).在C#中Socket接触的比较 ...

  7. 也发一个自己实现的android简单文件选择器代码。支持多卡,排序

    一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡..并且实现了排序效果. 只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录. 利用Co ...

  8. 【Populating Next Right Pointers in Each Node II】cpp

    题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...

  9. Netsharp快速入门(之18) 平台常用功能(工作区相关)

    作者:秋时  转载须说明出处 第6章     平台功能 6.1     部件二次开发设置 6.1.1  工具栏管理 1.从单据二次开发-工具栏管理进入 2.主要设置显示,对应的方法名或设置权限相关操作 ...

  10. python-面向对象(股票对象举例)

    股票对象实例 class Stock(object): def __init__(self,stockCode ,stockName,averagePrice_yesterday,averagePri ...