Spring MVC 支持HTTP协议的 Last-Modified 缓存机制。
@Controller
public class UserCacheController extends AbstractController implements LastModified{
private long lastModified = System.currentTimeMillis();
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
List<User> userList = new ArrayList<User>();
userList.add(new User("zhangsan", 18));
userList.add(new User("wangwu", 16));
System.out.println("执行一次,我有缓存");
return new ModelAndView("userList", "users", userList);
}
@Override
public long getLastModified(HttpServletRequest request) {
//时间戳逻辑,返回最后修改时间,例如
if (lastModified == 0L) {
lastModified = System.currentTimeMillis();
}
System.out.println("时间戳:"+lastModified);
return lastModified;
}
}
Spring MVC 提供的Last-Modified机制的支持,只需要实现LastModified接口,并实现GetLastModified() 方法,每次修改资源的时候,更新下lastModified的值即可。
<%@page import="java.util.List"%>
<%@page import="cn.com.infcn.bean.User"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
List<User> userList = (List<User>) request.getAttribute("users");
for (User user : userList) {
%>
用户名:<%=user.getUserName()%><br /> 年龄:<%=user.getAge()%><br />
<hr>
<%
}
%>
</body>
</html>
只有第一次执行了Controller,以后访问都没执行Controller。
通过handler的适配器类,然后在调用UserCacheController.getLastModified() 方法获取最后更新时间。
Paste_Image.png
通过浏览器F12 可以看出:
并不是所有MappingHandler 方式都支持缓存。 比如:DefaultAnnotationHandlerMapping 就不支持缓存机制。 因为支持注解的Controller中可以有多个请求方法,而每个方法都需要计算文件的最后修改时间,这样LastModified就不适用了。只适用一个Controller中只支持一个请求的HandlerMapping。
从代码中可以看出,这个方法永远返回-1。