DiapatcherServlet 源码分析(四) - handlerMapping根据URL寻找handler

1. DiapatcherServlet.getHandler(HttpServletRequest request)

遍历所有的注册handler, 默认为:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		for (HandlerMapping hm : this.handlerMappings) {
			if (logger.isTraceEnabled()) {
				logger.trace(
						"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
			}
			//根据请求从缓存中找到对应的handler
			HandlerExecutionChain handler = hm.getHandler(request);
			if (handler != null) {
				return handler;
			}
		}
		return null;
	}

2.AbstractHandlerMapping.getHandler(HttpServletRequest request)

找到匹配的handler 

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


3.AbstractUrlHandlerMapping.getHandlerInternal(HttpServletRequest request)
遍历初始化时包装好的handlerMap,解析出对应的Conroller, 并包装成HandlerExecutionChain

	protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
		String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
		Object handler = lookupHandler(lookupPath, request);
		......
		return handler;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HandlerMapping是Spring MVC框架中的一个接口,用于将HTTP请求映射到处理程序(即控制器)。 以下是HandlerMapping接口的源代码: ``` public interface HandlerMapping { String BEST_MATCHING_HANDLER_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingHandler"; @Nullable HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; @Nullable default HandlerExecutionChain getHandler(HttpServletRequest request, boolean cache) throws Exception { if (cache) { Object handler = request.getAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE); if (handler != null) { return (HandlerExecutionChain) handler; } } HandlerExecutionChain handler = getHandler(request); if (cache && handler != null) { request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, handler); } return handler; } @Nullable default HandlerExecutionChain getHandlerInternal(HttpServletRequest request) throws Exception { return getHandler(request, true); } } ``` 该接口中定义了三个方法: 1. `getHandler(HttpServletRequest request)`:根据HTTP请求返回与之匹配的HandlerExecutionChain,如果没有匹配的则返回null。 2. `getHandler(HttpServletRequest request, boolean cache)`:根据HTTP请求返回与之匹配的HandlerExecutionChain,如果cache为true,则在request属性中查找是否已经缓存对应的HandlerExecutionChain,如果存在则直接返回。如果不存在则调用`getHandler(HttpServletRequest request)`方法,并将其缓存到request属性中。 3. `getHandlerInternal(HttpServletRequest request)`:该方法是`getHandler(HttpServletRequest request)`方法的默认实现,它会调用`getHandler(HttpServletRequest request, boolean cache)`方法,并将cache参数设置为true。 在Spring MVC中,有多种HandlerMapping的实现,如`RequestMappingHandlerMapping`、`SimpleUrlHandlerMapping`、`BeanNameUrlHandlerMapping`等。不同的HandlerMapping实现有不同的匹配规则和优先级,开发者可以根据自己的需要进行选择和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值