SpringMVC
2021-12-23 17:28:55 11 举报
mvc核心流程图
作者其他创作
大纲/内容
invokeForRequest
执行Tomcat里面的代码,开始准备创建MVC容器
listener.onApplicationEvent(event)
mappingRegistry.getMappingsByUrl通过url获取匹配的条件
initLocaleResolver
都能进来
根据mavc创建一个ModelAndView返回
ViewResolver
设置父容器,IOC父容器默认为空
shouldApplyTo
wac.refresh()完成容器创建和初始化,具体参考Spring流程图
buildLocaleContext构建当前的LocalContext
给request设置一些属性对象
doPut
请求完成以后会将原来的LocaleContext和ServletRequestAttribute设置到LocaleContextHolder和RequestContextHolder
是
doInvoke具体调用method
配置在web模块下的ContextLoader配置文件中
getModelAndView
mappedHandler.applyPostHandle处理拦截器的后置方法
给当前异步管理器注册回调拦截器
mappingLookup key = url vaue = HandlerMethod
获取请求的lookupPath其实就是url地址
getMethodArgumentValues准备方法需要的参数
将ModelAndView选择合适的视图进行渲染的处理器默认:InternalResourceViewResolver
ExceptionHandlerExceptionResolverResponseStatusExceptionResolverDefaultHandlerExceptionResolver
获取之前报错的本地化信息LocalContext
publishEvent发布ContextRefreshedEvent事件
initFrameworkServlet模板方法,空实现,留给子类扩展
创建ModelAndView对象并返回
getExceptionHandlerMethod获取对应异常处理的方法(@ExceptionHandler修饰的)
获取上下文对象类型并反射创建上下文对象
获取当前异常的HandelMethod
循环遍历
processHandlerException
这里读取的文件是mvc的配置文件,并加载registerListeners方法会将之前设置的SourceFilteringListene添加到多播器中
获取所有监听器,依次执行invokeListener
RequestToViewNameTranslator
26种参数处理器,循环判断,匹配到一种存到缓存并返回
FrameworkServlet.ContextRefreshListener#onApplicationEvent
modelFactory.initModel
controller处理器方法没有返回一个View对象或逻辑视图名称,并且在该方法中没有直接往response的输出流里面写数据的时候,spring将会采用约定好的方式提供一个逻辑视图名称,默认:DefaultRequestToViewNameTranslator
initMultipartResolver
getHandlerAdapter(mappedHandler.getHandler())获取HandlerAdapter对象
ThemeResolver
执行Servlet的init方法,最终执行的是HttpServletBean#init
判断是否是Post并且是以multipart开头
设置响应的国际化Local对象
WebAsyncUtils.getAsyncManager(request)获取异步管理器
resolver.resolveException解析异常,生成ModelAndView对象
实例化XmlWebApplicationContext对象
customizeContext
key:contextConfigLocationvalue:classpath:applicationContext.xml指定mvc的配置文件
supportsReturnType判断是否匹配的方法
FlashMapManager
HandlerMapping
请求方式为Patch或为空?
multipartResolver.resolveMultipart通过MVC的文件组件进行处理
getWebApplicationContext()设置上下文对象
ExceptionHandlerExceptionResolver处理有@ExceptionHandler处理方法的异常ResponseStatusExceptionResolver处理带有@ResponseStatus注解的异常DefaultHandlerExceptionResolver处理一些默认的异常,例如
请求是否处理过
向ServletContext的Attribure设置Root容器
是否跨域请求?
MVC准备阶段
doPost
1.设置容器id2.设置容器的servlet上下文3.获取spring配置文件名称
ha.handle真正调用handler方法,开始处理请求
this.handlerAdapters默认3个,初始化HandlerAdapter组件时会添加好
将当前请求的构建的LocaleContext和ServletRequestAttribute设置到LocaleContextHolder和RequestContextHolder
主要用来设置主题ThemeFixedThemeResolver
事件源是否属于自己
HttpRequestHandlerAdapter处理继承自HttpRequestHandlerSimpleControllerHandlerAdapter处理继承自ControllerRequestMappingHandlerAdapter处理注解这里是个适配器模式,为了适配三种方式的controller
否
创建ModelAndViewContainer对象
setParameterNameDiscoverer设置参数名称发现器
initHandlerMappings
initHandlerExceptionResolvers
将MVC上下文对象添加到servlet上下文的属性中
getModelFactory获取全局和局部被@ModelAttribute修饰的方法
createWebApplicationContext创建IOC容器上下文对象
只要任意一个拦截器返回false,请求都不继续往下走
请求处理具体流程
继承自ModelAndViewDefiningException
RequestContextHolder.getRequestAttributes获取原来保存的request和session属性
doDelete
initWebApplicationContext
1.设置容器id2.设置servlet上下文3.设置servlet配置对象4.设置命名空间()
modelFactory.updateModel
setDataBinderFactory设置参数绑定工厂对象
setHandlerMethodReturnValueHandlers设置返回值处理器(15个)
processDispatchResult处理返回结果,包括处理异常、渲染页面
getHandlerInternal
themeResolver设置主题对象
新建一个空的ModelAndView返回
返回匹配到的handlerMethod
getArgumentResolver
finishRefresh
MVC九大内置组件
this.handlerMappings默认有三个,在handleMapping组件初始化的时候会添加好
checkMultipart(request)判断是不是一个上传请求
determineContextClass容器的Class对象XmlWebApplicationContext
当容器刷新完成时,会发刷新完成的事件,收到事件后完成了MVC内置9大组件的初始化工作
这里要知道,servlet的执行流程为,init --> service --> destory所以我们知道一定会执行init方法,而mvc最重要的一个类为DispatcherServlet,所以我们从这个类出发,找到init方法,该类继承自font color=\"#f44336\
RequestMappingHandlerMapping处理@Controller注解的BeanNameUrlHandlerMappingSimpleUrlHandlerMapping
this.resolvers.supportsParameter
prepareResponse阻止缓存
HandlerMapping:映射器,用来将对应的request跟controller进行对应
doGet
主要用来处理国际化配置,默认为AcceptHeaderLocaleResolver
获取异步处理请求对象
initViewResolvers
处理适配器,主要包含Http请求处理器适配器,简单控制器处理器适配器,注解方法处理器适配器
FrameworkServlet#initWebApplicationContext
registry key = url value = MappingRegistration
mavContainer的defaultModel中的参数设置到SessionAttributes
modelFactory将sessionAttributes和注释了@ModelAttribute的方法的参数设置到model中
handleReturnValue处理器处理返回值
IOC容器创建完成
参数遍历
wac.refresh()开始创建并刷新MVC容器
MultipartResolver
finally
默认三种
FrameworkServlet#service处理请求的入口
上下文对象设置环境对象和父容器(IOC容器)和MVC配置文件名称
mappingRegistry在RequestMappingHandlerMapping创建初始化时通过afterPropertiesSet完成url和method的关系映射
HandlerExecutionChain是否为空?
将request和response包装成ServletWebRequest对象
onRefresh(event.getApplicationContext())
会将原来的request转换成MultipartParsingResult对象
LocaleResolver
DispatcherServlet#initStrategies初始化MVC九大组件
initHandlerAdapters
exceptionHandlerMethod.invokeAndHandle跟正常请求执行HandleMethod一样的流程
buildRequestAttributes构建当前的request和session属性
getThemeSource()设置主题源
setResponseStatus处理@ResponseStatus注解
注解方式
将flashmap中的数据设置到MAV中
invokeHandlerMethod
默认值在,MVC模块下的DispatcherServlet文件中配置了各个组件的默认值,要覆盖可以在项目根目录建一个一样路径的文件
标记请求完成
postProcessWebApplicationContext(wac)模板方法,没有任何实现
getDataBinderFactory获取全局和局部被@InitBinder修饰的方法
获取异常的ModelAndView对象
启动完成,此时可以处理请求了
遍历15种返回值处理器
onApplicationEventInternal(event)
setHandlerMethodArgumentResolvers设置参数处理器
mappedHandler.applyPreHandle处理拦截器的前置方法
直接返回
自定义上下文并完成初始化,默认为空
处理lastModified
遍历处理
localeResolver设置国际化对象
this.returnValueHandlers.handleReturnValue处理方法的返回值
selectHandler选择合适的返回值处理器
是否异常?
setDataBinderFactory获取全局和局部被@InitBinder修饰的方法
获取父容器上下文对象
返回原request对象
invocableMethod.invokeAndHandle执行handleMethod方法的调用
HandlerAdapter
onRefresh设置了themeSource
getHandlerInternal(request)由具体子类实现
用来处理文件上传的组件,默认为空,可以自己在配置文件中指定
添加事件监听器SourceFilteringListener,真正的监听器为ContextRefreshListener
tomcat启动事件的监听类
HandlerExceptionResolver
configureAndRefreshWebApplicationContext
setHandlerMethodReturnValueHandlers设置返回值处理器
实现自ConfigurableWebApplicationContext?
setHandlerMethodArgumentResolvers设置参数处理器(26个)
doResolveException执行解析异常,返回modelAndView对象
handlerMethod包含了controller对象和对应的方法
argumentResolverCache缓存中是否存在
BeanNameUrlHandlerMappingRequestMappingHandlerMappingRouterFunctionMapping
mapping.getHandler(request)
ContextLoaderListener#contextInitialized
flashMapManager设置flashManager对象
新增一个CorsInterceptor拦截器
createInvocableHandlerMethod创建ServletInvocableHandlerMethod对象
实际的请求处理是通过该对象来完成的,参数绑定和返回值处理
resolveViewName获取View对象(配置好的viewResolvers)
将servlet中配置的init-param参数封装到pvs变量中,设置DispatcherServlet的自定义属性编辑器
SourceFilteringListener#onApplicationEvent
返回404页面
urlLookupkey = url value = RequestMappintInfo url
HttpRequestHandlerAdapterSimpleControllerHandlerAdapterRequestMappingHandlerAdapterHandlerFunctionAdapter(用的很少,lanada)
提供请求存储属性,可供其他请求使用默认:SessionFlashMapManager
getHandler(processedRequest)获取合适的handleMapping对象
initServletBean
createWebApplicationContext
MappingRegistry
收藏
收藏
0 条评论
下一页