SpringBoot首页设置解析(推荐)


Posted in Python onFebruary 11, 2021

首先来解释一下SpringBoot首页设置的三种方式

1.SpringBoot默认首页设置

编写一个最简单的html文件 index.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
</head>
<body>
<h1>首页</h1>
</body>
</html>

将index.html文件置于SpringBoot的任一静态资源目录下

SpringBoot首页设置解析(推荐)

http://localhost:8080/访问,成功显示

SpringBoot首页设置解析(推荐)

源码分析

首先找对应的自动配置类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注册了WelcomePageHandlerMappingBean来处理项目的默认首页,构造器中的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

SpringBoot首页设置解析(推荐)

可以看出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后,通过循环遍历,很明显可以看到一个新的方法this.getIndexHtml(location)

private Resource getIndexHtml(String location) {
 return this.getIndexHtml(this.resourceLoader.getResource(location));
}

使用this.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首页设置解析(推荐)

http://localhost:8080/访问

SpringBoot首页设置解析(推荐)

和得出的结论一样,优先级最高的是 /META-INF/resources/,把 /META-INF/resources/下的index.html文件删除再次验证

SpringBoot首页设置解析(推荐)

验证成功!

2.controller里添加"/"的映射路径

新建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

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
</head>
<body>
<h1>indexController首页</h1>
</body>
</html>

http://localhost:8080/访问

SpringBoot首页设置解析(推荐)

3.MVC扩展配置实现

新建MyMvcConfiguration配置类,扩展MVC配置,重写addViewControllers方法

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

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
</head>
<body>
<h1>indexMVC首页</h1>
</body>
</html>

http://localhost:8080/访问

SpringBoot首页设置解析(推荐)

扩展:优先级问题

之前的三个方法都是单独设置的,现在把他们结合起来

SpringBoot首页设置解析(推荐)

http://localhost:8080/访问

SpringBoot首页设置解析(推荐)

优先级最高的是第二种方法,然后将indexController删除,再次验证

SpringBoot首页设置解析(推荐)

得出结论:Controller>MyMvcConfiguration>默认方法

到此这篇关于SpringBoot首页设置解析详解的文章就介绍到这了,更多相关SpringBoot首页设置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
python批量创建指定名称的文件夹
Mar 21 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
对python while循环和双重循环的实例详解
Aug 23 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python中itertools的用法详解
Feb 07 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
Pandas的Apply函数具体使用
Jul 21 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 #Python
详解python日志输出使用配置文件格式
Feb 10 #Python
python 获取域名到期时间的方法步骤
Feb 10 #Python
Numpy ndarray 多维数组对象的使用
Feb 10 #Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 #Python
python利用文件时间批量重命名照片和视频
Feb 09 #Python
python opencv实现图像配准与比较
Feb 09 #Python
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
js常用代码段整理
2011/11/30 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
初入社会应届生求职信
2013/11/18 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
图书室标语
2014/06/21 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏