Spring MVC

Spring MVC

目前业内使用得比较广泛的 MVC 框架,就是 Spring MVC 框架。

Spring MVC 基础知识

Spring MVC 是一款基于 MVC 架构模式的轻量级 Web 框架,其目的是将 Web 开发模块化,对整体架构进行解耦,简化 Web开发流程。

Spring 体系结构

模块

Spring4.x 框架由大约20个模块组成。这些模块分为核心容器(Core Container),数据访问/集成(Data Access/Integration),Web,切面编程(AOP),Instrumentation和Test,如下图所示。


spring-overview.png

显然,这幅图划分为以下五个部分:

Core Container

Core Container包含四个模块:Core,Beans,Context 和 表达式语言模块。

  • Core 和 Beans 模块提供了框架的基本部分,包括控制反转 (IoC) 和依赖注入(Dependency Injection)功能。BeanFactory 是工厂模式的复杂实现。它消除了对程序化单例的需求,并允许将实际程序逻辑中的依赖关系的配置和规范分离。
  • Context模块建立在由Core和Beans模块提供的坚实基础上:它访问对象的方式类似于JNDI注册表。Context模块从Beans模块中继承它的特性,并增加对国际化的支持,例如使用资源包(resource bundles),事件传播,资源加载,以及进行上下文的透明创建,例如一个 servlet 容器。Context 模块还支持 Java EE 功能,例如 EJB,JMX,以及基本的远程处理。ApplicationContext接口是 Contex 模块的核心内容。
  • 表达式语言模块在运行时为查询和操作对象图提供了强大的表达式语言。它是JSP 2.1规范中指定的统一表达式语言(unifiedEL)的扩展。该语言支持设置和获取属性值,属性分配和方法调用,访问数组,集合和索引器的上下文,逻辑和算术运算符,命名变量,并从Spring的IoC容器中按名称检索对象。它还支持列表预测和选择以及常用列表聚合。

Data Access/Integration

数据访问/集成层由JDBC,ORM,OXM,JMS和事务模块(Transaction modules)组成。

  • JDBC模块提供了一个JDBC抽象层,它不需要进行繁琐的JDBC编码和解析(parse)数据库供应商特定的错误代码。
  • ORM模块为流行的对象关系映射API提供了集成层,包括JPA,JDO和Hibernate。使用ORM包,你可以将所有这些O / R映射框架与Spring提供的所有其他功能结合使用,例如前面提到的简单声明式事务管理功能。
  • OXM模块提供了支持JAXB,Castor,XMLBeans,JiBX和XStream的对象/ XML映射实现的抽象层。
  • Java消息传递服务 (Java Messaging Service) 模块包含用于生成和使用消息的功能。
  • Transaction模块支持编程和声明式事务管理,用于实现特殊接口和所有POJO(普通Java对象, plain old Java objects)的类。

Web

Web层由Web,Web-Servlet,WebSocket和Web-Portlet模块组成。

  • Spring的Web模块提供基本的面向Web的集成功能,如多部分文件上传功能和使用servlet侦听器的IoC容器的初始化以及面向Web的应用程序上下文。它还包含Spring远程支持的Web相关部分。
  • Web-Servlet模块包含用于Web应用程序的Spring MVC实现。Spring的MVC框架提供了域模型代码和Web表单之间的清晰分离,并且与Spring框架的所有其他功能集成在一起。
  • Web-Portlet模块提供MVC实现以用于Portlet环境,并反映Web-Servlet模块的功能。

AOP and Instrumention

Spring的AOP模块提供了符合AOP联盟的面向切面编程(aspect-oriented programming)实现,允许你定义方法拦截器和切入点,以便干净地分离实现应该分离的功能的代码。使用源代码级元数据(metadata)功能,你还可以将行为信息以类似于.NET属性的方式整合到你的代码中。

单独的Aspects模块提供了与AspectJ的集成。

Instrumentation模块提供了用于某些应用程序服务器的类工具支持和类加载器实现。

Test

测试模块支持使用JUnit或TestNG测试Spring组件。它提供了一致的Spring ApplicationContexts加载和缓存这些上下文。它还提供了模拟对象,你可以使用它们单独测试你的代码。

Spring MVC 请求流程

Spring MVC 的整体请求流程如下:

  1. 用户单击某个请求路径,发起一个 request 请求,此请求会被前端控制器 (DispatcherServlet) 处理。
  2. 前端控制器 (DispatcherServlet) 请求处理映射器 (HandlerMapping) 去查找 Handler。可以依据注解或者 XML 配置去查找。
  3. 处理映射器 (HandlerMapping) 根据配置找到相应的 Handler(可能包含若干个 Interceptor 拦截器),返回给前端控制器 (DispatcherServlet)。
  4. 前端控制器 (DispatcherServlet) 请求处理器适配器 (HandlerAdapter) 去执行相应的 Handler(常称为 Conroller)。
  5. 处理器适配器 (HandlerAdapter) 执行 Handler。
  6. Handler 执行完毕后会返回给处理器适配器 (HandlerAdapter) 一个 ModelAndView 对象(Spring MVC 底层对象,包括 Model 数据模型和 View 试图信息)。
  7. 处理器适配器 (HandlerAdapter) 接收到 Handler 返回的 ModelAndView 后,将其返回给前端控制器 (DispatcherServlet)。
  8. 前端控制器 (DispatcherServlet)接收到 ModelAndView 后,会请求视图解析器 (View Resolver) 对视图进行解析。
  9. 视图解析器 (View Resolver) 根据 View 信息匹配到相应的视图结果,反馈给前端控制器 (DispatcherServlet) 。
  10. 前端控制器 (DispatcherServlet) 收到 View 具体视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的视图 (View)。
  11. 前端控制器 (DispatcherServlet) 向用户返回请求结果。

以上就是 Spring MVC 的整个请求处理流程,其中用到的组件有前端控制器 (DispatcherServlet) 、处理映射器 (HandlerMapping)、处理器适配器 (HandlerAdapter)、处理器 (Handler)、视图解析器 (View Resolver)、视图 (View)。

  • 前端控制器 (DispatcherServlet):其作用是接收用户请求,然后给用户反馈结果。它的作用相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。
  • 处理映射器 (HandlerMapping):其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器 (Handler) 信息。
  • 处理器适配器 (HandlerAdapter):其作用是根据映射器找到的处理器 (Handler) 信息,按照特定规则执行相关的处理器 (Handler)。
  • 处理器 (Handler):其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。
  • 视图解析器 (View Resolver):其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过是个 JSP 路径返回一个真正的 JSP 页面)。
  • 视图 (View):其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel等)。

上面的组件中,需要开发人员进行开发的是处理器和视图。一般来讲,要开发处理该请求的具体代码逻辑,以及最终展示给用户的界面。

Spring MVC 与 Structs

Struts 与 Spring MVC 类似,也是一款基于传统 MVC 设计模式的 Java EE 框架。它的核心是一个弹性的控制层,能够很好地发挥 MVC 模式的“分离显示逻辑和业务逻辑”的能力。

Spring MVC 和 Struts 都是基于 MVC 模式的 Java EE 框架,而今年来越来越多的开发者使用 Spring MVC 技术来代替 Struts 技术,那么相比于 Struts 框架,Spring MVC 的优点在哪里呢?

区别一:Spring MVC基于方法开发,Struts 基于类开发。

在使用 Spring MVC 框架开发时,会将 URL 请求路径与 Controller 类的某个方法进行绑定,请求参数作为该方法的形参。当用户请求该 URL 路径时,Spring MVC 会将 URL 信息与 Controller 类的某个方法进行映射,生成一个 Handler 对象,该对象中只包含了一个 method 方法。方法执行结束之后,形参数据也会被销毁。

而在使用 Struts 框架进行开发时,Action 类中所有方法使用的请求参数都是 Action 类中的成员变量,随着方法变得越来越多,就很难分清楚 Action 中那么多的成员变量到底是给哪一个方法使用的,整个 Action 类会变得十分混乱。

比较而言,Spring MVC 的优点是,其所有请求参数都会被定义为相应方法的形参,用户在网页上的请求路径会被映射到 Controller 类对应的方法上,此时请求参数会注入到对应方法的形参上。Spring MVC 的这种方式类似于 Service 开发。

区别二:Spring MVC 可以进行单例开发,Struts 无法使用单例。

Spring MVC 支持单例开发模式,而 Struts 由于只能通过类的成员变量接受参数,所以无法使用单例模式,只能使用多例。

你可能感兴趣的:(Spring MVC)