5. DispatcherServlet:Spring MVC的核心 -- getHandler()解析

上文中提到在DispatcherServlet.doDispatch()方法中,通过getHandler()方法获取HandlerExecutionChain对象(处理器执行链)

那么接下来就讲一讲这个方法:

    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        Iterator var2 = this.handlerMappings.iterator();

        HandlerExecutionChain handler;
        do {
            if (!var2.hasNext()) {
                return null;
            }

            HandlerMapping hm = (HandlerMapping)var2.next();
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("Testing handler map [" + hm + "] in DispatcherServlet with name '" + this.getServletName() + "'");
            }

            handler = hm.getHandler(request);
        } while(handler == null);

        return handler;
    }

getHandler()涉及一个设计模式——拦截过滤器模式,它会从List<HandlerMapping> handlerMappings中遍历查找对应的HandlerMapping对象,并由HandlerMapping对象创建HandlerExecutionChain对象。List<HandlerMapping> handlerMappings是初始化时在initStrategies()方法中完成的(在上一篇DispatcherServlet的初始化过程 提到过)

HandlerMapping的getHandler()方法是一个接口

实现类为AbstractHandlerMapping.class

    public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        // 根据请求查找对应的handler
        Object handler = this.getHandlerInternal(request);
        if (handler == null) {
            // 没有找到,则会使用getDefaultHandler()方法获取默认的处理器
            handler = this.getDefaultHandler();
        }

        if (handler == null) {
            return null;
        } else {
            if (handler instanceof String) {
                String handlerName = (String)handler;
                handler = this.getApplicationContext().getBean(handlerName);
            }

            HandlerExecutionChain executionChain = this.getHandlerExecutionChain(handler, request);
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值