SpringMVC对请求的处理流程

 

前言

        在没有这些开发框架的传统项目中一般都是使用jsp+Servlet的实现方式,基本上是一个url对应一个Servlet,如果项目比较大的时候就会出现很多的问题,所以,后来出现了strusts、SpringMVC等等一些框架,SpringMVC是我们经常使用到的开发框架,MVC(Model/View/Controller)它是一种设计模式,简化了web开发的工作量,并且很容易扩展和维护。

 

请求处理流程

我们先来看看一般情况下的请求处理流程

SpringMVC对请求的处理流程_第1张图片

流程解释:

  1. 首先,用户向服务器发送了一个请求URL,例如:http://localhost:8080/project/user/userInfo?id=10001,请求方式是GET,这时前端控制器接收到这个请求后会交由它的父类FrameworkServlet的doGet方法进行处理。无论是doGet还是doPost都是委托给processRequest进行处理了,而在这个方法中又委托给了它的子类DispatcherServlet的doService去实现,doService对请求的request设置一些全局参数后又委托给了doDispatch去执行分发处理。
  2. 根据url解析找到对应的handlerMethod,并根据映射关系HandlerMapping找到对应的handler处理器及拦截器,组成执行链返回给DispatcherServlet
  3. 如果找到了HandlerExecutionChain,说明请求的url是正确的,否则会抛出NoHandlerFoundException的异常信息,说明请求的url找不到对应的处理器。
  4. 根据找到的handler处理器(Controller类)去找对应的适配器,然后执行HandlerExecutionChain中的所有拦截器,如果拦截器的preHandler返回false则终止处理。
  5. HandlerAdapter适配器(可以理解为指挥处理器去干活的管家),去查找对应的参数解析器,解析出相应的参数,执行handler(此时就是执行Controller类中对应mapping的方法)
  6. 执行完成业务后,返回一个ModelAndView
  7. 如果返回的ModelAndView只是view的名称,DispatcherServlet还要根据ViewResolver 的配置将逻辑视图名称解析成相应的视图对象查找对应的视图解析器
  8. 返回具体的view对象
  9. 把Model数据填充到view对象中
  10. 前端控制器DispatcherServlet向用户返回结果

 

涉及到的主要组件

  • DispatcherServlet,前端控制器就是MVC中的C,主要负责接收所有的请求,并且协调其它组件工作,然后响应用户的请求
  • HandlerMapping,处理器的映射Map,用于存放编程时写的@RequestMapping的值及对应的handler处理器。当请求的url过来时,从此映射中找到对应的handler处理器。
  • HandlerExecutionChain,处理器执行链,除了对应的handler处理器外 还有可能有一个或多个拦截器协同工作,所以把handler处理器和这些拦截器封装成一个执行链
  • HandlerAdapter处理器的适配器,按照规则解析参数并执行handler处理器
  • handler处理器,即我们常说的Controller
  • ModelAndView,模型和视图,即MVC中的M和V
  • ViewResolver,视图解析器,对返回的ModelAndView进行解析,找到视图对象
  • View视图,它是一个接口,定义了视图的标准,各实现类可以根据不同的视图特性开发不同的视图,例如:jsp,freemarker,excel,pdf等等。

 

 

DispatcherServlet类结构

 

SpringMVC对请求的处理流程_第2张图片

简单分析

  1. 首先,顶层是一个Servlet接口,要进行j2ee开发,就必须遵守Servlet的规范,例如tomcat就是一个遵循servlet规范的web服务器。
  2. 其次,GenericServlet抽象类,它实现了servlet及servletConfig接口,另一个是序列化。如果我们自己去写一个servlet可以直接继承此类(当然也可以直接实现Servlet接口或者继承httpServlet可以减少很多开发工作量),可以直接使用getServletContext获取ServletContext对象
  3. 然后,httpServlet,它主要是定义了一些请求方式,针对很一种请求方式有对应的方法,具体的实现由子类去做。
  4. FreemeworkServlet,springMVC基本的类,实现了对各种请求方式的统一处理,但具体的服务处理还是交给它的子类DispatchServlet处理了。

总结

       通过查看源码我们可以很清楚的看到springMVC在接收到请求后的处理流程,在开发中我们就可以比较清晰的扩展需要的功能,比如:我需要对某些特定的请求做统一处理,就可以编写一个拦截器去处理这些业务。这一章只是从总体上梳理了请求处理的过程,并没有针对某一点进行展开分析。其实如果展开分析源码的话还是很多的,下次我们再分析部分源码。

你可能感兴趣的:(java框架)