Spring MVC 框架的请求处理流程及体系结构

1.Spring MVC框架的请求处理流程

Model1的基础是JSP,它由JSP 和JavaBean组成,JSP从HTTP Request
中获得所需的数据,并进行业务逻辑的处理,然后将结果通过HTTPResponse返回给前端浏览器。从
中可见,Model1在一定程度上实现了MVC.即JSP将控制层和视图层合二为一,JavaBean为模型层。
其中JSP身兼多职,既要负责视图层的数据展示,又要负责业务流程的控制,结构较为混乱,并且
也不是我们所希望的松耦合架构模式,所以当业务流程复杂的时候并不推荐使用。

相比Model1,Model2是将控制层(Servlet)单独划分出来负责业务流程的
控制,接收请求,创建所需的JavaBean实例,并将处理后的数据再返回给视图层(JSP) 进行界面数
据展示。这样的结构清晰,效果明显优化很多,并且也是一个松耦合的架构模式,所以除非项目非
常简单,一般情况下建议使用JSP Model2。

 

                                                                         图1.1

MVC设计模式处理过程

(1) 首先视图提供系统与用户交互的界面,并发送用户输入给控制器。
(2) 控制器接收用户的请求,并决定应该调用哪个模型来进行处理。
(3) 模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)。
(4) 控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据.并通过视图呈现给
用户结果。

 

                                                                                                图 1.2

Spring MVC框架也是一个基于 请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(处理器)来进行处理。下面我们就详细地分析Spring MvC请求处理的流程步骤。
(1) 首先用户发送请求到前端控制器(DispatcherServlet), 前端控制器根据请求信自(如URl)来决定选择哪个页面控制器(Contoller) 来进行处理,并把请求委托给它,即Serlvet控制器控制逻辑部分(步骤1、2)。
(2) 页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名) (步骤3、4、 5)。
(3) 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入以便将视图渲染展示(步骤 6、7)。

(4) 前端控制器再次收回控制权,将响应结果返回给用户,至此整个流程结束(步骤8)。

MVC优缺点

(1)优点

  • 多视图共享一个模型,大大提高代码的可重用性。
  • MVC三个模块相互独立,松耦合架构。
  • 控制器提高了应用程序的灵活性和可配置性。
  • 有利于软件工程化管理。

总之,我们通过MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的完美架构,当然这也是架构设计的目标之一。

(2)缺点

  • 原理复杂。
  • 增加了系统结构和实现的复杂性。
  • 视图对模型数据的低效率访问。

对于MVC来说,它并不适合小型甚至中型规模的项目,花费大量时间将MVC应用到规模并
不是很大的应用程序通常得不偿失,所以对于MVC设计模式的使用要根据具体的应用场景来决定。
 

2. Spring MVC框架的体系结构

 

                                                                               图 2.1                      

根据上述的请求处理流程,再深入了下Sping MWC框架的整体架构,如图2.1 所示。

在Spring MVC的框架模型中,我们可以发现从接收请求到返回响应,Spring MVC框架的众多组
件通力配合、各司其职地完成整个流程工作。在整个框架中,Spring MVC通过一个前端控制器
(DispatcherServlet) 接收所有的请求,并将具体工作委托给其他组件进行处理,DisatcerServlet 处于
核心地位,它负责协调组织不同组件完成请求处理并返回响应。根据Spring MVC处理请求的流程,
我们来分析下具体每个组件所负责的工作内容。
(1) 客户端发出HTTP请求,Web应用服务器接收此请求。若匹配DispatcherSrvlet的请求映射
路径(在web. xml中指定),则Web容器将该请求转交给DispatcherServlet处理。
(2)  DispatcherServlet接收到该请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等)及HandlerMapping的配置(在<servletName>- servlet.xml中配置)找到处理请求的处理器
(Handler)。
(3) 当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler来干活的人,HandlerAdapter接口里一共有三个方法,如图2.2所示。

  • supports(Object handler )方法:判断是否可以使用某个Handler。
  • handle()方法:具体使用Handler干活。
  • getLastModified()方法:获取资源的Last—Modified。

注意   

Spring MVC中没有定义Handlr按口, 也没有对处理器做任何限制,
处理器可以任意合理的方式来表现。
换句话说,任何一个Object(如JavaBean、方法等)
都可以成为请求处理器(Handler),从HandlerAdapter的handle方法及可看出,
它是Object类型,这种模式给开发者提供了极大的自由度。

需要注意:文章描述中的请求处理器、前端控制器以及图中的Handler,我们都可以理解为Cortoller。

(4) 在请求信息到达真正调用Handler的处理方法之前的这段时间内,SpringMVC 还完成了很多工作,它会将请求信息以一定的方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据
转换、数据格式化以及数据校验等。这些都做完之后,最后才真正地调用Handler的处理方法进行相应的业务逻辑处理。
(5)  处理器完成业务逻辑处理之后将返回一个ModelAndView 对象给DspatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。
(6)  ModelAndView对象中包含的是” 逻辑视图名”,而非真正的视图对象。DispatcherServlet 会
通过ViewResolver将逻辑视图名解析为真正的视图对象View.当然,负责数据展示的视图可以为JSP.
XML、 PDF、JSON等多种数据格式,对此Spring MVC均可灵活配置。
(7) 当得到真实的视图对象View后. DipacherServlet会使用ModelAndview对象中的模型数据对View进行视图渲染。
(8)  最终客户端获得响应消息,根据配置,可以是普通的HTML页面,也可以是一个 XML或者JSON格式的数据等。
通过以上关于Spring MVC的请求处理流程以及它的框架模型的分析.我们不仅简单了解了Spring MVC 整体架构,还可以初步体会其设计的精妙之处。在后续的章节中,会围绕着它的整个体系结构
进行深入讲解,包括各个组件的分析、实际开发的运用经验总结等。


学习方法

由于Spring MVC结构比较复杂,故学习的时候也要掌握学习方法,
首先要明确Spring MVC是一个工具。既然是工具,那么我们就需要先掌握工具的使用方法,
不要陷入细节中,深入浅出,慢慢地通过实际运用来加深共的理解。 
学习过程中多跟踪代码,查看Spring MVC的源码才能对其有更深刻的理解。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架的实现者 目录 HTTP请求映射原理 Spring MVC进行映射的依据 通过URL限定:URL表达式 通过URL限定:绑定{xxx}的值 通过请求方法限定:请求方法 通过请求方法限定:代码示例 通过请求方法限定:模拟请求方法 通过请求/请求头参数限定:示例 通过请求/请求头参数限定:更多 目录 通过注解绑定:示意图 通过注解绑定:示例 通过注解绑定:小心抛出异常 使用命令/表单对象绑定 使用Servlet API对象为入参 使用Spring的Servlet API代理类 使用IO对象为入参 其他类型的参数 HttpMessageConverter<T> HttpMessageConverter<T>实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON 使用HttpEntity<T>/ResponseEntity<T> 目录 数据绑定机理 数据类型转换 PropertyEditor依然有效 强大的ConversionService,让很多梦想成真 基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要如何签名?? 校验错误信息存放在什么地方?? 页面如何显示错误信息 如何对错误信息进行国际化(1) 如何对错误信息进行国际化(2) 目录 数据模型访问结构 访问数据模型:ModelAndView 访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析器类型 基于协商的视图解析器 目录 本地化:基础原理 本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步 AQ?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值