SpringMVC执行流程
2022-11-28 15:05:45 4 举报
springmvn的代码执行流程,体现了一些关键的代码方法
作者其他创作
大纲/内容
setResponseStatus(webRequest);
return
publishRequestHandledEvent()
如果有异常捕获异常,然后执行拦截器的方法afterCompletion()
结束
得到所有的拦截器
doInvoke(args);
modelFactory.initModel()
初始化Model对象,并填充模型属性
getCorsHandlerExecutionChain()
processDispatchResult()
检查是否是支持的请求方法,检查是否必须session,如果不满足条件则抛出异常。
内部
内
循环调用
getHandlerInternal(request);
MultipartFilter????
获取ModelFactory,用于在控制器方法调用之前协助初始化Model,并在调用之后协助对其进行更新。
处理拦截器的pre方法
checkRequest(request);
getHandler(processedRequest);
这是为了支持方法上的@ResponseStatus注解
invokeAndHandle()
lookupHandlerMethod();
do*模板方法
finally {}
将上个请求传递的FlashMap的值设置到mavContainer
applyPostHandle()
* handler正常处理完毕 * 5 倒序应用拦截器链中的此前找到的所有拦截器的postHandle后处理方法,记录当前拦截器的索引,然后倒序遍历,执行这样
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
如果存在mv并且没有view,则设置view为默认的viewName
getMethodArgumentValues()
根据给定的HandlerMethod定义创建一个ServletInvocableHandlerMethod,具有执行HandlerMethod的能力。 * 还扩展了InvocableHandlerMethod的能力,使其能够通过注册的HandlerMethodReturnValueHandler处理返回值, * 并且还支持基于方法级别的@ResponseStatus注解设置响应状态。
获取方法参数
如果此前抛出了异常,则处理异常
invokeForRequest()
DispatcherServlet#doService()
遍历所有的HandlerAdapter,依次调用supports方法尝试判断是否支持
false
buildLocaleContext(request);
发起一个请求
内部逻辑todo
interceptor.afterCompletion()
多线程相关
否
HandlerAdapter#handle()
logRequest(request);
prepareResponse(response);
检查请求类型是否是multipart/ 开头
adapter#supports是否支持handler
applyCacheSeconds()
创建ModelAndViewContainer并初始化Model对象的属性
getUrlPathHelper().getLookupPathForRequest(request);
设置ModelAndView,用于视图渲染
isRequestHandled
是
getHandlerExecutionChain()
applyPreHandle()
FrameworkServlet#processRequest()
GET请求缓存处理
interceptor.postHandle()
倒序应用拦截器链中的此前找到的所有拦截器的afterCompletion处理方法某个afterCompletion方法在执行中即使抛出异常,也会被catch掉,不会影响其他方法的执行
判断上面的结合是否为null
处理请求的核心模版方法,留给子类比如DispatcherServlet实现
设置Cache-Control响应头
noHandlerFound();
createInvocableHandlerMethod(handlerMethod);
ture
//如果此请求已被处理完毕,比如application/json请求返回的JSON数据已被写入到了response中//那么不需要返回ModelAndView,也不需要渲染视图,返回null即可
重定向属性传递的处理
渲染视图render()
异常处理
return null;
return mav;
WebAsyncUtils.getAsyncManager(request);
调用父类的HttpServlet#service()
内部核心
校验住了
查找第一个最佳匹配
如果没有执行通过某个拦截器
checkMultipart(request);
异步请求处理相关,
调用handleInternal()
invokeHandlerMethod()
finally{}
CORS配置
2 通过HandlerMethodReturnValueHandler处理返回值 * 通过向Model模型添加属性并向mavContainer设置View视图 * 或调用mavContainer.setRequestHandled方法设置为true来指示已直接处理响应,通常application/json请求会执行该操作
AbstractHandlerMapping#getHandler()
mavContainer.getModel();
hasCorsConfigurationSource()
如果此前的handler和HandlerAdapter都找到了,并且通过了所有拦截器的preHandle校验
doDispatch();
核心方法
getHandlerAdapter();
handleReturnValue()
getModelAndView()
设置各种要用到的工具类属性
如果该方法还应用了@Validated校验,那么此时又会进行Validated校验规则,实际上此时的类对象是一个代理对象 * 它的控制器方法已被AOP增强,在方法实际调用之前将会应用Validated校验方法
getDataBinderFactory(handlerMethod);
发出请求已完成的信号
根据解析出来的参数数组反射调用目标方法,返回原始结果
获取WebDataBinderFactory,用于为当前请求创建一个 WebDataBinder实例,用于参数绑定
各种属性检验和赋值
0 条评论
回复 删除
下一页