Servlet与缓存设置的方法



为什么要设置缓存
• 一个网站往往会有很多的静态web资源,例如,html页面、css文件、jpg图片等,这些资源一旦创建可能永远不会改变

• 如果客户端每次访问网站时都下载一次静态web资源,这样不但会造成服务器的压力增大,用户的体验也一定不好

• 一般来讲,我们在用户第一次访问网站时,将静态web资源发给客户,并通知客户将内容缓存起来,方便下次访问时使用

l 缓存的实现方式
• 设置合理的缓存时间response.setDateHeader(“Expires”, 时间值);

这种方式,对于超链接有效,但对于直接刷新无效。
// 设置一个缓存时间
response.setDateHeader(“expires”, System.currentTimeMillis() + 1000*60*60*2);


重写HttpServlet的getLastModified方法
HttpServlet的getLastModified方法默认返回-1。
在HttpServlet的service方法中,首先会调用getLastModified方法,判断返回值是否为-1,从而获知子类是否重写此方法。
如果不是-1,说明子类重写了该方法,此时就会获取浏览器发送过来的If-Modified-Since时间值,用此时间值和方法的返回值进行比较,判断文件是否更新,如果没有更新,就发送304状态码,让用户去拿缓存

这种方式不是很常用,因为默认的servlet已经重写了getLastModified方法了。
实际上,我们访问的是哪个缺省的servlet,以它为基础来访问相关的网页?
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置一个缓存时间
response.setDateHeader(“expires”, System.currentTimeMillis() + 1000*60*60*2);
// 将1.html给用户看
InputStream in = getServletContext().getResourceAsStream(“1.html”);
OutputStream out = response.getOutputStream();

int len;
byte[] buf = new byte[1024];
while((len=in.read(buf))>0)
out.write(buf, 0, len);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

// 重写父类的getLastModified方法
@Override
protected long getLastModified(HttpServletRequest request) {
// 到底该返回什么
// 应该返回文件的最后修改时间
// 1.html如果修改了就发送,如果没修改发304让用户去拿缓存
String path = getServletContext().getRealPath(“1.html”);
File file = new File(path);
long lastModified = file.lastModified(); // 返回文件的最后修改时间
return lastModified;
}