Spring Framework 之 MVC 请求处理
2021-12-26 23:39:59 0 举报
Spring Framework 之 MVC 请求处理
作者其他创作
大纲/内容
RequestResponseBodyMethodProcessor.handleReturnValue()根据上一步找出的返回值处理器,进行不同的处理方式,这里以 RequestResponseBodyMethodProcessor 为例
DispatcherServlet.processDispatchResult()处理视图渲染,只有当返回的 ModelAndView 对象不为 null 时才会处理,返回类型为 json 是不会进入这里
RequestMappingHandlerAdapter.getModelAndView()如果是页面视图,那么这里返回 基于 model 封装的 ModelAndView 对象,在后面会做视图渲染,非视图类型直接返回 null
DispatcherServlet.doDispatch()它本质上是一个 HttpServlet 处理所有请求
AbstractHandlerMethodAdapter.handle()真正调用目标方法的地方,在调用之前会完成参数解析,调用之后完成返回值处理
HandlerExecutionChain.applyPreHandle()顺序执行拦截器链 中的 preHandle() 方法,一旦返回 false 倒叙执行已经执行拦截器的 afterCompletion() 方法,且后续方法不再执行
DispatcherServlet.getHandlerAdapter()查找 HandlerAdapter 处理器
AbstractHttpMessageConverter.write()使用 response 的 OutputStream 将数据写出
AbstractMessageConverterMethodProcessor.writeWithMessageConverters()根据内容协商规则,找出一个最合适的 HttpMessageConverter,进行内容输出
② AbstractView.exposeModelAsRequestAttributes()将 model 数据放至 request 请求域中
② AbstractHandlerMapping.getHandlerInternal()根据请求路径 + 请求方式获取 HandlerMethod 对象(它封装了 @RequestMapping 对应的方法等信息)
再次遍历所有的 messageConverters根据返回值类型和上一步选择出来的媒体类型,找出最适合的 messageConverter 调用 write() 方法写数据
InvocableHandlerMethod.doInvoke()上一步已经把所有的参数解析好了,这里直接通过反射调用方法
DispatcherServlet.getHandler()处理请求映射,根据请求路径 + 请求方式获取 HandlerMethod 对象,获取 handler 并返回
① DispatcherServlet.resolveViewName()选择合适的视图解析器解析视图,这里以 【InternalResourceView】为例
HandlerExecutionChain.applyPostHandle()倒叙执行拦截器链中的 postHandle() 方法
出现任何异常
InvocableHandlerMethod.invokeForRequest()处理请求入参并通过反射执行方法
AbstractMessageConverterMethodProcessor.getProducibleMediaTypes()获取服务端可以生产的媒体类型 producibleTypes遍历所有的 messageConverter,如果可以对方法的返回值进行响应,即 canWrite(),那么久添加到结果集中返回
如果请求正常处理完成也会触发
HandlerExecutionChain.triggerAfterCompletion()倒叙触发拦截器的 afterCompletion() 方法
AbstractHandlerMapping.getHandler()调用 getHandlerInternal() 方法获取 handler将 handler 包装成 HandlerExecutionChain 返回
RequestMappingHandlerAdapter.handleInternal()RequestMappingHandlerAdapter.invokeHandlerMethod()
③ AbstractHandlerMapping.getHandlerExecutionChain()从容器中查找拦截器链,将 handler 封装成 HandlerExecutionChain 返回
ServletInvocableHandlerMethod.invokeAndHandle()继续调用这个方法处理请求
AbstractView.render()InternalResourceView.renderMergedOutputModel()
② HandlerMethodReturnValueHandlerComposite.selectHandler()根据返回值类型选择合适的返回值处理器
① InvocableHandlerMethod.getMethodArgumentValues()循环所有参数,使用 HandlerMethodArgumentResolver 完成所有请求入参的映射
DispatcherServlet.processDispatchResult()处理返回值
AbstractMessageConverterMethodProcessor.getAcceptableMediaTypes()获取客户端可以支持的媒体类型 acceptableTypes默认是从 header 头解析,添加请求参数后,会首先从请求参数中解析 format 对应的值,如果没有就从 Header 头解析 Accept 参数
① DispatcherServlet.getHandler()处理请求映射
HandlerMethodReturnValueHandlerComposite.handleReturnValue()根据返回值和返回值类型处理响应结果
根据 acceptableTypes 从 producibleTypes 找出最适合的媒体类型
③ AbstractMessageConverterMethodProcessor.writeWithMessageConverters()根据内容协商规则,找出一个最合适的 HttpMessageConverter,进行内容输出
0 条评论
回复 删除
下一页