动态缓存访问的html页面,过滤器实现

需求:例如买书网站,有成千上万本图书,用户可以点击图书的链接查看图书的详细信息,但如果每一次查看都要访问数据库的话,就会造成资源的极大浪费,为了节约我们有限的资源,应该当用户访问时,如果是第一次访问,则查询数据库,通过过滤器的方式产生缓存文件,如果下一次任何用户再访问这个图书的详细信息,如果这本书的信息没有修改,则直接把这个静态html页面给用户看,就不查询数据库了,有效的解决了资源浪费问题。

 

思路:

1,在页面上建立图书的超链接,链接到一个servlet,这个servlet根据当前图书的id去数据库查询相应的信息,返回给用户显示。

2,(核心)写一个Filter拦截器,拦截这个根据id查询数据库的servlet,那么每次查询图书的详细信息的时候,都会被这个Filter拦截下来,

3,(核心)我们希望的是在浏览器返回信息的时候不是将数据输出到浏览器,而是写到一个静态html页面中,如何实现呢?可以采用包装设计模式思想,我们需要将response中的getWriter方法重新定义,getWriter方法返回的是一个输出流,默认返回的是输出到浏览器的流,我们只要将他改为输出到文件就可以了,

4,包装:定义一个类继承HttpServletResponseWrapper类,这个类实现了HttpServletResponse的所有抽象内容,但都只是调用HttpServletResponse中的原始方法,我们只要将其getWriter方法重写即可。使之返回一个文件流对象,输出到WebRoot下的pages文件夹对应的图书信息静态html中即可,

5,以后用户每次要查看这本书的信息的时候,会被这个Filter拦截,拦截器会首先检查需求访问的页面是否存在,如果已经存在,则直接转发到这个静态页面,如果不存在,则使用自定义的类,将自定义的response对象作为doFilter的参数放行,则会将访问的页面显示到浏览器,转发到静态html页面的动作是无论如何都要做的,因为用户要查看图书信息,必须显示到浏览器上。

1,  在管理员修改了图书信息后,硬盘上的静态文件也需要改变,在修改的servlet最后,直接重定向到这个查询图书信息的servlet上即可,但是在地址后面要跟上一个参数信息——ture,通知查询图书信息的servlet信息以改变,在这个servlet判断是否有缓存文件的时候,还要获取这个是否修改的信息如果为true,也要重新生成页面,以保证用户看到的最新的信息。