热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析SpringMVC中的HandlerMapping机制

本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。

前言


在SpringMVC框架中,理解DispatcherServlet与HandlerMapping的工作原理对于开发者来说至关重要。本文旨在通过分析源码,帮助读者深入了解这一过程。


一、基本概念


DispatcherServlet作为SpringMVC的核心组件,负责接收所有HTTP请求,并通过HandlerMapping找到相应的处理器。HandlerMapping的作用是根据请求信息确定具体的处理器(Controller中的方法),并返回一个HandlerExecutionChain对象给DispatcherServlet。


二、源码分析


1. 首先定位到DispatcherServlet类,找到其核心方法doDispatch(),该方法处理每一次HTTP请求。


protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 省略其他代码
HandlerExecutionChain mappedHandler = getHandler(processedRequest);
// 省略其他代码
}

在这个方法中,getHandler()方法是关键,它负责调用HandlerMapping来获取处理器执行链。


2. 追踪getHandler()方法,可以看到它遍历所有的HandlerMapping实例,直到找到合适的处理器。


protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : handlerMappings) {
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}

3. 在AbstractHandlerMapping类中,进一步追踪getHandler()方法,可以看到它首先尝试通过getHandlerInternal()获取处理器,如果未找到则使用默认处理器。


public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
Object handler = getHandlerInternal(request);
if (handler == null) {
handler = getDefaultHandler();
}
if (handler == null) {
return null;
}
return getHandlerExecutionChain(handler, request);
}

4. 最后,getHandlerExecutionChain()方法负责构建处理器执行链,包括处理器本身和可能的拦截器。


protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ? (HandlerExecutionChain) handler : new HandlerExecutionChain(handler));
String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
for (HandlerInterceptor interceptor : adaptedInterceptors) {
if (interceptor instanceof MappedInterceptor && ((MappedInterceptor) interceptor).matches(lookupPath, getPathMatcher())) {
chain.addInterceptor(((MappedInterceptor) interceptor).getInterceptor());
} else {
chain.addInterceptor(interceptor);
}
}
return chain;
}

三、总结


通过以上分析,我们可以清晰地看到SpringMVC中DispatcherServlet与HandlerMapping是如何协同工作,完成请求的分发和处理的。希望本文能帮助读者更好地理解和掌握SpringMVC的工作机制。


推荐阅读
author-avatar
林白LS
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有