四大组件
- 前端控制器DispatcherServlet
- 处理器映射器HandlerMapping
- 处理器适配器HandlerAdaptor
- 视图解析器ViewResolver
视图阶段(JSP)
- 请求先到前端控制器DispatcherServlet
- DispatcherServlet将根据该请求的路径去处理器映射器HandlerMapping查handler(controller的一个方法)
- 映射器HandlerMapping找到后返回一个处理器执行链HandlerExecutionChain对象(封装了handler + 可能存在的拦截器链)
- 如果没有拦截器,DispatcherServlet通过该处理器执行链对象发请求给处理器适配器HandlerAdaptor调用处理器Handler
- 处理器响应数据给处理器适配器,它转换后返回个MoudleAndView给前端控制器
-
前端控制器拿着这个 MoudleAndView 找 视图解析器 ViewResolver 去把逻辑视图转换为真正视图,返回个视图对象View 给前端控制器
-
前端控制器就拿着这个视图对象去渲染视图 JSP 给前端页面
为什么不直接发请求给处理器 Handler ,而是要走个处理器适配器 HandlerAdaptor 再转发给它呢 ?1. 你的请求参数被接口接收有多种方式吧?( restful 风格接收、参数位直接接收 ... )这里主要就是通过处理器适配器中一些处理参数的类型转换器,你的方法才能正常的接收这些参数。1. 你的返回值也多种形式吧?( String 、 MoudleAndView.... ),这些的返回值数据的转换也要靠处理器适配器中一些处理返回值的类型转换器来实现。
前后端分离阶段 (接口开发,异步请求)
- 请求先到前端控制器DispatcherServlet
- DispatcherServlet将根据该请求的路径去处理器映射器HandlerMapping查handler(controller的一个方法)
- 映射器HandlerMapping找到后返回一个处理器执行链HandlerExecutionChain对象(封装了handler + 可能存在的拦截器链)
- 如果没有拦截器,DispatcherServlet通过该处理器执行链对象发请求给处理器适配器HandlerAdaptor调用处理器Handler
- 如果这个方法是添加了@ResponseBody注解,则通过HttpMessageConverter来返回结果转换为JSON并响应
- 如果这个方法没有添加该注解,视图解析器来拼接视图前后缀到返回数据上,然后到/resources/static下找到对应的静态资源丢给视图解析器,解析到实际的视图对象后,DispatcherServlet 将结果数据传递给视图对象,视图对象负责将数据渲染成最终的响应内容。视图对象渲染完成后,DispatcherServlet 将响应返回给前端