文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层)
Spring拥有自己的web框架——Spring Web MVC。在前两章中会有介绍。
剩下的章节则用来介绍Spring和其它web技术的集成,比方Struts和JSF(这里仅仅提两个)。
本节以对Spring MVC portlet框架的介绍结尾。
第十五章——Web MVC框架(Web MVC framework)
第十六章——视图技术(View technologie)
第十七章——与其它web框架集成(Integrating withother web frameworks)
第十八章——Portlet MVC框架(Portlet MVC Framework)
15.WebMVC 框架
15.1 介绍Spring Web MVC框架
Spring Web MVC框架环绕一个分发器(DispatcherServlet)来设计,它的作用是将请求(request)分发到相应的处理器(handler),这还须要依赖可配置的处理器映射(handlermappings)。视图解析(view resolution)。本地化和主题解析(local andtheme resolution)和上传文件支持。
默认的handler依赖于@Controller和@RequestMapping注解来提供灵活的处理方法。而在Spring3.0中,@Controller机制还同意你通过@PathVariable注解和另外一些功能来创建RESTful风格的站点和应用。
“开放扩展(Open for extension)”
在Spring Web MVC和Spring中,一个关键的设计准则就是“开放扩展。关闭改动”原则。
在Spring Web MVC核心类中的某些方法会被标记为final。作为一个开发者。你无法重写这些方法来满足你的需求。
这并非任意而为的。而必需要有界定准则。
对于这个原则的一个解释,你能够看看Seth Ladd等写的Expert Spring Web MVC and Web Flow。尤其是看“A Look AtDesign”这一章,在第一版的117页。或者你也能够看
1. Bob Martin, The Open-Closed Principle (PDF)
在使用Spring MVC的时候你无法为final方法加入advice。比如,你无法为AbstractController.setSynchronizeOnSession()加入advice。能够參考“UnderstandingAOP proxies”这一节来获得很多其它关于AOP代理的信息和无法为final方法加入advice的原因。
在Spring Web MVC中你可以使用不论什么对象来充当命令对象或是表单对象。
所以你不须要去实现一个框架相关的接口或者基类。Spring的数据绑定高度灵活。比如,它将类型不匹配当做是校验错误(validationerrors),从而可以被应用程序处理,而不是直接的系统错误。因此你无需将业务对象的属性当做strings来复制去处理无效的提交,或是转换那些字符串属性。
而通常更好的做法是直接将參数绑定到你的业务对象上去。
Spring的视图解析也格外的灵活。Controller的实现甚至能够直接向response流里写数据。通常一个ModelAndView对象包括一个视图名(view name)和一个模型Map(model Map)。model Map中包括含了beannames和其相应的对象,比方命令对象或是表单对象。
视图名称解析能够通过bean names。properties文件或是你自己的ViewResolver实现来配置。
The model以Map接口为基础。这同意视图技术全然抽象化。你能够直接集成JSP,Velocity或是其它页面渲染技术。
由于model Map能够非常easy地被转换成合适的格式,比方一个JSP requestattributes或者是Velocity的模板model。
Spring MVC的特点
Spring Web 流程
Spring Web Flow(SWF)的目标是成为最好的web应用页面流管理的解决方式。
SWF能够融入现有的框架。比方Spring MVC。Struts和JSF,在servlet和protlet环境中都能够。假设你有一个业务流程。这个业务流程会从会话模式而不是单纯的请求模式得到优点。那么SWF就可能是解决方式。
SWF能够让你去捕获逻辑页面流作为“自包括”的模块。
在不同的场景能够复用,这样就有利于创建web应用模块化,能够通过受约束的导航引导用户驱动业务流程。
若须要了解很多其它关于SWF的信息,能够去Spring Web Flow website看看.
Spring的web模块包含非常多仅仅有web才支持的特点:
清晰的角色分离。每种角色——控制器(controller),校验器(validator)。命令对象(commandobject)。表单对象(form object)。模型对象(modelobject),分发器(DispatcherServlet),处理器映射(handler mapping)。页面解析器(viewresolver)等等——都能够通过特定的对象来实现。
强大且简洁的配置。
Powerfuland straightforward configuration of both framework and application classes asJavaBeans. This configuration capability includes easy referencing acrosscontexts, such as from web controllers to business objects and validators.这段翻译不好~~
适应性。非侵入性和灵活性。
依据给定的场景,用一些參数注解(比方@RequestParam,@RequestHeader。@PathVariable等)来定义你须要的控制器方法。
重用业务代码,无需反复。直接使用现有的业务对象来充当命令对象或表单对象。而不是让他们继承一个特定的框架基类。
可自己定义的绑定和校验。类型不匹配作为应用级别的校验错误,从而实现本地化的日期。数字和其它一些值的绑定,并不仅仅是基于字符串的表单对象的绑定。
当中后者还须要进行手动的类型转换去转换成一个业务对象。
可自己定义的处理器映射和视图解析。处理器映射和视图解析策略从简单的基于URL的配置到复杂的、为特定目的而生的解析策略。Spring比那些托管技术的web MVC框架更灵活。
灵活的模型转换。
模型可与一个key/value的map互相转换。从而支持与不论什么试图技术集成
可定义的本地化和主题解析。
支持带或不带Spring标签库的JSPs。支持JSTL。支持Velocity且不须要额外的桥接。
Spring标签库是一个简单却强大的JSP标签库,它提供了对数据绑定和主题的支持。
在标记代码方面。自己定义的标签同意最大化的灵活性。想要找到很多其它关于标签库描写叙述符号的信息。能够看附录F,spring.tld
在Spring2.0中。有一个JSP表单标签库,使在JSP中制作表单更加便捷。
想要找到很多其它关于标签库描写叙述符号的信息,能够看附录G。spring-form.tld
Beans的生命周期范围是当前HTTP请求或HTTPSession。
这是WebApplicationContext容器的特点,而不是Spring MVC的特点。仅仅是SpringMVC使用了WebApplicationContext。这些bean的作用范围在“Request,session。andglobal session scopes”这一章有介绍。
其它MVC实现的可插拔性
Spring MVC的实现可能对于一些项目来说并非最合适的。很多团队期望利用现有的投资来提高技术和工具。比方Struts框架中包括了大量的知识量和使用经验。假设你能够忍受Struts体系结构的缺陷,那么它能够作为你web层的还有一个选择。对于其它MVC框架也是一样的。
假设你不想使用Spring的web MVC,可是可是想要使用Spring提供的其它解决方式,你能够将你选择的web MVC框架集成到Spring上来,这将会很easy。
你仅仅须要通过ContextLoaderListener来启动一个Spring的根应用上下文。然后从集成的Struts或WebWork的控制中通过ServletContext属性来訪问它(或Spring自己的帮助方法)。
No"plug-ins" are involved, so no dedicated integration is necessary。
从web层的角度来看。你仅仅是将Spring作为一个库来使用。并将根应用上下文对象作为切入点。
即使不使用Spring的WEB MVC,你注冊了的beans和Spring的services也会变得触手可及。Spring并不与Struts或WebWork竞争,它仅仅是提供那些单纯的web MVC框架不提供的功能,比方bean的配置,数据訪问以及事务处理。因此你能够使用Spring中间层 和/或 数据訪问层来丰富你的应用。即使你仅仅是想结合JDBC或Hibernate来使用抽象事务管理。