Spring-MVC-HandlerMapping
Spring HandlerMapping
-
Author: HuiFer
-
源码阅读仓库: SourceHot-spring
-
源码路径:
org.springframework.jms.annotation.EnableJms
-
org.springframework.web.servlet.HandlerMapping
-
HandlerMapping 处理映射关系, 通过请求转换成对象
HandlerExecutionChain
|
|
|
|
-
getHandlerInternal
方法是一个抽象方法1 2
@Nullable protected abstract Object getHandlerInternal(HttpServletRequest request) throws Exception;
存在的实现方法
-
先看
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#getHandlerInternal
方法是怎么一回事.
|
|
UrlPathHelper
-
全路径:
org.springframework.web.util.UrlPathHelper
-
几个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/** * 是否全路径标记 */ private boolean alwaysUseFullPath = false; /** * 是否需要 decode */ private boolean urlDecode = true; private boolean removeSemicolonContent = true; /** * 默认的encoding编码格式 */ private String defaultEncoding = WebUtils.DEFAULT_CHARACTER_ENCODING;
getPathWithinApplication
|
|
- 从 request 中获取 context-path
- 从属性中直接获取
- 从 request 中调用 getContextPath 获取
- 判断是否是**
/
** - decode request string
- 从 request 中虎丘 request-uri
- 从属性中获取
- 从 request 中调用 getRequestURI 获取
- decode
- 获取剩余路径
getContextPath
- 获取 context-path 地址
|
|
decodeRequestString
- 判断是否需要编码, 需要编码就做编码操作,不需要就直接返回
|
|
decodeInternal
- 编码方法
|
|
determineEncoding
- 确认编码
|
|
getRequestUri
- 获取 uri 地址
|
|
decodeAndCleanUriString
- 编码和清理数据
|
|
shouldRemoveTrailingServletPathSlash
-
是否删除 servlet path 后的斜杠
-
默认是 false .
-
代码流程
- 通过 classLoader 加载
"com.ibm.ws.webcontainer.WebContainer"
- 调用方法
"getWebContainerProperties"
- 从方法结果中取
"getWebContainerProperties"
- 通过 classLoader 加载
|
|
decodeMatrixVariables
- 编码修改方法
|
|
- 与这个方法对应的还有
decodePathVariables
decodePathVariables
|
|
- 回到
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#getHandlerInternal
|
|
- 设置属性上锁开锁就不具体展开了.
lookupHandlerMethod
-
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#lookupHandlerMethod
方法 -
第一部分
|
|
-
创建一个匹配 list,将匹配结果放入
List<Match> matches = new ArrayList<>();
-
从 map 中获取数据
List<T> directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath);
1 2 3 4
@Nullable public List<T> getMappingsByUrl(String urlPath) { return this.urlLookup.get(urlPath); }
urlLookup 是
MultiValueMap
接口.key:url value:mapping
-
addMatchingMappings 方法
1 2 3 4 5 6 7 8 9
if (directPathMatches != null) { // 添加匹配映射 addMatchingMappings(directPathMatches, matches, request); } if (matches.isEmpty()) { // No choice but to go through all mappings... // 添加匹配映射 addMatchingMappings(this.mappingRegistry.getMappings().keySet(), matches, request); }
1 2 3 4 5 6 7 8 9 10 11 12
private void addMatchingMappings(Collection<T> mappings, List<Match> matches, HttpServletRequest request) { for (T mapping : mappings) { // 抽象方法 // 通过抽象方法获取 match 结果 T match = getMatchingMapping(mapping, request); // 是否为空 if (match != null) { // 从 mappingLookup 获取结果并且插入到matches中 matches.add(new Match(match, this.mappingRegistry.getMappings().get(mapping))); } } }
-
getMatchingMapping
方法是一个抽象方法1
protected abstract T getMatchingMapping(T mapping, HttpServletRequest request);
-
org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping#getMatchingMapping
1 2 3 4
@Override protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) { return info.getMatchingCondition(request); }
-
第二部分
|
|
- 一行行开始分析
|
|
- 抽象方法
getMappingComparator
|
|
-
实现方法
1 2 3 4
@Override protected Comparator<RequestMappingInfo> getMappingComparator(final HttpServletRequest request) { return (info1, info2) -> info1.compareTo(info2, request); }
内部定义了 compareTo 方法
-
执行完成比较方法后创建对象
MatchComparator
-
对象创建后进行排序,排序后取出第一个元素作为后续操作的基准对象
|
|
|
|
- 取出第一个元素和第二个元素进行比较. 如果两个 match 相同, 出现异常
最后两个方法
|
|
-
handleMatch
1 2 3
protected void handleMatch(T mapping, String lookupPath, HttpServletRequest request) { request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, lookupPath); }
设置一次属性
这个方法子类会继续实现
org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping#handleMatch
|
|
handleNoMatch
也是同类型操作org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#handleNoMatch
org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping#handleNoMatch
|
|
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/code/docs/Spring/mvc/Spring-MVC-HandlerMapping/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com