3. 方法和方法参数:HandlerMethod和MethodParamter

1.DispatcherServlet

属性:两个重要属性 – handler的映射和 handler的适配器

image.png

操作:getHandler和doDispatch,最关键的就是doDispatch()

getHandler():遍历所有的handlerMapping,让他们去拿handler,最后找到合适的handlerMapping,拿出handler链。

image.png

doDispatch():根据request调用上面的方法(遍历所有handlerMapping,拿出handler链),最后得到handler链,通过handler链拿出真正的handler@HandlerMethod,然后根据这个handler找到合适的Adapter

,最后通过adapter去执行此handler。

image.png

2. HandlerExecutionChain

属性:handler、interceptors(拦截器数组)、interceptorList(拦截器集合)

从这里也可以看出,处理执行链 就是一个handler(可以看成controller、里面有bean、method、methodParams),和各种拦截器组成的一个类。

image.png

操作:大部分都是和拦截器有关的。不做介绍。不过看下这个,返回handler。

image.png

简单介绍一下Interceptor吧,共有三个主要的方法。注意参数都是 request、response、handler。(由此应该能退出拦截器的作用了吧。)

image.png

3. handlerMapping

属性无

操作:getHandlerI()、返回请求处理链

image.png

他的继承链(注意,所有实现这个接口的类必须实现getHandler,返回请求处理链):

image.png

子类介绍

MatchableHandlerMapping接口继承了他,并且增加了一个方法。

image.png

AbstractHandlerMapping类实现了它

image.png

属性:属性没什么重要的,不过留意一下 urlPathHelper、interceptors、adaptedInterceptors

image.png

操作:这里面有几个很重要的getHandler()、getHandlerInternal()、urlPathHelper的setter、getter 。 前面的方法调用了后面的。后面是抽象方法,在子类AbstractUrlHandlerMapping里实现

image.pngimage.pngimage.pngimage.pngimage.pngimage.png

AbstractUrlHandlerMapping

属性:没有重要的,不写了

操作:比较熟悉的有getHandlerInternal()、lookupHandler()。第一个方法调用了第二个。而且第一个的返回结果是Handler。第二个方法没看懂,暂时先不写。

image.pngimage.png

完整的调用逻辑

好,由上面的铺垫,我们完整的梳理一遍逻辑

1.请求 -> 2.DispatcherServlet#doDispatch() -> 3.自身getHandler()得到HandlerExecutionChain ->4.从执行请求链里拿出handler,找的相应的adpater。

image.pngimage.png

细究步骤3:遍历所有的handlerMapping(HandlerMapping是个接口,里面只有一个getHandler()),每个mapping调用自己的getHandler()(其实调用的是AbstractHandlerMapping里的getHandler(),最后返回 请求执行链类型的handler),然后去找他的adapter类。

)(其实调用的是AbstractHandlerMapping里的getHandler(),最后返回 请求执行链类型的handler),然后去找他的adapter类。

image.png

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception是一个Spring框架中的异常类,用于表示处理器调度失败的情况。在这个异常的引用内容中,和都提到了同一个异常类和错误信息。具体的错误原因是java.lang.OutOfMemoryError: Java heap space和java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.setContentLengthLong(J)V。其中,OutOfMemoryError表示Java堆空间已满,而NoSuchMethodError表示无法找到指定的方法。根据引用内容,这些错误通常是由于代码中的一些问题导致的,比如内存使用过多或方法调用错误。然而,具体的处理方法需要根据问题的具体情况来确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java head space.txt](https://download.csdn.net/download/z90708833_yp/11856526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [错误:org.springframework.web.util.NestedServletException: Handler dispatch failed; nested ...](https://blog.csdn.net/weixin_54208451/article/details/126079514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值