DispatcherServlet(SpringMVC容器初始化:init--->处理请求流程:doDispatch)
2020-12-01 14:38:00 1 举报
DispatcherServlet(SpringMVC容器初始化:init--->处理请求流程:doDispatch)
作者其他创作
大纲/内容
N
初始化方法最后
org.springframework.web.servlet.view.AbstractView#render
extends
spring容器会将其加载到容器中,beanName以/开头。这个解析器就会到容器中取以/开头的实例
预留出的扩展接口postProcessWebApplicationContext(wac);
创建数据和Model工厂
针对不同的请求,通过handlermapping获取对应的handler
如果返回的是ModelAndView
initServletBean()
根据获取的handler找到对应的处理器适配器
//最后一步:发布相应的事件。\t\t\t\tfinishRefresh();
创建servlet请求对象
HandlerMethod
FrameworkServlet
onApplicationEvent方法
DispatcherServlet
发布事件
ApplicationContextAware
业务自行处理,不需要ModelAndView传到视图
finally
先通过映射找到对应的适配器
使给定的方法可访问,如果必要的ReflectionUtils.makeAccessible(getBridgedMethod());
最终调spring容器的初始化方法
通过管理器注册一个异步线程任务负责回滚
直接return
RequestMappingHandlerMapping解析注解@RequestMapping配置的url
遍历viewResolvers,使用视图解析器viewResolver去解析viewName,返回解析后的视图
首先检查是否是文件上传
for (ViewResolver viewResolver : this.viewResolvers) { View view = viewResolver.span style=\"font-size: inherit;\
容器的初始化
mv = ((ModelAndViewDefiningException) exception).getModelAndView();
获取所有的拦截器调用后置处理
EnvironmentAware
implements
获取当前请求的方法参数值,并通过参数解析器检查提供的参数值
HandlerAdapter
ServletException
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
扩展接口:暂时无方法实现initFrameworkServlet();
适配调用的handler:
DispatcherServlet#onRefresh
HttpServlet
XLS:AbstractXlsView
核心方法:处理请求
mappedHandler = getHandler(processedRequest);
org.springframework.web.servlet.FrameworkServlet#initWebApplicationContext
最后将返回的数据渲染到视图
首先设置国际化
SimpleServletHandlerAdapter
如果不是,就按照自定义的处理器处理返回自定义视图
处理程序是否返回了要呈现的视图
HandlerMapping
HttpServletBean
SimpleUrlHandlerMapping解析手动XML配置url与controller映射
Controller
具体实现
将初始化的属性赋值
HttpRequestHandlerAdapter
LocaleContextHolder通过该处理器对请求进行国际化语言处理
SimpleControllerHandlerAdapter
再通过适配器找到对应的处理器
设置视图
RequestContextHolder:通过该处理器获取请求的属性,并封装到ServletRequestAttributes
BeanNameUrlHandlerMapping解析mapping.xml中以beanName配置的url
handlerMappings通过request获取到对应的handler
填充属性
response.setLocale(locale);
将视图转换成需要的格式并返回前端
针对回滚创建异步执行线程请求和管理器
org.springframework.web.servlet.FrameworkServlet#initServletBean
//文件上传相关的解析器\t\tinitMultipartResolver(context);\t\t//国际化语言\t\tinitLocaleResolver(context);\t\t//主题\t\tinitThemeResolver(context);\t\t//处理器映射器\t\tinitHandlerMappings(context);\t\t//处理器适配器\t\tinitHandlerAdapters(context);\t\t//处理异常的解析器\t\tinitHandlerExceptionResolvers(context);\t\t//请求url到具体视图的转换器\t\tinitRequestToViewNameTranslator(context);\t\t//视图解析器\t\tinitViewResolvers(context);\t\t//初始化FlashMapManager策略组件\t\tinitFlashMapManager(context);
调用处理器
请求
标准控制器,返回ModelAndView
org.springframework.web.servlet.HttpServletBean#init
servlet核心类,通过doGet、doPost、doDelete和doPut等处理请求。最终都是通过service方法
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
Y
获取拦截器,进行后置拦截处理
让子类进行各项初始化
Get
初始化各种分发逻辑
如果属于内部异常ModelAndViewDefiningException
DispatcherServlet#resolveViewName
this.refreshEventReceived = true; synchronized (this.onRefreshMonitor) { onRefresh(event.getApplicationContext());}
this.webApplicationContext = initWebApplicationContext();
将处理器封装到处理器执行链,返回执行的结果
RequestMappingHandlerAdapter
private final Object handler; @Nullable private HandlerInterceptor[] interceptors; @Nullable private List<HandlerInterceptor> interceptorList;
处理处理程序选择和处理程序调用的结果,要么是模型和视图,要么是要解析为模型和视图的异常。
WebAsyncManager
Servlet
initServletBean();
核心方法:doDispatch
doGet
processedRequest = checkMultipart(request);
HttpRequestHandler
HandlerExecutionChain
org.springframework.web.servlet.HandlerAdapter#handle
具体的实现类:执行处理器方法
wac.refresh();
。。。
org.springframework.context.support.AbstractApplicationContext#refresh
Could not resolve view with name
先判断异常是否存在
获取viewName再通过viewName获取view。如果viewName为null,就直接获取mv中的view。如果最后获取view是null,抛异常ServletException
通过传进来的处理器创建Servlet可调用处理程序方法对象
Set bean properties from init parameters
doInvoke(args)
Script:ScriptTemplateView
给指定的模型,渲染视图。
由FrameworkServlet来监听
如果没有解析器可以解析
publishEvent(new ContextRefreshedEvent(this));
wac = createWebApplicationContext(rootContext);
org.springframework.web.servlet.FrameworkServlet#configureAndRefreshWebApplicationContext
管理异步请求处理的中央类(主要作为一个SPI)
执行请求
基于标准的Servlet来处理
对servlet的实例封装和生命周期实现
PDF:AbstractPdfView
AbstractHandlerMethodAdapter
基于@RequestMapping对应的方法处理
0 条评论
回复 删除
下一页