SpringMVC—C的含义

SpringMVC的Control功能主要由 HandlerMappingHandlerAdapters两个组件提供


一、HandlerMapping组件


主要提供对handler的查找,举个例子

SimpleUrlHandlerMapping:字面意思,url到handler的映射,也就是url到控制器的映射

我们知道,dispatcherServlet的各种组件的初始化是在Spring容器的初始化中完成的,SimpleUrlHandlerMapping的初始化重要的两步:

  (1). 将所有interceptor对象(拦截器,相当于一个个filter)保存在adapterInterceptor数组中,等到请求到来时执行其中所有拦截器
  (2). 将URL与handler的映射关系保存到handlerMap中   



二、HandlerAdapter组件

有HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter等,这些适配器的存在是为了适配多种处理器,让DispatcherServlet在调用时可以通过调用这些handlerAdapter的方法来调用到目标处理器的方法,举个例子



工作原理:handlerAdapter初始化时会保存在DispatcherServlet中的handlerAdapter集合中,当有url到来映射到某个handler时,在handlerAdapter集合中查询是哪个handlerAdapter support我们所要找的这个Handler,然后支持该handler的这个handlerAdapter对象会被返回,并调用这个对象的接口的方法(通过反射得到该对象接口?)

举个例子:如果请求是在找一个Controller的子类handler,则会找到SimpleControllerHandlerAdapter
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
public SimpleControllerHandlerAdapter() {
}

public boolean supports(Object handler) {
return handler instanceof Controller ;
}

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((Controller)handler).handleRequest(request, response);
}

public long getLastModified(HttpServletRequest request , Object handler) {
return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : - 1L ;
}
}

此时,Dispatcher会调用handlerAdapter的handle方法,实际上是调用了目标handler的handleRequest方法



整个SpringMVC的调用是在DispatcherServlet的doService方法开始的,在该方法中会将ApplicationContext,localeResolver等对象添加进request中,然后调用doDispatch实现转发, 它里面保存了重要的handlerMapping和handlerAdapter,所以说,所有请求都要经由DispatcherServlet,可以说,它的身份是一个交接者


在doDispatch()方法中有比较重要的几行代码为:
获得请求的handler对象,并执行HandlerExecutionChain(mappedHandler)里的所有interceptor

获得请求对应的handler对应的handlerAdapter

调用该handlerAdapter的handle方法,从中我们也可以发现,不管你实际用的是哪种handler,最终返回的结果都是modelAndView对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值