22.1 Spring Web MVC框架介绍

Spring的Web模型-视图-控制器(MVC)框架是围绕将请求分发到不同处理程序的DispatcherServlet类设计的,辅以可配置的处理程序映射、视图解析、本地化、时区、主题解析(theme resolution)以及对文件上传的支持。默认的处理程序基于@Controller@RequestMapping注解,提供了大量灵活的处理方法。自从Spring的3.0版本,@Controller机制还允许通过@PathVariable注解及其他功能建立RESTful的网站和应用。

“对扩展开放……”Spring Web MVC中的一个关键设计原则,在Spring中通常是“对扩展开放,对修改关闭”原则。

Spring Web MVC的核心类的一些方法被标记为final,开发者不能为了自己的目的重写这些方法。这样做不是随意的,而是特意秉承这一原则的初衷。

关于该原则的释义,请参考Seth Ladd与他人合著的*《Expert Spring Web MVC and Web Flow》*,具体请阅读第一版117页的“A Look At Design”一节。另外,参见

使用Spring MVC时不能给final方法添加advice。例如,不能给AbstractController.setSynchronizeOnSession()方法添加advice。关于AOP代理的更多信息以及为什么不能给final方法添加advice,请参考[11.6.1 理解AOP代理](../III. Core Technologies/11.6.1. Understanding AOP proxies.md)

在Spring Web MVC中,可以将任意对象作为command对象或表单支持对象使用,不需要实现框架特有的接口或基类。Spring的数据绑定相当灵活:例如,它将类型不匹配看作校验错误而不是系统错误,这样就可以交由程序去判断。因此,不需要仅为处理无效提交或转换字符串属性而将业务对象的属性复制为表单对象中简单、无类型的字符串。相反,直接绑定到业务对象往往更好。

Spring的视图解析极其灵活。Controller通常负责准备带有数据的模型Map,然后选择一个视图名称,但是它也可以直接写入到响应流并完成请求。视图名称解析是高度可配置的,可以通过文件扩展名、Accept头部内容类型协商、bean的名字、资源文件甚至自定义的ViewResolver实现。为了顾及全部视图技术的抽象,模型(MVC中的M)是一个Map接口。可以直接与基于模板的渲染技术如JSP、Velocity和Freemarker集成,或直接生成XML、JSON、Atom和许多其他类型的内容。模型Map可以简单地转换为合适的格式,如JSP请求属性、Velocity模板模型等。


书籍推荐