HandlerMapping处理器映射器
简介: 处理器映射器,负责根据用户请求找到相应的将要执行的 Handler,即处理器。即用于完成将用户请求映射为要处理该请求的处理器,并将处理器封装为处理器执行链传给中央调度器。
HandlerMapping的执行流程
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null) {
this.noHandlerFound(processedRequest, response);
return;
}
}
....
}
}
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
BeanNameUrlHandlerMapping
-
处理器
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "Hello SpringMVC");
mv.setViewName("/WEB-INF/jsp/welcome.jsp");
return mv;
}
}
-
以BeanNameUrlHandlerMapping的方式注册处理器
<bean id="/my.do" class="com.chuangmei.handler.MyController"/>
<bean id="/hello.do" class="com.chuangmei.handler.MyController"/>
SimpleUrlHandlerMapping
-
处理器
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "Hello SpringMVC");
mv.setViewName("/WEB-INF/jsp/welcome.jsp");
return mv;
}
}
-
以SimpleUrlHandlerMapping方式注册处理器
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">myController</prop>
<prop key="/aaa.do">myController</prop>
</props>
</property>
</bean>
<bean id="myController" class="com.chuangmei.simpleUrlHandlerMapping.myController"/>
HandlerAdapter处理器适配器
-
通过调用getHandlerAdapter(Object handler)方法,遍历所有的HandlerAdapter,调用HandlerAdapter的supports(handler)方法,supports底层通过处理器实现的接口进行instanceof
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
Iterator var2 = this.handlerAdapters.iterator();
while(var2.hasNext()) {
HandlerAdapter adapter = (HandlerAdapter)var2.next();
if (adapter.supports(handler)) {
return adapter;
}
}
}
}
-
adapter的supports(handler)方法
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
public boolean supports(Object handler) {
return handler instanceof Controller;
}
}
public class HttpRequestHandlerAdapter implements HandlerAdapter {
public boolean supports(Object handler) {
return handler instanceof HttpRequestHandler;
}
}
.......
-
通过以上的程序找到HandlerAdapter之后,会调用HandlerAdapter的handle(processedRequest, response, mappedHandler.getHandler())方法,返回一个ModelAndView对象,底层调用那个handle方法取决于supports()方法返回的ha是谁
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
-
handle(processedRequest, response, mappedHandler.getHandler())底层实现
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
((HttpRequestHandler)handler).handleRequest(request, response);
return null;
}
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\
return ((Controller)handler).handleRequest(request, response);
}
........