springmvc之dispatcherServlet请求过程

springmvc处理请求逻辑
在这里插入图片描述
只看这张图,总觉得对这个过程不是很了解;因此决定通过debug的方式来看dispatcherServlet处理请求的流程;
我们通过debug可以看到handlerMapping有什么用?
handlerAdapter适配器做了什么,怎么适配?

dispatcherServlet在收到请求后,会先执行doService方法,在这个方法中会调用doDispatch;请求的处理流程主要过程就是在这个方法中完成的;

1.进入到doDispatch

在这里插入图片描述

2.找到当前请求的handleMapping:

在这里插入图片描述
getHandler:

在这里插入图片描述

BeanNameUrlHandlerMapping:

在这里插入图片描述
RequeatMappingHandlerMapping(注解类的handlerMapping):
在这里插入图片描述

        看到这里我们已经清楚了,处理器映射器的作用。我在项目中配置了2个映射器:他们的作用就是将url和handler分别作为key,value存储在hashmap中;
        BeanNameUrlHandlerMapping:是处理xml中配置的controller;
        RequeatMappingHandlerMapping:是处理注解类的controller;
        到这一步我们已经能够根据当前request找到要执行的controller类,或者handlerMethod。我们不能直接执行方法吗?为什么还需要处理器适配器呢?
我们继续debug:
在这里插入图片描述

3.handler适配器

在这里插入图片描述
HandlerAdapter 源码:

	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");
	}

       可以看到如果找不到适配器会抛异常;这段代码的核心就是adapter.supports(handler),判断handler是属于什么类型的,根据handler的类型返回对应的适配器;实验配置的adpater有3类:

3.1.实现Controller

public class SimpleControllerHandlerAdapter implements HandlerAdapter {

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof Controller);//如果实现
	}
}

3.2.实现Servlet

public class SimpleServletHandlerAdapter implements HandlerAdapter {

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof Servlet);
	}

}

3.3.注解

public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {

	public final boolean supports(Object handler) {
		return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
	}

}

4.执行handler

在这里插入图片描述

和上面adapter一样,不同类型的handle实现不同;

4.1实现Controller类


public class SimpleControllerHandlerAdapter implements HandlerAdapter {
	@Override
	@Nullable
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return ((Controller) handler).handleRequest(request, response);
	}

}

4.2实现Servlet类

public class SimpleServletHandlerAdapter implements HandlerAdapter {
	@Override
	@Nullable
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		((Servlet) handler).service(request, response);
		return null;
	}

4.3注解

public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {

	@Override
	@Nullable
	public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return handleInternal(request, response, (HandlerMethod) handler);//执行RequestMappingHandlerAdapter的handleInternal方法,
	}

       看到这里可以解释,为什么找到handler之后还要找到对应的adapter,最后才执行handler;因为不同的handler类型,实际执行的方法不同;如果只考虑一种handler类型,那找到handler之后就应该立即执行handler而不需要搞一个adapter。但如果考虑到有多种handler,以后还能自定义拓展handler,那这种写法就非常好了;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值