configureDefaultServletHandling是什么意思?

Ver*_*ger 18 java spring spring-mvc

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

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}
Run Code Online (Sandbox Code Playgroud)

当这是我的WebContextApplication班级,一切正常,当它不存在时一切正常.那么这种方法的目的是什么?我的WebContextApplication班级应该有这种方法吗?为什么?

Ani*_*kur 11

由于JB Nizet已经尝试解释这两者都用于提供静态资源.

所以你的问题是你的基于Java的Spring配置

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) {     
    registry.addResourceHandler("/assets/**").addResourceLocations("/resources/bootstrap/"); 
}
Run Code Online (Sandbox Code Playgroud)

那么你为什么需要呢?

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}
Run Code Online (Sandbox Code Playgroud)

或者 <mvc:default-servlet-handler/>如果你有

<mvc:resources mapping="/assets/**" location="/resources/bootstrap/" />
Run Code Online (Sandbox Code Playgroud)

在xml配置方面.


要根据您提出的要求回答您的问题,您不需要覆盖,configureDefaultServletHandling()因为您已经覆盖并提供了静态资源映射.

通过重写addResourceHandlers()方法,您基本上要求ResourceHttpRequestHandler提供资源提到的资源位置.

但是,如果覆盖configureDefaultServletHandling()并启用它,则实际上是要求默认servlet(映射到"/")来提供资源.如果你使用这个,你需要注意几件事.引自文档 -

这允许将DispatcherServlet映射到"/"(从而覆盖容器的默认Servlet的映射),同时仍允许容器的默认Servlet处理静态资源请求.它配置DefaultServletHttpRequestHandler,其URL映射为"/**",并且相对于其他URL映射具有最低优先级.

此处理程序将所有请求转发到默认Servlet.因此,重要的是它按照所有其他URL HandlerMappings的顺序保持最后.如果您使用或者如果您要设置自己的自定义HandlerMapping实例,请确保将其order属性设置为低于DefaultServletHttpRequestHandler的值,即Integer.MAX_VALUE.