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 struct.unpack
Sep 06 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
Django 缓存配置Redis使用详解
Jul 23 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
Dom操作之兼容技巧分享
2011/09/20 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
node.js入门教程
2014/06/01 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
django1.8使用表单上传文件的实现方法
2016/11/04 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Selenium的使用详解
2018/10/19 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Django models文件模型变更错误解决
2020/05/11 Python
python实现学生管理系统开发
2020/07/24 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
先进党支部事迹材料
2014/01/13 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
MySQL如何使备份得数据保持一致
2022/05/02 MySQL