知音专栏 SpringMVC概述 Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。 Spring的web框架包括可配置的处理器(handler)映射、视图(view)解析、本地化(local)解析、 主题(theme)解析以及对文件上传的支持。 Spring的Web框架中缺省的处理器是Controller 接口,这是一个非常简单的接口,仅包含ModelAndView handleRequest(request, response) 方法。可以通过实现这个接口来创建自己的控制器(也可以称之为处理器),但是更推荐继承Spring提供的一系列控制器, 比如AbstractController、AbstractCommandController 和SimpleFormController。 注意,需要选择正确的基类:如果没有表单,就不需要一个FormController。 这是和Struts的一个主要区别。 Spring Web MVC允许使用任何对象作为命令对象(或表单对象)- 不必实现某个特定于框架的接口或从某个基类继承。 Spring的数据绑定相当灵活,例如,它认为类型不匹配这样的错误应该是应用级的验证错误,而不是系统错误。 所以你不需要为了保证表单内容的正确提交,而重复定义一个和业务对象有相同属性的表单对象来处理简单的无 类型字符串或者对字符串进行转换。这也是和Struts相比的另一个重要区别,Struts是围绕 Action和ActionForm等基类构建的。 和WebWork相比,Spring将对象细分成更多不同的角色:控制器( Controller)、可选的命令对象(Command Object)或表单对象(Form Object), 以及传递到视图的模型(Model)。模型不仅包含命令对象或表单对象,而且也可以包含任何引用数据。 相比之下,WebWork的Action将所有的这些角色都合并在一个单独的对象里。 虽然WebWork的确允许在表单中使用现有的业务对象,但是必须把它们定义成相应的Action 类的bean属性。更重要的是,在进行视图层(View)运算和表单赋值时,WebWork使用的是同一个处理请求的 Action实例。因此,引用数据也需要被定义成Action 的bean属性。这样一个对象就承担了太多的角色(当然,对于这个观点仍有争议)。 Spring的视图解析相当灵活。一个控制器甚至可以直接向response输出一个视图 (此时控制器返回ModelAndView的值必须是null)。在一般的情况下,一个ModelAndView 实例包含一个视图名字和一个类型为Map的model, 一个model是一些以bean的名字为key,以bean对象(可以是命令或form,也可以是其他的JavaBean) 为value的键值对。 对视图名称的解析处理也是高度可配置的,可以通过bean的名字、属性文件或者自定义的 ViewResolver实现来进行解析。实际上基于 Map的model(也就是MVC中的M)是高度抽象的,适用于各种表现层技术。 也就是说,任何表现层都可以直接和Spring集成,无论是JSP、Velocity还是其它表现层技术。 Map model可以被转换成合适的格式,比如JSP request attribute或者Velocity template model。 Spring MVC框架的特点
Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 准确的说,这并非Spring MVC框架本身特性,而应归属于Sping MVC使用的WebApplicationContext容器。
Spring MVC工作原理 就我自己对Spring MVC的理解来谈谈其工作原理。Spring MVC的工作是要依赖整个Spring的。 DispatcherServlet是调度的核心,处理器映射器,视图解析器,业务处理器都要被前端控制器所调配,画了一张简单架构图: 分步骤来解释一下:
以上就是SpringMVC的大体架构和工作原理。 Spring框架的源码中使用了非常多的经典设计模式和设计原则。是不可多得的代码大餐。找个时间研究一下。
送书活动栏 轻量级JavaEE企业应用实战 |
|