• 售前

  • 售后

热门帖子
入门百科

SpringBoot首页设置解析(保举)

[复制链接]
白度了一生一x 显示全部楼层 发表于 2021-10-25 18:52:54 |阅读模式 打印 上一主题 下一主题
首先来解释一下SpringBoot首页设置的三种方式
1.SpringBoot默认首页设置
编写一个最简朴的html文件 index.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.         <meta charset="UTF-8">
  5. </head>
  6. <body>
  7. <h1>首页</h1>
  8. </body>
  9. </html>
复制代码
将index.html文件置于SpringBoot的任一静态资源目录下

http://localhost:8080/访问,成功表现

源码分析
首先找对应的主动设置类WebMvcAutoConfiguration中的对应代码
  1. @Bean
  2. public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
  3. WelcomePageHandlerMapping welcomePageHandlerMapping =
  4.         new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext),
  5.                  applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
  6. welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
  7. welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
  8. return welcomePageHandlerMapping;
  9. }
复制代码
可以看到 SpringBoot注册了WelcomePageHandlerMappingBean来处理项目标默认首页,构造器中的this.getWelcomePage()为首页资源。
  1. private Resource getWelcomePage() {
  2. String[] var1 = this.resourceProperties.getStaticLocations();
  3. int var2 = var1.length;
  4. for(int var3 = 0; var3 < var2; ++var3) {
  5.   String location = var1[var3];
  6.   Resource indexHtml = this.getIndexHtml(location);
  7.   if (indexHtml != null) {
  8.   return indexHtml;
  9.   }
  10. }
  11. ServletContext servletContext = this.getServletContext();
  12. if (servletContext != null) {
  13.   return this.getIndexHtml((Resource)(new ServletContextResource(servletContext, "/")));
  14. } else {
  15.   return null;
  16. }
  17. }
复制代码
分析这段代码,首先获取了this.resourceProperties的StaticLocations字段,顾名思义就是静态路径,那就先跟踪StaticLocations

可以看出StaticLocations是WebPropertis中内部静态类Resources的属性,从构造器中可以看出它的值为
  1. 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)
  1. private Resource getIndexHtml(String location) {
  2. return this.getIndexHtml(this.resourceLoader.getResource(location));
  3. }
复制代码
使用this.resourceLoader返回一个与location对应的Resource执行另一个getIndexHtml()函数
  1. private Resource getIndexHtml(Resource location) {
  2. try {
  3.   Resource resource = location.createRelative("index.html");
  4.   if (resource.exists() && resource.getURL() != null) {
  5.   return resource;
  6.   }
  7. } catch (Exception var3) {
  8. }
  9. return null;
  10. }
复制代码
很明显,这个方法是获取对应目录下的index.html文件。再往回看
  1. for(int var3 = 0; var3 < var2; ++var3) {
  2. String location = var1[var3];
  3. Resource indexHtml = this.getIndexHtml(location);
  4. if (indexHtml != null) {
  5.   return indexHtml;
  6. }
  7. }
复制代码
当找到对应文件的时间就返回对应的资源,这就是SpringBoot设置首页的默认方式的原理。
从源码中也可以看出另一个关于静态资源目录优先级的问题。getWelcomePage遍历静态资源目录,一旦找到就返回,以是优先级和staticLocations中的顺序相对,验证一下。
先在每一个目录下建立对应的indx.html文件

http://localhost:8080/访问

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

验证成功!
2.controller里添加"/"的映射路径
新建IndexController.java
  1. package com.springboot04webapp.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller
  5. public class IndexController {
  6. @RequestMapping("/")
  7. public String index(){
  8. return "indexController";
  9. }
  10. }
复制代码
首页资源indexController.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. </head>
  6. <body>
  7. <h1>indexController首页</h1>
  8. </body>
  9. </html>
复制代码
http://localhost:8080/访问

3.MVC扩展设置实现
新建MyMvcConfiguration设置类,扩展MVC设置,重写addViewControllers方法
  1. package com.springboot04webapp.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. @Configuration
  6. public class MyMvcConfiguration implements WebMvcConfigurer {
  7. @Override
  8. public void addViewControllers(ViewControllerRegistry registry) {
  9. registry.addViewController("/").setViewName("indexMVC");
  10. }
  11. }
复制代码
首页资源indexMVC.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. </head>
  6. <body>
  7. <h1>indexMVC首页</h1>
  8. </body>
  9. </html>
复制代码
http://localhost:8080/访问

扩展:优先级问题
之前的三个方法都是单独设置的,现在把他们联合起来

http://localhost:8080/访问

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

得出结论:Controller>MyMvcConfiguration>默认方法
到此这篇关于SpringBoot首页设置解析详解的文章就先容到这了,更多干系SpringBoot首页设置内容请搜索草根技术分享从前的文章或继承浏览下面的干系文章盼望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作