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中的多线程实例教程
Aug 27 Python
Python脚本实现自动将数据库备份到 Dropbox
Feb 06 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
如何使用python把ppt转换成pdf
Jun 29 Python
Mac安装python3的方法步骤
Aug 09 Python
python生成器推导式用法简单示例
Oct 08 Python
简单了解python元组tuple相关原理
Dec 02 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
python实现在线翻译功能
Mar 03 Python
如何在Python 游戏中模拟引力
Mar 27 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
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
php学习之function的用法
2012/07/14 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
php curl发送请求实例方法
2019/08/01 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
js中的this关键字详解
2013/09/25 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
高校自主招生自荐信
2013/12/09 职场文书
服装采购员岗位职责
2014/03/15 职场文书
财务人员担保书
2014/05/13 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
生日答谢词
2015/01/05 职场文书
签订劳动合同通知书
2015/04/16 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
你需要掌握的20个Python常用技巧
2022/02/28 Python
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript