SpringBootトップページ設定解析
26878 ワード
まずSpringBootのトップページ設定の3つの方法について説明します
1.SpringBootデフォルトトップページ設定
最も簡単なhtmlファイルindexを作成します.html
index.htmlファイルはSpringBootのいずれかの静的リソースディレクトリの下に置かれますhttp://localhost:8080/アクセス、正常に表示
ソース分析
まず、対応する自動構成クラスWebMvcAutoConfigurationの対応コードを探します.
SpringBootがプロジェクトのデフォルトのトップページ、コンストラクタのthisを処理するために登録されていることがわかります.getWelcomePage()はトップページリソースです.
このコードを分析して、まずthisを取得しました.resourcePropertiesのStaticLocationsフィールドは、その名の通り静的パスであるため、まずStaticLocationsを追跡すると、StaticLocationsはWebPropertisの内部静的クラスResourcesの属性であり、コンストラクタからその値が
これがSpringBootの静的リソースディレクトリであることは明らかです/META-INF/resources/ /resources/ /static/ /public/
前のコードに戻って、StaticLocationsを取得した後、ループを通じて、明らかに新しい方法を見ることができます.getIndexHtml(location)
これを使用します.resourceLoaderは、locationに対応するResourceを返し、別のgetIndexHtml()関数を実行します.
明らかに、この方法は対応するディレクトリの下のindexを取得することである.htmlファイル.もう一度見返す
対応するファイルが見つかったときに対応するリソースを返します.これがSpringBootがトップページのデフォルトを設定する原理です.
ソースコードからも、静的リソースディレクトリの優先度に関するもう一つの問題がわかります.getWelcomePageは静的リソースディレクトリを巡回し、見つかったら戻るので、優先度はstaticLocationsの順序と相対して検証します.
まず各ディレクトリの下に対応するindxを確立する.htmlファイルhttp://localhost:8080/アクセス
結論と同様に優先度が最も高いのは/META-INF/resources/,把/META-INF/resources/下のindexである.htmlファイル削除再検証検証成功!
2.コントロールに「/」のマッピングパスを追加
新しいIndexController.java
トップページリソースindexController.html
http://localhost:8080/アクセス
3.MVC拡張構成実装
MyMvcConfiguration構成クラスを新規作成し、MVC構成を拡張し、addView Controlメソッドを書き換える
トップページリソースindexMVC.html
http://localhost:8080/アクセス
拡張:優先度の問題[かくちょう:ゆうせんどのもんだい]
以前の3つの方法はすべて単独で設定したので、今彼らを結びつけますhttp://localhost:8080/アクセス優先度が最も高いのは2つ目の方法で、indexControllerを削除し、再検証で、Controller>MyMvcConfiguration>デフォルト方法
次の記事では、この順番の理由をソースコードでご紹介します
1.SpringBootデフォルトトップページ設定
最も簡単なhtmlファイルindexを作成します.html
<html lang="en">
<head>
<meta charset="UTF-8">
head>
<body>
<h1> h1>
body>
html>
index.htmlファイルはSpringBootのいずれかの静的リソースディレクトリの下に置かれますhttp://localhost:8080/アクセス、正常に表示
ソース分析
まず、対応する自動構成クラス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フィールドは、その名の通り静的パスであるため、まずStaticLocationsを追跡すると、StaticLocationsはWebPropertisの内部静的クラスResourcesの属性であり、コンストラクタからその値が
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{
"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
これがSpringBootの静的リソースディレクトリであることは明らかです
前のコードに戻って、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ファイルhttp://localhost:8080/アクセス
結論と同様に優先度が最も高いのは/META-INF/resources/,把/META-INF/resources/下のindexである.htmlファイル削除再検証検証成功!
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/アクセス
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/アクセス
拡張:優先度の問題[かくちょう:ゆうせんどのもんだい]
以前の3つの方法はすべて単独で設定したので、今彼らを結びつけますhttp://localhost:8080/アクセス優先度が最も高いのは2つ目の方法で、indexControllerを削除し、再検証で、Controller>MyMvcConfiguration>デフォルト方法
次の記事では、この順番の理由をソースコードでご紹介します