configureDefaultServletHandling是什么意思?

2022-09-01 23:49:25

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

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

当这在我的课堂上时,一切正常,当它不存在时,一切也都很好。那么这种方法的目的是什么呢?我的类应该有此方法吗?为什么?WebContextApplicationWebContextApplication


答案 1

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

但是,如果您覆盖并启用它,那么您实际上是在要求默认的 servlet(映射到 “/”)来为资源提供服务。如果您正在使用它,则需要注意几件事。引用文档configureDefaultServletHandling() -

这允许将 DispatcherServlet 映射到 “/”(从而覆盖容器的默认 Servlet 的映射),同时仍然允许静态资源请求由容器的默认 Servlet 处理。它配置一个 DefaultServletHttpRequestHandler,其 URL 映射为“/**”,相对于其他 URL 映射的优先级最低。

此处理程序会将所有请求转发到默认的 Servlet。因此,重要的是,它按照所有其他 URL 处理程序映射的顺序保持最后。如果您使用或正在设置自己的自定义 HandlerMapping 实例,请确保将其 order 属性设置为低于 DefaultServletHttpRequestHandler 的值(即 Integer.MAX_VALUE)的值,则会出现这种情况。


答案 2

推荐