在开发中,我们一般会在配置文件中加入<mvc:annotation-driven />和<mvc:default-servlet-handler />。
- 在两者都未加入时,我们也可以进行注解的方式进行开发,但是就会存在静态资源无法访问的问题。
- 在只加入<mvc:default-servlet-handler />时,虽然静态资源能够访问了,但是基于注解开发却无法使用了。
- 在只加入<mvc:annotation-driven />时,却恰恰相反,能够基于注解开发却无法访问静态资源。
- 在两者都加入时,便同时能够使用注解开发和访问静态资源。
接下来就探讨其中的缘由。
我们知道,在SpringMVC的执行流程中,SpringMVC会把请求交给HandlerMapping处理,由HandlerMapping返回一个HandlerExecutionChain。HandlerExecutionChain不直接调用Handler,而是通过HandlerAdapter去执行Handler。
所以,能否使用注解开发或访问静态资源,就取决于Spring中是否有对应的HandlerMapping和HandlerAdapter。
- SpringMVC在处理静态资源时,使用SimpleUrlHandlerMapping映射器处理器和HttpRequestHandlerAdapter处理器设配器,对应的处理器是DefultServletHttpRequestHandler。
- 使用注解方式开发时,使用RequestMappingHandlerMapping映射器处理器和RequestMappingrHandlerAdapter处理器设配器,对应的处理器则是使用@RequestMapping标识的方法。
- 当<mvc:annotation-driven />和<mvc:default-servlet-handler />都不加时:SpringMVC默认装配了下列HandlerMapping和HandlerAdapter:
BeanNameUrlHandlerMapping是基于配置文件开发的映射器处理器
SimpleControllerHandlerAdapter是基于配置文件开发的处理器适配器
在两者都不加是,SpringMVC装配了RequestMappingHandlerMapping和RequestMappingrHandlerAdapter,所以能使用注解开发,但在访问静态资源是,缺少SimpleUrlHandlerMapping处理器映射器,因此无法处理访问静态资源的请求。 - 当只加入<mvc:default-servlet-handler />时,SpringMVC装配了下列HandlerMapping和HandlerAdapter:
在只加<mvc:default-servlet-handler />的情况下,SpringMVC装配了SimpleUrlHandlerMapping和HttpRequestHandlerAdapter,因此能完成对静态资源的请求,但是缺少RequestMappingHandlerMapping处理器映射器和RequestMappingrHandlerAdapter处理器适配器,SpringMVC无法找到使用@RequestMapping表示的方法。
3. 当只加入<mvc:annotation-driven />时,SpringMVC装配了下列HandlerMapping和HandlerAdapter:
在只加<mvc:annotation-driven />的情况下,SpringMVC装配了RequestMappingHandlerMapping和RequestMappingrHandlerAdapter,所以能使用注解开发,但是缺少SimpleUrlHandlerMapping处理器映射器,SpringMVC无法处理访问静态资源的请求。
4. 当<mvc:annotation-driven />和<mvc:default-servlet-handler />都加时:SpringMVC装配了下列HandlerMapping和HandlerAdapter:
在<mvc:annotation-driven />和<mvc:default-servlet-handler />都加入的情况下,SpringMVC装配了RequestMappingHandlerMapping和RequestMappingrHandlerAdapter与SimpleUrlHandlerMapping和HttpRequestHandlerAdapter,所以能使用注解开发,也能处理访问静态资源的请求。