对Java程序员来讲,做web开发最熟悉的框架莫过于SpringMVC了。之所以它能一统江湖,不是自己太优秀,而是对手太坑了,不知道大家还记不记得2017年左右Struts2爆出了一个大漏洞,自此之后,Web开发领域的就是SpringMVC的天下了。
但是鉴于这么优秀的框架,很多程序员还只是停留在会用的状态,对底层的原理却不甚了解,所以今天咱么就来聊聊SpringMVC的工作原理。
三层架构
在开始介绍SpringMVC之前,咱么要先来了解一下web开发的历史。我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器/服务器。而在JavaWeb开发中,几乎都是采用B/S架构的开发模式,在这种架构模式中,将整个业务应用划分为三层架构,分别是::表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL),核心的思想就是“高内聚,低耦合”。
表现层(UI)
也就是我们常说的web层,展现给用户的界面,即用户在使用一个系统的时候的所见所得。讲人话就是我们看到的网页。
业务逻辑层(BLL)
也就是我们常说的 service 层。主要对业务业务逻辑处理。
数据访问层(DAL)
也就是我们是常说的DAO 层。就是直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
MVC框架模式
MVC全称是【ModelView Controller】,模型(Model)是-视图(View)-控制器(Controller)的缩写,是一种软件设计模式,是一种架构思想,体现的是责任分离思想,各自做各自最擅长的事情。它是基于表现层把程序分为三大部分:模型、视图、控制器,每一部分又有其单独的意含义。
模型(Model ):数据模型,Model是数据模型,其实就是JavaBean对象,细分可以表示为业务组件(service)、领域模型组件(domain)等,Model包含要展示的数据和拥有的业务功能方法。
视图(View ):数据展示,说人话就是用户能看到的网页界面,当然该界面上还需要展示数据模型中的具体数据。
控制器(Controller):接收用户请求,并分发给对应的模型进行处理处理完毕后把返回的模型数据返回给视图进行渲染,最终展示给用户。
SpringMVC 的概念
SpringMVC 是一种基于Java 的实现 MVC 设计模型的请求驱动类型的轻量级Web 框架,是Spring 框架提供的构建Web 应用程序的全功能 MVC模块。目前SpringMVC 已经成为目前最优秀的MVC 框架之一。特别是支持RESTful编程风格,更是和微服架构的无缝契合。
SpringMVC的核心组件
1.DispatcherServlet【前端控制器】
相当于中央处理器,用来分发请求的不同的处理流程,如:分发到HandlerMapping、HandlerAdapter、View resolver等。
2.Controller【处理器】
处理不同类型的业务请求,如:增删改查的业务。
3.HandlerMapping【处理器映射器】
根据用户请求找到Handler即处理器,SpringMvc提供了不同的映射器实现不同的映射方式,如:配置文件方式,实现接口方式,注解方式。
4.HandlerAdapter【处理器适配器】
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
5.View resolver【视图解析器】
进行视图解析,根据逻辑视图名解析成真正的视图View视图,最终需要通过网页将数据模型展示给用户。
执行流程
下面我们来通过一张SpringMVC的流程图,来看一下它的每个组件都是用来的干啥的,有什么作用,明白了这些之后,以后开发的时候就可以很清楚的知道一个请求过来之后,都经过了哪些组件,每一个组件都发挥了什么样的作用。
根据这张流程图,我们再来分别解释一下每一步以及每一个组件的具体作用。
用户发送请求至前端控制器DispatcherServlet,进行分发处理。
DispatcherServlet收到请求调用处理器映射器HandlerMapping。
处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作。
执行处理器Handler(Controller,也叫页面控制器)。
Handler执行完成返回ModelAndView。
HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet。
DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
ViewReslover解析后返回具体View。
DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
最终DispatcherServlet响应用户。
通过以上对每个组件的介绍,以及每个组件的作用,和各组件中的调用关系;明白了这些之后,我们使用SpringMVC的时候,在脑子里就会一张流程图,知道每一个请求来了之后,都做了哪些动作,如果后期我们想对一些请求进行干预的话,就可以方便的找到对应的组件,对应的位置来进行干预。
网友评论