读书人

Spring Web MVC中的页面缓存支持

发布时间: 2012-06-26 10:04:13 作者: rapoo

Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列



注:本章讲的是Spring2的@Deprecated,但还是有必要提一下。跟我学SpringMVC系列。。

4.2、Controller接口

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的标准教材啊。。。

读书人网 >Web前端

热点推荐