Spring MVC 4.2.4.RELEASE 中文文档
  • Introduction
  • Part I: 目录与翻译注记(Table of contents and Notes)
    • 目录
    • 翻译注记
  • Part II: 文档内容(Documentation contents)
    • Spring Web MVC框架简介
      • Spring Web MVC的新特性
      • 允许其他MVC实现
    • DispatcherServlet
      • WebApplicationContext中特殊的Bean类型
      • 默认的DispatcherServlet配置
      • DispatcherServlet的处理流程
    • 控制器的实现
      • 使用@Controller注解定义一个控制器
      • 使用@RequestMapping注解映射请求路径
      • 定义@RequestMapping注解的处理方法
      • 异步请求的处理
      • 对控制器测试
    • 处理器映射
      • 使用HandlerInterceptor拦截请求
    • 视图解析
      • 使用ViewResolver接口解析视图
      • 视图链
      • 视图重定向
      • 内容协商解析器ContentNegotiatingViewResolver
    • 使用闪存属性FlashAttributes
    • URI构造
      • 为控制器和方法指定URI
      • 在视图中为控制器和方法指定URI
    • 地区信息
      • 获取时区信息
      • Accept请求头解析器AcceptHeaderLocaleResolver
      • Cookie解析器CookieLocaleResolver
      • Session解析器SessionLocaleResolver
      • 地区更改拦截器LocaleChangeInterceptor
    • 主题 themes
      • 关于主题:概览
      • 定义主题
      • 主题解析器
    • Spring的multipart(文件上传)支持
      • 概述
      • 使用MultipartResolver与Commons FileUpload传输文件
      • Servlet 3.0下的MultipartResolver
      • 处理表单中的文件上传
      • 处理客户端发起的文件上传请求
    • 异常处理
      • 处理器异常解析器HandlerExceptionHandler
      • @ExceptionHandler注解
      • 处理一般的Spring MVC异常
      • 使用@ResponseStatus注解业务异常
      • Servlet默认容器错误页面的定制化
    • Web安全
    • "约定优于配置"的支持
      • 控制器类名-处理器映射ControllerClassNameHandlerMapping
      • 模型ModelMap(ModelAndView)
      • 视图-请求与视图名的映射
    • HTTP缓存支持
      • HTTP请求头Cache-Control
      • 对静态资源的HTTP缓存支持
      • 在控制器中设置Cache-Control、ETag和Last-Modified响应头
      • 弱ETag
    • 基于代码的Servlet容器初始化
    • 配置Spring MVC
      • 启用MVC Java编程配置或MVC命名空间
      • 默认配置的定制化
      • 转换与格式化
      • 验证
      • 拦截器
      • 内容协商
      • 视图控制器
      • 视图解析器
      • 资源的服务
      • 回到默认的Servlet来进行资源服务
      • 路径匹配
      • 消息转换器
      • 使用MVC Java编程进行高级定制
      • 使用MVC命名空间进行高级定制
Powered by GitBook
On this page

Was this helpful?

  1. Part II: 文档内容(Documentation contents)
  2. "约定优于配置"的支持

模型ModelMap(ModelAndView)

ModelMap类其实就是一个豪华版的 Map,它使得你为视图展示需要所添加的对象都遵循一个显而易见的约定被命名。请看下面这个 Controller实现,并请注意,添加到ModelAndView中去的对象都没有显式地指定键名。

public class DisplayShoppingCartController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {

        List cartItems = // 拿到一个CartItem对象的列表
        User user = // 拿到当前购物的用户User

        ModelAndView mav = new ModelAndView("displayShoppingCart"); <-- 逻辑视图名

        mav.addObject(cartItems); <-- 啊哈,直接添加的对象,没有指定名称
        mav.addObject(user); <-- 啊哈再来一次

        return mav;
    }
}

ModelAndView内部使用了一个ModelMap类,它是Map的一个实现,会自动为添加进来的对象生成一个键名。为添加对象生成名称的策略是,若添加对象是一个纯Java bean(a scalar object),比如User,那么使用对象类的短类名(short class name)来作为该对象的名称。下面是一些例子,展示了为添加到ModelMap实例中的纯Java对象所生成的名称:

  • 添加一个x.y.User实例,为其生成的名称为user

  • 添加一个x.y.Registration实例,为其生成的名称为registration

  • 添加一个x.y.Foo实例,为其生成的名称为foo

  • 添加一个java.util.HashMap实例,为其生成的名称为hashMap。这种情况下,显式地声明一个键名可能更好,因为hashMap的约定并非那么符合直觉

  • 添加一个null值将导致程序抛出一个IllegalArgumentException参数非法异常。若你所添加的(多个)对象有可能为null值,那你也需要显式地指定它(们)的名字

啥?键名不能自动变复数形式么?

Spring Web MVC的约定优于配置支持尚不能支持自动复数转换。这意思是,你不能期望往ModelAndView中添加一个Person对象的List列表时,框架会自动为其生成一个名称people。

这个决定是经过许多争论后的结果,最终“最小惊喜原则”胜出并为大家所接受。

为集合Set或列表List生成键名所采取的策略,是先检查集合的元素类型、拿到第一个对象的短类名,然后在其后面添加List作为名称。添加数组对象也是同理,尽管对于数组我们就不需再检查数组内容了。下面给出的几个例子可以阐释一些东西,让集合的名称生成语义变得更加清晰:

  • 添加一个带零个或多个x.y.User元素类型的数组x.y.User[],为其生成的键名是userList

  • 添加一个带零个或多个x.y.User元素类型的数组x.y.Foo[],为其生成的键名是fooList

  • 添加一个带零个或多个x.y.User元素类型的数组java.util.ArrayList,为其生成的键名是userList

  • 添加一个带零个或多个x.y.Foo元素类型的数组java.util.HashSet,为其生成的键名是fooList

  • 一个 空的 java.util.ArrayList则根本不会被添加

Previous控制器类名-处理器映射ControllerClassNameHandlerMappingNext视图-请求与视图名的映射

Last updated 5 years ago

Was this helpful?