正如JB Nizet已经尝试解释的那样,两者都用于提供静态资源。
因此,你的问题是关于你基于Java的Spring配置中有一个
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("/resources/bootstrap/");
}
那么为什么你需要呢?
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
或者为什么要使用<mvc:default-servlet-handler/>
,如果你有
<mvc:resources mapping="/assets/**" location="/resources/bootstrap/" />
就 XML 配置而言,根据您提供的要求回答您的问题,您不需要覆盖 configureDefaultServletHandling()
方法,因为您已经覆盖并提供了静态资源映射。
通过覆盖 addResourceHandlers()
方法,您实际上是在请求 ResourceHttpRequestHandler
来服务于所提到的资源位置。
然而,如果您覆盖 configureDefaultServletHandling()
并启用它,您实际上是在要求默认的 Servlet(映射到"/")来服务于这些资源。如果您使用此方法,有几件事情需要注意。引用自文档 -
这允许将 DispatcherServlet 映射到 "/"(从而覆盖容器默认 Servlet 的映射),同时仍允许容器的默认 Servlet 处理静态资源请求。它会使用 URL 映射 "/**" 配置一个 DefaultServletHttpRequestHandler,并相对于其他 URL 映射具有最低优先级。
此处理程序将所有请求转发给默认 Servlet。因此,它很重要的是它始终保持在所有其他 URL HandlerMappings 的顺序中的最后一位。如果您使用 <mvc:annotation-driven/>
,那么将会是这种情况;或者,如果您正在设置自定义的 HandlerMapping 实例,确保将其 order 属性设置为低于 DefaultServletHttpRequestHandler 的值,即 Integer.MAX_VALUE。
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations("/resources/bootstrap/"); }
- Vercryger