SpringMVC执⾏流程
springMVC(javaweb 开发框架)
1、MVC三层架构:模型(service、dao)、视图(JSP等)、控制器(Controller)
什么是mvc?
* MVC 是模型、视图、控制器的简写,是⼀种软件设计规范
* 是将业务逻辑、数据、显⽰分离的⽅法来组织代码
* MVC主要的作⽤就是降低了控制器(Controller)和视图 (View) 之间的双向耦合度
* MVC不是⼀种设计模式、MVC是⼀种架构模式。当然不同的MVC存在着差异
Model(数据模型):提供要展⽰的数据。因此包含数据和⾏为、可以认为是领域模型或者JavaBean组件,不过现在⼀般都分离开来:Value Object(数据Dao) 和 服务层(Service)。也就是模型提供了模型数据查询和模型数据的状态更新等,包括业务数据和义务。
**View(视图):**负责进⾏模型的展⽰,⼀般就是我们见到的⽤户界⾯,客户想看到的东西。
**Controller(控制器):**接收⽤户请求,委托给模型进⾏处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展⽰。也就是说控制器做了个调度员的⼯作
最典型的MVC 就是: JSP + Servlet + JavaBean
任何项⽬⾥⾯的架构是演变过来的。不是直接搭建好的
1.2、Model1时代
在web早期的开发中,通常采⽤的都是Model1。
Model1中,主要分为两层,视图层和模型层。
Model1优点:架构简单,⽐较适合⼩型项⽬开发;
Model1缺点:JSP职责不单⼀,职责过重,不便于维护;
1.3、Model2时代
Model2把⼀个项⽬分成三部分,包括视图、控制、模型。
1. ⽤户发请求
2. Servlet接收请求数据,并调⽤对应的业务逻辑⽅法
3. 业务处理完毕,返回更新后的数据给servlet
4. servlet转向到JSP,由JSP来渲染页⾯
5. 响应给前端更新后的页⾯
职责分析:
Controller:控制器
1. 取得表单数据
mvc的controller2. 调⽤业务逻辑
3. 转向指定的页⾯
Model:模型
1. 业务逻辑
2. 保存数据的状态
View:视图
1. 显⽰页⾯
Model2这样不仅提⾼的代码的复⽤率与项⽬的扩展性,且⼤⼤降低了项⽬的维护成本。Model 1模式的实现⽐较简单,适⽤于快速开发⼩规模项⽬,Model1中JSP页⾯⾝兼View和Controller两种⾓⾊,将控制逻辑和表现逻辑混杂在⼀起,从⽽导致代码的重⽤性⾮常低,增加了应⽤的扩展性和维护的难度。Model2消除了Model1的缺点。
传统的javaweb开发:
⼀个请求资源路径(url) 对应⼀个控制器(Controller) ,每次请求之后都会⾃动根据所请求的资源到对应的Servlet类,执⾏相应的业务。
SpringMVC 开发(DispatcherServlet):
和传统的开发模式不同,SpringMVC 底层有⼀个核⼼对象:DispatcherServlet 前端控制器(分发器),使⽤了SpringMVC 框架之后,所有的请求都会执⾏ DispatcherServlet 这个对象,不再去直接执
⾏对应的Controller,⽽是先通过 DispatcherServlet 前端控制器到该请求路径(URL) 对应的控制器,前端控制器再去调⽤该控制器执⾏具体业务。
官⽹SpringMVC的原理如下图所⽰:
当发起请求时被前置的控制器拦截到请求,根据请求参数⽣成代理请求,到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中⼼控制器,控制器使⽤模型与视图渲染视图结果,将结果返回给中⼼控制器,再将结果返回给请求者。
SpringMVC执⾏流程深⼊理解:
实线表⽰为框架帮我们实现, 虚线表⽰需要我们⾃⼰来实现
springmvc 中的 DispatcherServlet 请求路径⼀般设置为 “/” 项⽬的根路劲,只要在项⽬中发送请求就会
调⽤该DispatcherServlet
Springmvc 在执⾏的过程中,在调⽤指定的组件的时候。会先进⼊指定的
1、⽤户在前端浏览器上发送请求到前端控制器DispatcherServlet,如果是第⼀次请求的会先创建该前端控制器对象(并且只会加载⼀次,servlet是伪单例的(构造器没有私有化))再去执⾏ init()⽅法,从spring容器中按照类型注⼊的⽅式来对 前端控制器中的组件来完成依赖注⼊,组件依赖注⼊完毕之后再去执⾏ doService()⽅法。如果不是第⼀次请求的话,则直接执⾏doService()⽅法将⽤户具体请求的url资源名,传给处理器映射器
2、处理器映射器 根据⽤户请求的url地址去springmvc ⾃⼰的容器中去映射对应的控制器,将映射结果封装成 ⽬标⽅法 返回给前端控制器(DispatcherServlet),前端控制器将⽬标⽅法 传给 处理器适配器 再去容器中适配对应的控制器(在调⽤对应的控制器之前会进⾏⼀次拦截)
3、控制器根据⽤户的具体请求,去spring的容器中获取对应的业务逻辑层对象查询数据。
4、业务层对象将查询出的模型数据返回给控制器
5、控制器再将模型数据 返回给 处理器适配器
6、处理器适配器接收到模型数据之后,先判断响应结果是 异步请求还是同步请求,(有没有@ResponseBody注解)如果是异步请求,直接将JSON数据写回给浏览器,如果是转发的话 就将 模型数据到 模型视图对象(ModelAndView)中去,模型视图对象主要的就是封装渲染数据和展⽰页⾯的,将封装好的模型视图对象(ModelAndView)传给前端控制器(DispatcherServlet)(在传给前端控制器之前在进⾏⼀次拦截)
7、前端控制器(DispatcherServlet)再将模型视图对象传给视图层进⾏解析
8、视图层解析模型视图对象,拼接字符串获取的需要渲染的视图,并将数据渲染到该视图上去、再返回给前端控制器
9、前端控制器将视图解析器返回的页⾯视图响应给浏览器端呈现给⽤户
10、在springmvc整个的执⾏过程中只要发⽣了异常,就会进⼊⾃定义的全局异常处理类(ControllerAdvice ExceptionHandler)
在前端浏览器上第⼀次请求我们的 DispatchServlet 前端控制器(核⼼组件),会创建该DispatchServlet对象的实例,再执⾏DispatchServlet 中的 init ()⽅法 , 从 spring 容器中 按照 类型注⼊ 来获取 DispatchServlet 中的属性对应的组件 来进⾏ 依赖注⼊
如果不是 第⼀次请求的话,各⼤ 组件依赖 注⼊完毕,直接执⾏ doService()⽅法 来完成后续操作
SpringMvc 底层也有⾃⼰的⼀个容器:WebXmlApplicationContext ,和 spring的 ApplicationContext 容器是⽗⼦关系,SpringMVC 的容器 是继承了 Spring容器的,spring容器是⽗容器,springmvc容器是⼦容器
springmvc 在需要使⽤到某个功能组件的时候,先去⾃⼰的WebXmlApplicationContext容器中去,如果没有则去spring容器中去springmvc可以获取 spring容器中的bean,⽽spring则⽆法获取 springmvc容器中的bean
⼀般的话像 Controller 层对象 ⼀般都是存放在 springmvc 的容器中 来共 springmvc 中的 处理器适配去 去调⽤
Service 层 和 Dao 层对象,⼀般则是放在 spring容器中,因为 像⼀些事务的处理呀和 mybatis 核⼼对象的⽣成 不是加上注解之后就
会⽴即⽣效,⽽是先⽣成代理对象,⼀般这些代理对象⼀般都在 spring 容器中注册
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论