首页 > 代码库 > Spring官方文档翻译——15.1 介绍Spring Web MVC框架

Spring官方文档翻译——15.1 介绍Spring Web MVC框架

Part V. The Web


文档的这一部分介绍了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可以很容易地被转换成合适的格式,比如一个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上来,这将会非常容易。你只需要通过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来使用抽象事务管理。

Spring官方文档翻译——15.1 介绍Spring Web MVC框架