• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

详解Spring MVC中的Controller

JAVA web前端中文站 2年前 (2017-07-11) 744次浏览 未收录 0个评论

这篇文章本来是已经写好了,但是在保存发布之前收到了来自美国的攻击。导致整个服务器无法访问了,这里只能重新写上一篇。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

前面我们已经学习了 DispatcherServlet 的内容,DispatcherServlet 会将收到的请求分配给各个 Controller。本文将重点介绍 Controller 在 Spring MVC 中的作用。

Controller 控制器,是 MVC 中的部分 C,为什么是部分呢?因为此处的控制器主要负责功能处理部分:

  • 收集、验证请求参数并绑定到命令对象;
  • 将命令对象交给业务对象,由业务对象处理并返回模型数据;
  • 返回 ModelAndView(Model 部分是业务对象返回的模型数据,视图部分为逻辑视图名)。

还记得 DispatcherServlet 吗?主要负责整体的控制流程的调度部分:

  1. 负责将请求委托给控制器进行处理;
  2. 根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把模型数据传入)。

因此 MVC 中完整的 C(包含控制逻辑+功能处理)由(DispatcherServlet + Controller)组成。
 
因此此处的控制器是 Web MVC 中部分,也可以称为页面控制器、动作、处理器。
 
Spring Web MVC 支持多种类型的控制器,比如实现 Controller 接口,从 Spring2.5 开始支持注解方式的控制器(如@Controller、@RequestMapping、@RequestParam、@ModelAttribute 等),我们也可以自己实现相应的控制器(只需要定义相应的 HandlerMapping 和 HandlerAdapter 即可)。
 
因为考虑到还有部分公司使用继承 Controller 接口实现方式,因此我们也学习一下,虽然已经不推荐使用了。
 
对于注解方式的控制器,后边会详细讲,在此我们先学习 Spring2.5 以前的 Controller 接口实现方式。

Controller 接口

 package org.springframework.web.servlet.mvc; public interface Controller {        ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; }

这是控制器接口,此处只有一个方法 handleRequest,用于进行请求的功能处理,处理完请求后返回 ModelAndView(Model 模型数据部分 和 View 视图部分)。
 
还记得第二章的 HelloWorld 吗?我们的 HelloWorldController 实现 Controller 接口,Spring 默认提供了一些 Controller 接口的实现以方便我们使用,具体继承体系如下图所示。

详解 Spring MVC 中的 Controller

WebContentGenerator

从上面的图中可以看出,与 Controller 平行的还有一个 WebContentGenerator 类。该类用于提供如浏览器缓存控制、是否必须有 session 开启、支持的请求方法类型(GET、POST 等)等,该类主要有如下属性:

  • Set<String>   supportedMethods:设置支持的请求方法类型,默认支持“GET”、“POST”、“HEAD”,如果我们想支持“PUT”,则可以加入该集合“PUT”。
  • boolean requireSession = false:是否当前请求必须有 session,如果此属性为 true,但当前请求没有打开 session 将抛出 HttpSessionRequiredException 异常;
  • boolean useExpiresHeader = true:是否使用 HTTP1.0 协议过期响应头:如果 true 则会在响应头添加:“Expires:”;需要配合 cacheSeconds 使用;
  • boolean useCacheControlHeader = true:是否使用 HTTP1.1 协议的缓存控制响应头,如果 true 则会在响应头添加;需要配合 cacheSeconds 使用;
  • boolean useCacheControlNoStore = true:是否使用 HTTP 1.1 协议的缓存控制响应头,如果 true 则会在响应头添加;需要配合 cacheSeconds 使用;
  • private int cacheSeconds = -1:缓存过期时间,正数表示需要缓存,负数表示不做任何事情(也就是说保留上次的缓存设置)

该抽象类默认被 AbstractController 和 WebContentInterceptor 继承。

cacheSeconds

cacheSeconds =0 时,则将设置如下响应头数据:

  • Pragma:no-cache  //HTTP 1.0 的不缓存响应头
  • Expires:1L  //useExpiresHeader=true 时,HTTP 1.0
  • Cache-Control :no-cache //useCacheControlHeader=true 时,HTTP 1.1
  • Cache-Control :no-store //useCacheControlNoStore=true 时,该设置是防止 Firefox 缓存

cacheSeconds>0 时,则将设置如下响应头数据:

  • Expires:System.currentTimeMillis() + cacheSeconds * 1000L  // useExpiresHeader=true 时,HTTP 1.0
  • Cache-Control :max-age=cacheSeconds // useCacheControlHeader=true 时,HTTP 1.1

cacheSeconds<0 时,则什么都不设置,即保留上次的缓存设置。

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:详解 Spring MVC 中的 Controller
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址