缓存静态页面

原创 2013年07月19日 09:19:05

描述:当用户访问一个网站的静态页面的时候,有时会查询数据库,但访问的时候过多,就会对服务器产生很大的压力。因此,对于一些不经常改变的静态页面,就可以查询一次数据库后,缓存在客户端,当客户再次访问的时候就不用查询数据库了。

public class CmsFilter extends HttpFilter {
	@Override
	public void doFilter(HttpServletRequest request,
			HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 拦截请求,获得用户访问的id
		String id = request.getParameter("id");
		// 创建本地的文件
		// 相对于web应用的path  
		String webPath = "/WEB-INF/books/book"+id+".html";	
		// 通过相对路径获得绝对路径
		ServletContext application = request.getSession().getServletContext();	
		String path = application.getRealPath(webPath);
		//判断当前要看的书的页面是否已经缓存为静态页面
		File file = new File(path);
		//如果已有就直接要求用户找缓存
		//如果没有就去创建,但是当网站修改了数据,用户还只能看到静态页面,所以在修改数据的servlet中不仅要携带id这个参数
		//还要带上一个flush这个参数以作区分是修改带来的参数。这样才能证明数据修改了,再去重新缓	存静态页面。
		if(!file.exists() || "true".equals(request.getParameter("flush"))) {
			// 对response进行包装
			MyResponse myResponse = new MyResponse(response, file);
			// 放行后 servlet做数据查询  jsp做数据显示
			chain.doFilter(request, myResponse);
		}
		// 无论如何 到此处就有静态页面了,  转发静态的html页面给ie
		request.getRequestDispatcher(webPath).forward(request, response);
	}
}

//包装response的getWriter方法
class MyResponse extends HttpServletResponseWrapper {
	private File file;
	//让一个request对应一个流
	private PrintWriter pw;
	//由于getWriter方法会调用两次写数据调用一次,tomcat关流的时候又会调用一次getWriter
	//调用两次会创建两次文件,这样第一次的文件还没写出缓冲器就给覆盖了。因此要传过来。
	public MyResponse(HttpServletResponse response, File file) {
		super(response);
		this.file = file;
	}
	//对getWriter方法进行包装,让其不写到IE浏览器,而是写到一个静态页面中
	public PrintWriter getWriter() throws IOException {
		//先创建必要的文件夹再创建文件,这样就不会创建失败了。
		//创建这个目录以及所有需要的父级目录,由于和这个file是我们自己创建出来的,没有就创建。
		file.getParentFile().mkdirs();
		//创建一个文件
		file.createNewFile();
		// 判断一下  如果pw为null,说明当前response.getWriter()首次被调用  文件流还没有创建, 此时需要创建新流
		// 如果 pw不为null,说明 当前 response 已经包含了 流    可以直接返回此流
		if(pw==null){
			//通过OutputStreamWriter设置编码,防止乱码出现
			pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8"));
		}
		return pw;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

学习MVC之租房网站(十二)-缓存和静态页面

在上一篇学习了Quartz的使用、发邮件,并将通过UEditor上传的图片保存到云存储。在项目的最后,再学习优化网站性能的一些技术:缓存和页面静态化。 使用缓存可以降低数据库的压力,而使用页面静态化...

ob静态页面缓存

index.php

普通静态页面缓存

index.php

PHP使用缓存生成静态页面

静态网址与动态网址 ①    静态网址   http://localhost/test2.html   ②    动态网址 http://localhost/showNews.php?id...

nginx设置静态页面压缩缓存和过期时间

之前一直没有整理成blog,只是有笔记,今天正好整理了一下,希望对朋友们有帮助!!! 使用nginx服务器的朋友可能都知道需要设置html静态页面缓存与页面压缩与过期时间的设置了,下面我来给各位同学...

Varnish+ESI实现静态页面的局部缓存

页面静态化是搭建高性能网站必用的招式之一,页面静态化可以有效提升系统响应速度,同时也有利于搜索引擎优化。但在页面静态化后,静态页面之间包含(例如所有的静态页面包含页头、页脚)以及静态页面中的局部信息的...

使用Varnish+ESI实现静态页面的局部缓存

页面静态化是搭建高性能网站必用的招式之一,页面静态化可以有效提升系统响应速度,同时也有利于搜索引擎优化。但在页面静态化后,静态页面之间包含(例如所有的静态页面包含页头、页脚)以及静态页面中的局部信息的...

Dajngo19-缓存与静态页面

一般来说我们用 Django 来搭建一个网站,要用到数据库等。 1 2 3 4 5 from django.shortcuts im...
  • opera95
  • opera95
  • 2017年06月14日 20:51
  • 123

在动态页面里象静态页面一样控制整个网页的缓存和更新

静态页面我们都知道,WEB服务器在发回文件内容时会附带一个Last-Modified头信息,把静态文件的最后修改时间存储在里面,这样当下次浏览器请求该文件时,会把得到的这个Last-Modified头...
  • wxw_317
  • wxw_317
  • 2015年11月19日 14:42
  • 1006

php处理静态页面:页面设置缓存时间

通过php去生成一个纯静态的页面: http://blog.csdn.net/github_26672553/article/details/72876752问:如何触发系统生成纯静态化页面? ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:缓存静态页面
举报原因:
原因补充:

(最多只允许输入30个字)