MVC 模式 是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
Spring MVC 最核心的思想是 DispatcherServlet
。
浏览器发起一个请求执行步骤:
三个核心组件:
DispatcherServlet 最核心的方法就是 doDispatch ,doDispatch 主要做了四件事:
DispatcherServlet.doDispatch
核心源码如下:
// 根据 request 找到当前请求的处理程序 Handler
mappedHandler = getHandler(processedRequest);
// 根据 Handler 找到当前请求的处理程序适配器 HanderAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 用处理器适配器 HanderAdapter 调用处理程序 Handler
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 处理经过以上步骤的结果
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
根据 request 并通过 HandlerMapping 找到对应的 handler 代码如下:
HandlerMapping 接口的实现类: SimpleUrlHandlerMapping、RequestMapingHandlerMapping(最常用的)
、BeanNameUrlHandlerMapping、WelcomePageHandlerMapping、SimpleUrlHandlerMapping。
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
// 迭代 HandlerMapping 集合
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
1、根据 request 找到对应的 HandlerMapping。
2、在具体的 HandlerMapping 中根据请求路径找到处理程序 Handler,Handler是被@RequestMapping注解的一个方法。
3、在 HandlerMapping 中根据请求路径查找是否配置了拦截器,并返回处理程序执行链 HandlerExecutionChain 对象。
根据 Handler 找到当前请求的处理程序适配器 HanderAdapter 代码如下:
HanderAdapter 接口实现类: RequestMappingHandlerAdapter、HttpRequestHamdlerAdapter、SimpleControllerHandlerAdapter。
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
本文地址:https://blog.csdn.net/const_/article/details/107457263
如对本文有疑问, 点击进行留言回复!!
Algebra:Chapter 0 - 预备知识: 集合论和categories
springboot + vue上传图片在服务器并实现在线预览
请谨慎使用增强for循环,刚接触Java值得一看(手动狗头)
【Nginx】还不会使用Nginx解决跨域问题?肝这一篇就够了!!
网友评论