SpringBoot首页设置解析(推荐)
作者:zyxzcr 发布时间:2021-11-03 05:43:00
首先来解释一下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的任一静态资源目录下
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注册了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
可以看出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文件
http://localhost:8080/访问
和得出的结论一样,优先级最高的是 /META-INF/resources/,把 /META-INF/resources/下的index.html文件删除再次验证
验证成功!
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/访问
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/访问
扩展:优先级问题
之前的三个方法都是单独设置的,现在把他们结合起来
http://localhost:8080/访问
优先级最高的是第二种方法,然后将indexController删除,再次验证
得出结论:Controller>MyMvcConfiguration>默认方法
来源:https://blog.csdn.net/zcrzcrzcrzcrzcr/article/details/113784517
猜你喜欢
- 1.sort.Sort介绍使用sort.Slice进行排序,因为slice把struct抽象化了,且slice封装过了,简单的基础类型可以使
- 实现代码/// <summary>/// 去除HTML标记/// </summary&
- 所以特意写了这个配置文档,相信按照以下步骤你一定会成功的.错误的地方也希望各位指正. 本例是在wiondws XP下 php5.2.1(zi
- 在编程时你一定碰到过时间触发的事件,在VB中有timer控件,而asp中没有, 假如你要不停地查询数据库来等待一个返回结果的话,我想你一定知
- 可以说,互联网就是由一个个链接进行信息流通的。没有连接的网站如同一潭死水,毫无生气。当一个访客进入你的网站,在浏览的过程中,如果你的内容不引
- 本文进通过实例,讲述通过 prototype 自定义方法的过程,旨在抛砖引玉,如果不对的地方,欢迎指正!prototype 是在 IE 4
- 前言:NoxfileNox 默认在一个名为noxfile.py的文件中查找配置。在运行 nox 时,你可以使用 --noxfile参数指定其
- 要很好地领会Ajax技术的关键是了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特网上在浏览器与服务器间传输的其他类型文件。只
- class EntryDemo( Frame ): """Demonstrate Entrys and Eve
- index_selectanchor_w = self.FloatTensor(self.scaled_anchors).index_sel
- 1.设置小数位数1.1 数据框设置统一小数位数以保留小数点后两位小数为例:import pandas as pdimport numpy a
- 在IDLE下清屏:#网上有些先定义函数,再?print("\n" * 100)输出一百个换行的方法有点扯淡,跟连按回车没
- 简介XSStrike 是一款用于探测并利用XSS漏洞的脚本XSStrike目前所提供的产品特性:对参数进行模糊测试之后构建合适的payloa
- 写在前面:这篇文章也是借鉴了一些前辈的代码和思路写的,代码有些也是复用了别人的。先说下思路:1.首先利用Opencv检测出人脸的区域&nbs
- 第一章:日志管理 1.forcing log switchessql> alter system switch logfile;2.f
- 看代码吧~class ConvNet(nn.module): def __init__(self, num_cla
- 在一般的MIS应用中,会有大量的报表,此时我们可以在后台数据库编写相应的视图或存储过程,用ASP通过ADO调用以完成报表工作。下面用一个例子
- 开门见山,直接以例子介绍: 代码如下:CREATE TABLE [dbo].[course]( [id] [int] NULL,
- (一)CSV格式文件1.说明CSV是一种以逗号分隔数值的文件类型,在数据库或电子表格中,常见的导入导出文件格式就是CSV格式,CSV格式存储
- 搞一个图形化界面还是挺酷的,是吧 安装库什么的应该不用多说了吧。。一般来说会让你把 designer.exe(编辑图形化界面的东西,跟vb差