Spring MVC 介绍(一)
Spring MVC 介绍(一)
1.Spring MVC 介绍
Spring Web MVC也是一种基于MVC设计模式的、请求驱动类型的轻量级Web框架。是Spring框架的一个模块(如下图所示)。既然是框架,那么大多数开发人员需要的功能框架都已经实现了,开发人员只需在框架上的基础上,完成个性化的需求。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器被拆为处理器映射器(Handler Mapping)和视图解析器(View Resolver);处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
Spring MVC架构下图所示:
具体执行步骤如下:
-
用户发送请求至前端控制器DispatcherServlet。
-
前端控制器DispatcherServlet接收请求后,调用处理器映射器HandlerMapping。
-
处理器映射器HandlerMapping根据请求的url找到处理该请求的处理器Handler(即Controller),将处理器Handler返回给前端控制器DispatcherServlet。
-
前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Handler。
-
执行处理器Handler(即Controller,也叫后端控制器或应用控制器)。
-
处理器Handler执行完成后,返回ModelAndView(ModelAndView:实体数据和视图)给处理器适配器HandlerAdapter。
-
处理器适配器HandlerAdapter将处理器Handler执行的结果ModelAndView返回给前端控制器DispatcherServlet。
-
前端控制器DispatcherServlet将ModelAndView传给视图解析器ViewReslover。
-
视图解析器ViewReslover解析后返回具体视图View。
-
前端控制器DispatcherServlet对视图View进行渲染(即将模型数据填充至视图中)。
-
前端控制器DispatcherServlet响应用户。
Spring MVC提供的组件包括
-
DispatcherServlet
-
HandlerMapping
-
HandlerAdapter
-
ViewReslover
需要程序开发人员编写的组件包括
-
Handler
-
View
2.Spring-MVC 组件
-
DispatcherServlet:Spring中提供了org.springframework.web.servlet.DispatcherServlet类,它从HttpServlet继承而来,它就是Spring MVC中的前端控制器(Front controller)
-
HandlerMapping: DispatcherServlet自己并不处理请求,而是将请求交给页面控制器。那么在DispatcherServlet中如何选择正确的页面控制器呢?这件事情就交给HandlerMapping来做了,经过了HandlerMapping处理之后,DispatcherServlet就知道要将请求交给哪个页面控制器来处理了。
-
HandlerAdapter:经过了HandlerMapping处理之后,DispatcherServlet就获取到了处理器,但是处理器有多种,为了方便调用,DispatcherServlet将这些处理器包装成处理器适配器HandlerAdapter,HandlerAdapter调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
-
ModelAndView:DispatcherServlet取得了ModelAndView之后,需要将把逻辑视图名解析为具体的View,比如jsp视图,pdf视图等,这个解析过程由ViewResolver来完成
-
ViewResolver:ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术
-
View:DispatcherServlet通过ViewResolver取得了具体的view之后,就需要将model中的数据渲染到视图上,最终DispatcherServlet将渲染的结果响应到客户端。
取得了具体的view之后,就需要将model中的数据渲染到视图上,最终DispatcherServlet将渲染的结果响应到客户端。