MVC (Web model-view-controller ) 框架是围绕着一个 前置控制器(DispatcherServlet)
设计,它将请求分发给处理程序,具有可配置的处理程序映射(handler mappings), 视图解析( view resolution), 区域设置(locale), 时区(time zone)和主题版面解析(theme)以及上传文件.默认的处理程序是基于 @Controller(控制层)
和 @RequestMapping(请求映射)
注解, 提供广泛的灵活处理方法. 通过引入Spring3.0 , @Controller
机制还允许您通过 @PathVariable
注释和其他功能创建RESTful Web站点和应用程序.
一个关键设计原则,通俗点说就是 "Open for extension(可拓展), closed for modification(不修改)" .
一些SpringMVC的核心类是被标识成 final
. 作为一个猿类(此猿非彼猿)你是无法去实现这些类去满足你自己的需求的. 这个可扩展,不可修改的原则是经过慎重考虑设计的.
《深入浅出SpringMVC和WebFlow》
在springMVC框架中,你可以使用任何对象作为一个命令或者表单对象,你不用实现框架接口,Spring的数据绑定非常灵活,例如:它将类型不匹配视作一个程序能自我识别的验证错误, 而不是系统错误。因此,您不用将您的业务对象的属性复制成一个简单无类型的字符串,仅处理无效提交,或者正确转换字符串。 相反,通常最好直接绑定到您的业务对象。
Spring的视图解析是非常灵活的,一个controller通常负责准备一个具有数据的模型(model)Map,并且指定返回的视图名称。但是controller也可以直接写出一个响应流并完成(结束)这个请求。 视图名称的解析通过文件扩展或者accept表头内容类型协商进行高度配置,通过bean名称,属性文件或甚至自定义的ViewResolver实现。Model(MVC中的M)是一个Map接口,可以完全提取视图技术。 您可以直接与基于模板的渲染技术(如JSP,Velocity和Freemarker)集成,或直接生成XML,JSON,Atom和许多其他类型的内容。Model Map简单地转换成适当的格式,如JSP请求属性, Velocity模板模型。
22.1.1 SpringMVC特性
Spring Web Flow
SWF旨在成为管理web应用程序页面流的最佳解决方案,SWF集成了一些现有框架,像SpringMVC和JSF,同时也有Servlet和portlet环境。如果你有一个业务流程需要从对话模型而不是简单的request模型中受益,那SWF就是解决方案,SWF允许您将逻辑页面流作为在不同情况下的独立模块捕获,因此非常适合构建指导用户通过导航操作驱动业务流程的web应用模块。
Spring框架的Web模块包含许多独特的特性(吹牛模式开启):
1.低耦合
把框架和应用程序类作为javaBean来进行强大直接的配置
你可以根据你的需要定义任何一个controller方法签名,可能会从给定方案中使用任何一个注解(例如@RequestHeader, @PathVariable等)
可复用的业务代码,杜绝重复造轮子
自定义的绑定和验证
自定义的处理器映射和视图解析
灵活的模型传输
自定义的本地设置,时区和主题解析,支持带有或不带有Spring标签库的JSP,支持JSTL,支持Velocity,无需额外的桥接等。
一个简单却强大的JSP标签库作为Spring标签库而总所周知,为数据绑定和主题等功能提供支持
在Spring 2.0中引入的JSP表单标签库,使得在JSP页面中的写入表单更容易
Bean的生命周期作用于当前的HTTP request或者HTTP Session.这并不是SpringMVC的自身特性,而是SpringMVC使用的WebApplicationContext容器的特性
22.1.2其它MVC实现的可插拔性
对于某些项目,使用非SpringMVC框架实现会更加完美。许多团队更喜欢对现有的技术和工具投入精力,例如JSF.如果你不想使用SPringMVC,但是打算使用Spring提供的其它解决方案,你可以将Spring框架非常容易的与MVC框架集成。你只需要通过ContextLoaderListener来启动Spring的底层application context*(一个容器。通过容器可以取相应bean的值属性等).
即使没有Spring的Web MVC,您的注册bean和Spring的服务也可以在您的指尖。 在这种情况下,Spring不会与其他Web框架竞争。 它简单地解决了纯Web MVC框架从bean配置到数据访问和事务处理的许多方面。 所以您可以使用Spring中间层和/或数据访问层来丰富您的应用程序,即使您只想使用JDBC或Hibernate的事务抽象。(此段纯Google)