Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
注:本章讲的是Spring2的@Deprecated,但还是有必要提一下。跟我学SpringMVC系列。。
package org.springframework.web.servlet.mvc;public interface Controller { ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;}?
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {//委托给WebContentGenerator进行缓存控制checkAndPrepare(request, response, this instanceof LastModified);//当前会话是否应串行化访问.if (this.synchronizeOnSession) {HttpSession session = request.getSession(false);if (session != null) {Object mutex = WebUtils.getSessionMutex(session);synchronized (mutex) {return handleRequestInternal(request, response);}}}return handleRequestInternal(request, response);}
public class HelloWorldController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {//1、收集参数//2、绑定参数到命令对象//3、调用业务对象//4、选择下一个页面ModelAndView mv = new ModelAndView();//添加模型数据 可以是任意的POJO对象mv.addObject("message", "Hello World!");//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面mv.setViewName("hello");return mv;}}
public class HelloWorldController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {//1、收集参数//2、绑定参数到命令对象//3、调用业务对象//4、选择下一个页面ModelAndView mv = new ModelAndView();//添加模型数据 可以是任意的POJO对象mv.addObject("message", "Hello World!");//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面mv.setViewName("hello");return mv;}}
<!— 在chapter3-servlet.xml配置处理器 --><bean name="/hello" name="code">public class HelloWorldWithoutReturnModelAndViewController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {resp.getWriter().write("Hello World!!");//如果想直接在该处理器/控制器写响应 可以通过返回null告诉DispatcherServlet自己已经写出响应了,不需要它进行视图解析return null;}}
?<!— 在chapter3-servlet.xml配置处理器 -->
<bean name="/helloWithoutReturnModelAndView" name="code"><!— 在chapter3-servlet.xml配置处理器 --><bean name="/helloWithPOST" value="POST"></property></bean>
?以上配置表示只支持POST请求,如果是GET请求客户端将收到“HTTP Status 405 - Request method 'GET' not supported”。
<!— 在chapter3-servlet.xml配置处理器 --><bean name="/helloRequireSession" value="true"/></bean>?
package cn.javass.chapter3.web.controller;//省略importpublic class HelloWorldCacheController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {//点击后再次请求当前页面resp.getWriter().write("<a href=''>this</a>");return null;}}
?<!— 在chapter3-servlet.xml配置处理器 -->
<bean name="/helloCache" value="5"/></bean>?
<bean name="/helloNoCache"value="0"/></bean>
public class HelloWorldLastModifiedCacheController extends AbstractController implements LastModified {private long lastModified;protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {//点击后再次请求当前页面resp.getWriter().write("<a href=''>this</a>");return null;}public long getLastModified(HttpServletRequest request) {if(lastModified == 0L) {//TODO 此处更新的条件:如果内容有更新,应该重新返回内容最新修改的时间戳lastModified = System.currentTimeMillis();}return lastModified;}}?
<bean name="/helloLastModified" alt="Spring Web MVC中的页面缓存支持 ——跟小弟我学SpringMVC系列" src="/img/2012/06/25/1134311408.bmp">
<filter> <filter-name>etagFilter</filter-name> <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class></filter><filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>chapter3</servlet-name></filter-mapping>
protected String generateETagHeaderValue(byte[] bytes) {StringBuilder builder = new StringBuilder("\"0");DigestUtils.appendMd5DigestAsHex(bytes, builder);builder.append('"');return builder.toString();}?
?
bytes是response要写回到客户端的响应体(即响应的内容数据),是通过MD5算法计算的内容的摘要信息。也就是说如果服务器内容不发生改变,则ETag每次都是一样的,即服务器端的内容没有发生改变。
?
此处只列举了部分缓存控制,详细介绍超出了本书的范围,强烈推荐:?http://www.mnot.net/cache_docs/(中文版http://www.chedong.com/tech/cache_docs.html)?详细了解HTTP缓存控制及为什么要缓存。
?
缓存的目的是减少相应延迟?和?减少网络带宽消耗,比如css、js、图片这类静态资源应该进行缓存。
实际项目一般使用反向代理服务器(如nginx、apache等)进行缓存。
?
1 楼 xiaoxichina 2012-06-06 大佬,MVC系列什么时候出?你的blog现在就是我学习spring的标准教材啊。。。