SpringMVC
作者:互联网
SpringMVC工作原理
doService()--->doDispatch()--->processDispatchResult()--->render()
doService设置request的相关属性然后调用doDispatch, doDispatch中调用processDispatchResult(考虑异常),processDispatchResult中调用render(渲染视图)
-
用户发送请求给前端控制器DispatchServlet
自己不处理,委托其他解析器处理,作为访问点全局控制
-
DispatchServlet接受请求后对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI调用前端请求处理映射器HandlerMapping查找相关处理器Handler(通过xml或注解配置)
Handler:是对Controller的Bean本身和请求Method的包装,而HandlerExecutionChain则是对Handler的二次包装,将Handler和拦截器链关联到一起。
为什么@Controller注释的类可以作为SpringMvc的请求处理类?因为@Controller继承了@Component,就会被Spring扫描注册到容器中,当这个类被beanFactory获取实例bean的时候返回一个Handler对象(一个请求过来就会找这些Handler里面哪个能处理这个请求)
-
HandlerMapping找到Handler(包括Handler对象以及Handler对象对应的拦截器)后以HandlerExecutionChain执行链的形式返回
HandlerExecutionChain包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor(拦截器)对象(数组),策略模式的应用,优点是很容易添加新的映射策略。
拦截器中的preHandle、postHandle与afterCompletion:可以在doDispatch源码中看到pre(按照声明顺序执行)在handle之前,post(按照声明顺序逆序执行)在渲染视图(processDispatchResult中的render)之前,而after就是在渲染之后了
-
DispatchServlet参照HandlerExcecutionChain,根据Handler去调用合适的处理适配器HandlerAdaptor(如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
HandlerMapping将URL映射到Controller上
HandlerAdaptor作用就是定位具体Controller并执行他具体的Handler业务逻辑,适配器模式的应用,优点是可以支持很多类型的处理器。
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller) 。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
-
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
-
数据转换 :对请求消息进行数据转换。如String转换成Integer、Double等
-
数据格式化 :对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等
-
数据验证 :验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
-
-
Handler执行完毕后返回ModelAndView给HandlerAdaptor
-
HandlerAdaptor获得ModelAndView后就返回给DispatchServlet
-
DispatchServlet选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)去解析视图ModelAndView
-
ViewResolver解析完返回View给DispatchServlet
-
DispatchServlet根据Model对View进行渲染
-
DispatchServlet将处理结果响应给用户
Spring MVC 之前
- Model1 时代 : 很多学 Java 后端比较晚的朋友可能并没有接触过 Model1 模式下的 JavaWeb 应用开发。在 Model1 模式下,整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。这个模式下 JSP 即是控制层又是表现层。显而易见,这种模式存在很多问题。比如①将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;②前端和后端相互依赖,难以进行测试并且开发效率极低;
- Model2 时代 :学过 Servlet 并做过相关 Demo 的朋友应该了解“Java Bean(Model)+ JSP(View,)+Servlet(Controller) ”这种开发模式,这就是早期的 JavaWeb MVC 开发模式。Model:系统涉及的数据,也就是 dao 和 bean。View:展示模型中的数据,只是用来展示。Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。
Model2 模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多JavaWeb开发相关的 MVC 框架应运而生比如Struts2,但是 Struts2 比较笨重。随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。
MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的Web层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
标签:请求,SpringMVC,Spring,Controller,MVC,DispatchServlet,Handler 来源: https://www.cnblogs.com/brightdagger/p/14695945.html