首页 > 其他分享 >springboot开发日记(10)——web开发

springboot开发日记(10)——web开发

时间:2023-02-10 17:12:26浏览次数:56  
标签:10 路径 springboot web 静态 访问 resourceProperties resources 资源

通过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的配置类,这个配置类开启了WebMvcPropertiesWebProperties这两个类的的属性绑定,再去这两个类的源码寻找我们可以发现:这两个类分别与spring.mvcspring.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

相关文章