"configureDefaultServletHandling" 是什么意思?

24

我正在尝试理解Spring MVC是如何工作的,但我不理解我Spring配置中的这部分代码:

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

当此方法存在于我的WebContextApplication类中时,一切都正常工作,当它不存在时一切也正常工作。所以这个方法的目的是什么?我的WebContextApplication类应该有这个方法吗?为什么?


3
它告诉Spring在某些请求中使用容器的默认servlet,例如静态资源。https://tomcat.apache.org/tomcat-7.0-doc/default-servlet.html#what 。 这是一种性能优化。 - Neil McGuigan
2
你不理解这个Javadoc中的什么内容:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.html. 你是否有静态资源?它们是如何处理的? - JB Nizet
2
是的,我有静态资源,使用以下方法:@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations("/resources/bootstrap/"); } - Vercryger
1个回答

12

正如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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接