SpringBootトップページ設定解析


まずSpringBootのトップページ設定の3つの方法について説明します
1.SpringBootデフォルトトップページ設定
最も簡単なhtmlファイルindexを作成します.html

<html lang="en">
<head>
	<meta charset="UTF-8">
head>
<body>
<h1>  h1>
body>
html>

index.htmlファイルはSpringBootのいずれかの静的リソースディレクトリの下に置かれますSpringBoot首页设置解析_第1张图片http://localhost:8080/アクセス、正常に表示SpringBoot首页设置解析_第2张图片
ソース分析
まず、対応する自動構成クラスWebMvcAutoConfigurationの対応コードを探します.
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
     
    WelcomePageHandlerMapping welcomePageHandlerMapping = 
    	new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext),
    		 applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
    welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
    return welcomePageHandlerMapping;
}

SpringBootがプロジェクトのデフォルトのトップページ、コンストラクタのthisを処理するために登録されていることがわかります.getWelcomePage()はトップページリソースです.
private Resource getWelcomePage() {
     
       String[] var1 = this.resourceProperties.getStaticLocations();
       int var2 = var1.length;

       for(int var3 = 0; var3 < var2; ++var3) {
     
           String location = var1[var3];
           Resource indexHtml = this.getIndexHtml(location);
           if (indexHtml != null) {
     
               return indexHtml;
           }
       }

       ServletContext servletContext = this.getServletContext();
       if (servletContext != null) {
     
           return this.getIndexHtml((Resource)(new ServletContextResource(servletContext, "/")));
       } else {
     
           return null;
       }
}

このコードを分析して、まずthisを取得しました.resourcePropertiesのStaticLocationsフィールドは、その名の通り静的パスであるため、まずStaticLocationsSpringBoot首页设置解析_第3张图片を追跡すると、StaticLocationsはWebPropertisの内部静的クラスResourcesの属性であり、コンストラクタからその値が
        private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{
     "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

これがSpringBootの静的リソースディレクトリであることは明らかです
  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

  • 前のコードに戻って、StaticLocationsを取得した後、ループを通じて、明らかに新しい方法を見ることができます.getIndexHtml(location)
    private Resource getIndexHtml(String location) {
         
          return this.getIndexHtml(this.resourceLoader.getResource(location));
    }
    

    これを使用します.resourceLoaderは、locationに対応するResourceを返し、別のgetIndexHtml()関数を実行します.
    private Resource getIndexHtml(Resource location) {
         
         try {
         
             Resource resource = location.createRelative("index.html");
             if (resource.exists() && resource.getURL() != null) {
         
                 return resource;
             }
         } catch (Exception var3) {
         
         }
    
         return null;
    }
    

    明らかに、この方法は対応するディレクトリの下のindexを取得することである.htmlファイル.もう一度見返す
    for(int var3 = 0; var3 < var2; ++var3) {
         
         String location = var1[var3];
         Resource indexHtml = this.getIndexHtml(location);
         if (indexHtml != null) {
         
             return indexHtml;
         }
    }
    

    対応するファイルが見つかったときに対応するリソースを返します.これがSpringBootがトップページのデフォルトを設定する原理です.
    ソースコードからも、静的リソースディレクトリの優先度に関するもう一つの問題がわかります.getWelcomePageは静的リソースディレクトリを巡回し、見つかったら戻るので、優先度はstaticLocationsの順序と相対して検証します.
    まず各ディレクトリの下に対応するindxを確立する.htmlファイルSpringBoot首页设置解析_第4张图片http://localhost:8080/アクセスSpringBoot首页设置解析_第5张图片
    結論と同様に優先度が最も高いのは/META-INF/resources/,把/META-INF/resources/下のindexである.htmlファイル削除再検証SpringBoot首页设置解析_第6张图片検証成功!
    2.コントロールに「/」のマッピングパスを追加
    新しいIndexController.java
    package com.springboot04webapp.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class IndexController {
         
    
        @RequestMapping("/")
        public String index(){
         
            return "indexController";
        }
    }
    

    トップページリソースindexController.html
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
    head>
    <body>
    <h1>indexController  h1>
    body>
    html>
    

    http://localhost:8080/アクセスSpringBoot首页设置解析_第7张图片
    3.MVC拡張構成実装
    MyMvcConfiguration構成クラスを新規作成し、MVC構成を拡張し、addView Controlメソッドを書き換える
    package com.springboot04webapp.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class MyMvcConfiguration implements WebMvcConfigurer {
         
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
         
            registry.addViewController("/").setViewName("indexMVC");
        }
    }
    

    トップページリソースindexMVC.html
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
    head>
    <body>
    <h1>indexMVC  h1>
    body>
    html>
    

    http://localhost:8080/アクセスSpringBoot首页设置解析_第8张图片
    拡張:優先度の問題[かくちょう:ゆうせんどのもんだい]
    以前の3つの方法はすべて単独で設定したので、今彼らを結びつけますSpringBoot首页设置解析_第9张图片http://localhost:8080/アクセスSpringBoot首页设置解析_第10张图片優先度が最も高いのは2つ目の方法で、indexControllerを削除し、再検証SpringBoot首页设置解析_第11张图片で、Controller>MyMvcConfiguration>デフォルト方法
    次の記事では、この順番の理由をソースコードでご紹介します