SpringMVC运行流程图如下:
HandlerExcutionChain:处理器执行链,它是包含了Handler目标方法和所有相关拦截器的对象,它是由HandlerMapping获取的。
HandlerMapping:处理器映射器,它定义了请求到处理器之间的映射。就是说,要想通过请求找到处理器,就必须通过HandlerMapping。
HandlerAdapter:处理器适配器,在调用目标方法之前,需要做数据初始化,数据绑定,类型转换格式化等
问题1 :如果发送的请求没有对应的handler,那HandlerExcutionChain中的handler会不会为空呢?
情况1 :
实际情况是,如果配置了<mvc:default-servlet-handler />
且配置了<mvc:annotation-driven>
,<mvc:annotation-driven>
就会注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver三个Bean,其中handlerMappings中包含了SimpleUrlHandlerMapping(这个对象就是可以直接访问静态资源文件)和RequestMappingHandllerMapping(这个对象就是可以找到我们controller中的目标方法映射)。那springMVC在RequestMappingHandllerMapping找不到映射,则会认为是个静态资源,所以HandlerExcutionChain中的handler不会为空,但是最终也会报错404 + 请求路径 错误。
情况2 :
如果什么都没配置,那handlerMappings中只包含BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping,这两个映射器都无法获得handler,所以HandlerExcutionChain的handler为空,doDispatch会直接return 并报404错误 且没有请求路径。