我试图理解Spring MVC是如何工作的,我在Spring配置中不理解这部分代码:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
当我在WebContextApplication
课程中时,一切正常,当它不存在时一切正常。那么这种方法的目的是什么?我的WebContextApplication
班级应该有这种方法吗?为什么?
答案 0 :(得分:11)
正如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(映射到&#34; /&#34;)来提供资源。如果你使用这个,你需要注意几件事。引自docs -
这允许将DispatcherServlet映射到&#34; /&#34; (从而覆盖容器的默认Servlet的映射),同时仍然允许容器的默认Servlet处理静态资源请求。它配置一个DefaultServletHttpRequestHandler,其URL映射为&#34; / **&#34;和相对于其他URL映射的最低优先级。
此处理程序将所有请求转发到默认Servlet。因此,重要的是它按照所有其他URL HandlerMappings的顺序保持最后。如果您使用或者如果您要设置自己的自定义HandlerMapping实例,请确保将其order属性设置为低于DefaultServletHttpRequestHandler的值,即Integer.MAX_VALUE。