SpringMVC源码--控制器Handler处理请求过程

      DispatcherServlet类的doDispatch()方法中,真正去处理请求的关键步骤是:

           HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

           ModelAndView   mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

      在第一步中根据我们已经获得的HandlerExecutionChain对象中包含的控制器Handler得到一个HandlerAdapter 接口实现类的适配器对象,第二步调用HandlerAdapter 接口的handle()方法。HandlerAdapter接口有多个实现类,对handle()方法的实现中都有最重要的一行代码:

      ((Controller) handler).handleRequest(request, response);

      可以看出来,是将handler强转为Controller接口的实现后调用其handleRequest()方法了,该方法实现在AbstractController类中,代码如下: 

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //检查请求类型是否被支持(get、post、head).
        checkAndPrepare(request, response, this instanceof LastModified);

        // Execute handleRequestInternal in synchronized block if required.
        if (this.synchronizeOnSession) {
            HttpSession session = request.getSession(false);
            if (session != null) {
                Object mutex = WebUtils.getSessionMutex(session);
                synchronized (mutex) {
                    return handleRequestInternal(request, response);
                }
            }
        }

        return handleRequestInternal(request, response);
 }

   handleRequestInternal()方法是由AbstractController类的子类实现的,针对不同的请求有不同的处理方法。

 比如MultiActionController类用来处理同一控制器类中多个请求方法的情况,代码如下:

 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        try {
            //获得请求的方法名称
            String methodName = this.methodNameResolver.getHandlerMethodName(request);
            //利用反射来调用方法
            return invokeNamedMethod(methodName, request, response);
        }
        catch (NoSuchRequestHandlingMethodException ex) {
            return handleNoSuchRequestHandlingMethod(ex, request, response);
        }
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值