Spring Boot Web开发(4) ---静态资源

前言

这篇文章我么就开始实践了,希望这篇文章带我们走进Web开发。

Web开发

开发步骤:

  1. 创建 Spring Boot 应用,选中我们需要的模块
  2. SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
  3. 自己编写业务代码;

Spring Boot对静态资源的映射规则

在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。Spring Boot 有规定。

  1. 以前我们在IDEA中创建一个项目,添加web依赖包,我们现在是一个web应用,应该在man目录下面有一个webapp文件夹,将所有的页面都放在这里,这是我们以前的做法。
  2. 现在我们创建的这个项目中,没有这个webapp目录,但是SpringBoot给我们做了规定。在SpringBoot中对SpringMVC的相关配置都在 WebMvcAutoConfiguration 这个类中做了规定。

默认配置

Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:

  • /static
  • /public
  • /resources
  • /META-INF/resources

官方文档告诉我们 Spring Boot 对于静态资源的映射目录是 /static , /public , /resources 以及 /META-INF/resource。除此之外其实还映射了 /webjars/** 到 classpath:/META-INF/resources/webjars。

静态文件夹的方式

  1. webjars:以jar包的方式引入静态资源;http://www.webjars.org/

    webjars:以jar包的方式引入静态资源;

    <!--引入jquery-webjar-->在访问的时候只需要写webjars下面资源的名称即可
    		<dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>jquery</artifactId>
    			<version>3.3.1</version>
    		</dependency>
    

    在这里插入图片描述

  2. “/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

    classpath:/META-INF/resources/ 
    classpath:/resources/
    classpath:/static/ 
    classpath:/public/
    /:当前项目的根路径
    

    优先级从上到下

    所以,如果static里面有个index.html,public下面也有个index.html,则优先会加载static下面的index.html,因为优先级

  3. 欢迎页:静态资源文件夹下的所有index.html页面;被"/**"映射;

    
            @Bean
            public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {
                WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
                welcomePageHandlerMapping.setInterceptors(this.getInterceptors());
                return welcomePageHandlerMapping;
            }
    
            private Optional<Resource> getWelcomePage() {
                String[] locations = WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations());
                return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
            }
    
            private Resource getIndexHtml(String location) {
                return this.resourceLoader.getResource(location + "index.html");
            }
    
            private boolean isReadable(Resource resource) {
                try {
                    return resource.exists() && resource.getURL() != null;
                } catch (Exception var3) {
                    return false;
                }
            }
    
  4. 所有的 **/favicon.ico 都是在静态资源文件下找(换图标)

     //配置喜欢的图标
     @Configuration
            @ConditionalOnProperty(
                value = {"spring.mvc.favicon.enabled"},
                matchIfMissing = true
            )
            public static class FaviconConfiguration implements ResourceLoaderAware {
                private final ResourceProperties resourceProperties;
                private ResourceLoader resourceLoader;
    
                public FaviconConfiguration(ResourceProperties resourceProperties) {
                    this.resourceProperties = resourceProperties;
                }
    
                public void setResourceLoader(ResourceLoader resourceLoader) {
                    this.resourceLoader = resourceLoader;
                }
    
                @Bean
                public SimpleUrlHandlerMapping faviconHandlerMapping() {
                    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
                    mapping.setOrder(-2147483647);
                    mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", this.faviconRequestHandler()));
                    return mapping;
                }
    
                //所有  **/favicon.ico 
                @Bean
                public ResourceHttpRequestHandler faviconRequestHandler() {
                    ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
                    requestHandler.setLocations(this.resolveFaviconLocations());
                    return requestHandler;
                }
    
                private List<Resource> resolveFaviconLocations() {
                    String[] staticLocations = WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations());
                    List<Resource> locations = new ArrayList(staticLocations.length + 1);
                    Stream var10000 = Arrays.stream(staticLocations);
                    ResourceLoader var10001 = this.resourceLoader;
                    this.resourceLoader.getClass();
                    var10000.map(var10001::getResource).forEach(locations::add);
                    locations.add(new ClassPathResource("/"));
                    return Collections.unmodifiableList(locations);
                }
            }
    

一句话概括

  • 只要把favicon.ico放到如下目录下,就会自动生效。

    classpath:/META-INF/resources/ 
    classpath:/resources/
    classpath:/static/ 
    classpath:/public/
    /:当前项目的根路径
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值