HandlerAdapter-处理器适配器

HandlerAdapter的作用:

为什么要有适配器:

因为处理器 handler 的存在形式会有不同,且具体处理请求的方法也会各不相同:

handler 为 org.springframework.web.servlet.mvc.Controller 类型的 Bean 时,则调用其 handleRequest() 方法处理请求

handler 为 org.springframework.web.HttpRequestHandler 类型的 Bean 时,则调用其 handleRequest() 方法处理请求

handler 为 javax.servlet.Servlet 类型的 Bean 时,则调用其 service() 方法处理请求

handler 为 org.springframework.web.method.HandlerMethod 类型的对象时,则调用其 invokeAndHandle() 方法处理请求

所以,为了将处理请求的代码在形式上做统一,所以采用了适配器模式(对外统一,使用某种适配器,间接地操控某同种类型的 handler)

抽离出 HandlerAdapter 对象,统一调用 HandlerAdapter 的 handle() 方法来处理请求(这种基本的抽象能力,我们需要学习

public interface HandlerAdapter {
	boolean supports(Object handler); //当前适配器,是否适配于这个handler
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; //调用handler中处理请求的方法
	//...
}

来看一下都有哪些处理器适配器的实现:

在这里插入图片描述

对于org.springframework.web.servlet.mvc.Controller 类型的 handler,使用 SimpleControllerHandlerAdapter 进行适配

对于org.springframework.web.HttpRequestHandler 类型的 handler,使用 HttpRequestHandlerAdapter 进行适配

对于javax.servlet.Servlet 类型的 handler,使用 SimpleServletHandlerAdapter 进行适配

对于org.springframework.web.method.Method类型的 handler,使用 RequestMappingHandlerAdapter 进行适配 (开发中常用的HandlerAdapter)
举例:HttpRequestHandler

public class HttpRequestHandlerAdapter implements HandlerAdapter {
	// 若当前 handler 为 HttpRequestHandler 类型,则返回true,表示支持适配
	@Override
	public boolean supports(Object handler) {  
		return (handler instanceof HttpRequestHandler);
	}
	//调用 HttpRequestHandler 类型的 handler 的 handleRequest() 方法处理请求
	@Override
	@Nullable
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

		((HttpRequestHandler) handler).handleRequest(request, response);
		return null;
	}
	//...
}

适配器模式
在这里插入图片描述

HandlerAdapter的使用:

DispatcherServlet # doDispatch 方法中对 HandlerAdapter 的使用:(有两句代码)

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

① getHandlerAdapter() 方法:根据指定的 handler 得到合适的 HandlerAdapter

遍历所有的 handlerAdapters,分别调用其supports() 方法判断当前 handlerAdapter 是否适配该 handler

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
    if (this.handlerAdapters != null) {
        for (HandlerAdapter adapter : this.handlerAdapters) {
            // 若 adapter 适配当前 handler,则返回
            if (adapter.supports(handler)) {  
                return adapter;
            }
        }
    }
    throw new ServletException("...");
}

② ha.handle():调用 handler 中相应的处理请求方法,来处理请求

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值