通过SpringInitializer进行项目创建
文件->新建项目->选中SpringInitializer->勾选所需的插件和项目类型(本次勾选插件为:lombok、dev-tools、SpringConfigurationProcessor,项目类型选择SpringWeb),类型选择maven,选择springboot版本,java版本笔者选择的是8,
笔者在构建过程中遇到几个问题
1.在勾选插件和项目类型界面时提示服务器URL连接失败,需要更换网址为https://start.springboot.io/
2.在构建好项目,通过maven下载jar包的时候报错,需要在设置中更改maven的设置文件路径和本地仓库路径,然后重新构建项目。
访问静态资源:只要静态资源放在类路径下: called /static
(or /public
or /resources
or /META-INF/resources
就可以通过当前项目根路径/ + 静态资源名 进行访问
不妨在项目自动创建的static文件夹下放一张图片11.jpg,启动项目,在浏览器中输入http://localhost:8080/11.jpg,会显示刚才存储的图片。
那么,如果有同名的动态资源又会如何呢?
我们创立一个Controller,并使用@RequestMapping("/11.jpg")注解一个输出“hello”的函数,形成一个动态资源。再次启动项目,会发现系统会访问动态资源
原理:静态映射/**。/**代表会拦截所有的请求和子请求。
补充: /* 和 /** 的区别:
/* 是拦截所有请求,不包含子请求
/** 是拦截所有的请求及里面的子请求
举例:/* 能拦截/a、/b,但是拦不老/a/b、/a/c
/** 能拦截/a 、/b、/a/b、/a/b/c等
所以请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面。
修改静态资源访问前缀:静态资源默认是无前缀的,可以通过配置属性实现自定义
在application.yaml文件中可以修改前缀:
spring:
mvc:
static-path-pattern: /res/**
现在代表只有路径包含/res的才能在静态资源文件夹下找。
注意:对spring的属性进行自定义时可以不使用@ConfigurationPorperties注解进行绑定。
修改静态资源访问路径 :
同样在application.yaml文件中修改:
spring:
mvc:
static-path-pattern: /res/**
web:
resources:
static-locations: classpath:haha
指定静态资源只在haha文件夹下查找。
此时在浏览器中输入11.jpg会显示Whitelabel Error Page,我们在resources目录下建立haha文件夹,放入11.jpg,此时再次运行即可正常显示图片。
欢迎页支持
根据官方文档,springboot会在静态资源路径下寻找名为index.html的文件作为欢迎页,或者寻找一个能处理/index请求的controller类作为欢迎页。
我们编写一个index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome!</h1>
</body>
</html>
注意:如果想要实现自动将index.html文件作为欢迎页,我们需要注释掉之前在yaml中对静态资源访问前缀所作的配置,如果对静态资源访问路径进行了修改的话,那么index.html必须放到指定的文件目录下,否则访问网页时会显示Whitelabel Error Page。
访问http://localhost:8080/,可以看到index.html里面的内容。
网页图标的自定义
只需要把名为favicon.ico的文件放到静态资源的目录下系统即可自动配置。文件名字不可自定义。
静态资源配置原理
根据开发日记(7)我们可以知道springboot在启动时会默认加载xxxAutoConfiguration类,即各种自动配置类,然后按需求生效。
其中与SpringMVC有关的自动配置类是WebMvcConfiguration。通过源码分析我们找到一个名为WebMvcAutoConfigurationAdapter
的配置类,这个配置类开启了WebMvcProperties
和WebProperties
这两个类的的属性绑定,再去这两个类的源码寻找我们可以发现:这两个类分别与spring.mvc和spring.web这两个前缀的属性进行绑定。
注意:如果一个配置类只有一个有参构造器,那么这个有参构造器所有参数的值都从容器中确定。
//ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
//WebMvcProperties mvcProperties 获取和spring.mvc绑定的所有的值的对象
//ListableBeanFactory beanFactory Spring的beanFactory
//HttpMessageConverters 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer 找到 资源处理器的自定义器。=========
//DispatcherServletPath
//ServletRegistrationBean 给应用注册Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.resourceProperties = resourceProperties;
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
}
资源处理的默认规则:在WebMvcConfiguration中接着向下看可以找到一个名为addResourceHandlers的方法
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
//这里配置的就是webjars资源映射
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
//这里配置的就是静态资源映射
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
registration.addResourceLocations(new Resource[]{resource});
}
});
}
}
可以发现第一个if判断中是对resourceProperties进行判断,那么顺藤摸瓜,我们去找resourceProperties,发现这一语句private final WebProperties.Resources resourceProperties;
。再从Resources下手,发现Resources这个类有一个addMappings属性和isAddMappings()
方法。也就是说,我们可以通过在yaml文件中对resources的add-mappings这一属性是true还是false从而实现控制这个函数。所以我们在yaml文件中添加以下属性
web:
resources:
add-mappings: false
这样就会禁用所有静态资源规则,此时所有静态资源不论怎样都不会被访问了。
addResourceHandler函数还可以通过自身拦截的功能实现访问服务器本地资源
@Configuration
public class MyWebMVCConfig implements WebMvcConfigurer {
@Value("${file.location}") // D:/test/
String filelocation; // 这两个是路径
@Value("${file.path}") // /file/**
String filepath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//匹配到resourceHandler,将URL映射至location,也就是本地文件夹
registry.addResourceHandler(filepath).addResourceLocations("file:///" + filelocation);//这里最后一个/不能不写
}
}
代表如果访问filepath这个路径就映射到addResourceLocations指定的路径上。
标签:10,路径,springboot,web,静态,访问,resourceProperties,resources,资源 From: https://www.cnblogs.com/tarorat/p/17107841.html