在Spring中提供静态内容-为什么我们需要addResourceLocations方法,而我们有addResourceHandler?

在Spring中提供静态内容-为什么我们需要addResourceLocations方法,而我们有addResourceHandler?,spring,spring-mvc,Spring,Spring Mvc,我想知道为什么我们有“addResourceLocations”方法,而我们有“addResourceHandler”方法 例如: @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**") .addResourceLocations("/resources/css/test"); } 在这里,

我想知道为什么我们有“
addResourceLocations
”方法,而我们有“
addResourceHandler
”方法

例如:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
    .addResourceLocations("/resources/css/test");
}

在这里,我在调用
addResourceHandler
方法时指定
“/resources/**”
。然后我使用
addResourceLocations
方法添加资源位置,这些资源位置应该是我在
addResourceHandler
中指定的URL的子文件夹,对吗?那么,为什么
addResourceHandler
本身不足以指定资源位置呢?它不是位置URL的超集吗?

addResourceHandler
接受您将在查看页面中使用的URL模式

addResourceHandler(java.lang.String…pathPatterns)

添加一个资源处理程序,用于基于 指定的URL路径模式。处理程序将为每个 与指定路径模式之一匹配的传入请求

另一方面,在
addResourceLocations
中指定资源的实际特定位置。Spring将查看此文件夹或位置,以解析url模式匹配的资源

addResourceLocations(java.lang.String…resourceLocations)

添加一个或多个用于提供静态内容的资源位置。每个位置必须指向一个有效的目录。倍数 位置可以指定为逗号分隔的列表,并且 将按指定的顺序检查给定资源的位置

例子 为了理解它们之间的差异,请考虑下面的例子。如果您配置

registry.addResourceHandler("/res/**")
        .addResourceLocations("/resources/");
然后你可以像这样在你的视图中使用它们

<link href="res/css/main.css" rel="stylesheet" type="text/css"/>

请注意,您的ResourceHandler被配置为URL模式
res/**
(您可以将其映射到其他模式),任何与此模式匹配的资源请求都将由处理程序处理

与对res/css/main.css的请求一样,SpringMVC将与该处理程序匹配,并要求该处理程序解决该问题。然后处理程序将尝试在您配置为
/resources/
的实际资源位置中查找
main.css
文件

更多阅读内容

  • 方法细节
  • 方法细节

addResourceHandler是ResourceHandlerRegistry的成员,而addResourceLocations是ResourceHandlerRegistry的成员,ResourceHandlerRegistry是ResourceHandlerRegistry.addResourceHandler本身的返回类型。。。请参考这里的文档:一个映射URL,另一个映射获取资源的位置-仅仅因为你映射了两个相同的位置,并不意味着每个人都这样做。事实上,将CSS映射到
/CSS/**
可能更有意义。例如,“这些资源位置应该是URL的子文件夹”-不。它们是服务资源的位置-即本地路径。