
21. Web MVC框架
21.1 Spring Web MVC框架简介
Spring Web模型 - 视图 - 控制器(MVC)框架是围绕一个 DispatcherServlet
派发请求处理程序,具有可配置的处理程序映射,视图分辨率,区域设置,时区和主题解析以及支持上载文件的。默认处理程序是基于@Controller
和@RequestMapping
注释,提供了广泛的灵活的处理方法。随着Spring 3.0的推出,该@Controller
机制还允许您通过@PathVariable
注释和其他功能创建RESTful Web站点和应用程序。
“Open for extension ...”Spring Web MVC和Spring中的一个关键设计原则是“ Open for extension,closed for modification ”原则。
Spring Web MVC的核心类中的一些方法被标记final
。作为一名开发人员,您无法重写这些方法来提供您自己的行为。这不是任意的,而是专门针对这一原则。
有关这个原理的解释,请参阅Seth Ladd等人的Expert Spring Web MVC和Web Flow ; 具体请参阅第一版117页的“设计看看”一节。或者,看
当您使用Spring MVC时,不能将建议添加到最终方法中。例如,您不能向该AbstractController.setSynchronizeOnSession()
方法添加建议。请参阅 第10.6.1节“了解AOP代理”以获取有关AOP代理的更多信息,以及为什么不能将建议添加到最终方法。
在Spring Web MVC中,可以使用任何对象作为命令或形式支持对象; 您不需要实现特定于框架的接口或基类。Spring的数据绑定非常灵活:例如,它将类型不匹配视为可由应用程序评估的验证错误,而不是系统错误。因此,您不需要将您的业务对象的属性复制为表单对象中简单的非类型化字符串,只是为了处理无效的提交,或者正确地转换字符串。相反,通常最好直接绑定到您的业务对象。
Spring的视图分辨率非常灵活。A Controller
通常负责Map
使用数据准备模型并选择视图名称,但也可以直接写入响应流并完成请求。通过文件扩展名或者Accept头内容类型协商,通过bean名称,属性文件甚至自定义ViewResolver
实现,视图名称解析是高度可配置的。模型(MVC中的M)是一个Map
接口,它允许视图技术的完整抽象。您可以直接与基于模板的渲染技术(如JSP,Velocity和Freemarker)进行集成,也可以直接生成XML,JSON,Atom和许多其他类型的内容。该模型Map
简单地转换成适当的格式,例如JSP请求属性,Velocity模板模型。
21.1.1 Spring Web MVC的特性
Spring Web Flow
Spring Web Flow(SWF)旨在成为Web应用程序页面流程管理的最佳解决方案。
SWF与Spring MVC和JSF等现有框架集成在Servlet和Portlet环境中。如果您有一个业务流程(或多个流程)可以从对话模型中获益,而不是纯粹的请求模型,那么SWF可能就是解决方案。
SWF允许您将逻辑页面流作为独立模块进行捕获,这些模块可在不同情况下重复使用,因此非常适合构建通过受控导航来引导业务流程来指导用户的Web应用程序模块。
有关SWF的更多信息,请参阅 Spring Web Flow网站。
Spring的Web模块包含许多独特的Web支持功能:
明确区分角色。每个角色 - 控制器,验证器,命令对象,表单对象,模型对象DispatcherServlet
,处理程序映射,视图解析器等 - 都可以由专门的对象来实现。
强大而直接的框架和应用程序类的配置,如JavaBeans。此配置功能包括跨上下文的简单引用,例如从Web控制器到业务对象和验证程序。
适应性,非侵入性和灵活性。定义您需要的任何控制器方法签名,可能使用某个参数注释(例如@RequestParam,@RequestHeader,@PathVariable等)来执行给定的方案。
可重复使用的业务代码,不需要重复。使用现有的业务对象作为命令或表单对象,而不是镜像它们来扩展特定的框架基类。
可定制的绑定和验证。将不匹配项视为应用程序级验证错误,从而保留违规值,本地化日期和数字绑定等,而不是手动分析和转换为业务对象的仅字符串表单对象。
可定制的处理程序映射和视图解析。处理程序映射和视图分辨率策略的范围从简单的基于URL的配置到复杂的专用解析策略。Spring比web MVC框架更灵活,它要求一个特定的技术。
灵活的模型转移。具有名称/值的模型传输Map
支持与任何视图技术轻松集成。
可定制的语言环境,时区和主题解析,支持带有或不带有Spring标签库的JSP,支持JSTL,支持Velocity而不需要额外的桥接,等等。
一个简单而强大的JSP标签库,被称为Spring标签库,提供对数据绑定和主题等功能的支持。自定义标签允许在标记代码方面有最大的灵活性。有关标记库描述符的信息,请参阅附录,标题为 Chapter 42,Spring JSP Tag Library
在Spring 2.0中引入了一个JSP表单标签库,它使JSP页面中的表单变得更容易。有关标记库描述符的信息,请参阅附录标题为“ Spring-form JSP标记库 ”的第43章
Bean的生命周期范围为当前的HTTP请求或HTTP Session
。 这不是Spring MVC本身的特定功能,而是WebApplicationContext
Spring MVC使用的 容器。这些bean作用域在第6.5.4节“请求,会话和全局会话作用域”
21.1.2其他MVC实现的可插入性
对于某些项目来说,非Spring MVC实现更可取。许多团队希望利用他们现有的技能和工具投资,例如JSF。
如果您不想使用Spring的Web MVC,但是打算利用Spring提供的其他解决方案,则可以轻松地将您所选择的Web MVC框架与Spring集成。简单地通过它启动一个Spring根应用程序上下文 ContextLoaderListener
,并通过其ServletContext
属性(或Spring的相应的辅助方法)从任何操作对象中访问它。不涉及“插件”,所以不需要专门的集成。从Web层的角度来看,只需使用Spring作为库,并以根应用程序上下文实例作为入口点。
即使没有Spring的Web MVC,你注册的bean和Spring的服务也可以在你的指尖。在这种情况下,Spring不会与其他Web框架竞争。它只是简单地解决了纯Web的MVC框架所没有的许多领域,从bean配置到数据访问和事务处理。因此,即使您只是想使用JDBC或Hibernate的事务抽象,也可以使用Spring中间层和/或数据访问层来丰富您的应用程序。
21.2 DispatcherServlet
Spring的web MVC框架和许多其他的web MVC框架一样,是以请求为驱动的,围绕一个中央Servlet进行设计,这个中央Servlet将请求分发给控制器,并提供其他功能来促进Web应用程序的开发。DispatcherServlet
然而,春天 不止于此。它与Spring IoC容器完全集成,因此可以使用Spring提供的其他所有功能。
Spring Web MVC的请求处理工作流程DispatcherServlet
如下图所示。精通模式的读者会认识到,这 DispatcherServlet
是“Front Controller”设计模式(这是Spring Web MVC与许多其他领先的Web框架共享的模式)的表达。
图21.1。Spring Web MVC中的请求处理工作流(高级)
这DispatcherServlet
是一个实际的Servlet
(它从HttpServlet
基类继承),并且这是在web.xml
你的Web应用程序中声明的。您需要映射要DispatcherServlet
处理的请求,方法是使用同一个web.xml
文件中的URL映射。这是标准的Java EE Servlet配置; 下面的例子显示了这样一个DispatcherServlet
声明和映射:
exampleorg.springframework.web.servlet.DispatcherServlet1example/example/*
在前面的示例中,所有以开头的请求/example
将由DispatcherServlet
名为的实例处理 example
。在Servlet 3.0+环境中,您也可以选择以编程方式配置Servlet容器。以下是基于代码的上面web.xml
例子的等价物:
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Overridepublic void onStartup(ServletContext container) {ServletRegistration.Dynamic registration = container.addServlet('dispatcher', new DispatcherServlet());registration.setLoadOnStartup(1);registration.addMapping('/example/*');}}