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利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python中强大的format函数实例详解
Dec 05 Python
简单了解django缓存方式及配置
Jul 19 Python
python正则表达式匹配IP代码实例
Dec 28 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
php中namespace及use用法分析
2016/12/06 PHP
表单内同名元素的控制
2006/11/22 Javascript
JAVASCRIPT HashTable
2007/01/22 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
Python处理文本换行符实例代码
2018/02/03 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
初中英语演讲稿
2014/04/29 职场文书
集中整治工作方案
2014/05/01 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
社区灵活就业证明
2014/11/03 职场文书
搞笑老公保证书
2015/02/26 职场文书
编写python程序的90条建议
2021/04/14 Python
PyTorch的Debug指南
2021/05/07 Python
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers