springboot欢迎页设置

默认欢迎页

springboot在启动时会加载一系列的bean,其中WebMvcAutoConfiguration中的EnableWebMvcConfiguration配置类中会注册一个WelcomePageHandlerMapping,该bean的主要作用就是设置欢迎页。

通过源码来看一下具体的实现过程

@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
				FormattingConversionService mvcConversionService, 
									ResourceUrlProvider mvcResourceUrlProvider) {
	WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
			new TemplateAvailabilityProviders(applicationContext),
				applicationContext,
				getWelcomePage(),
				this.mvcProperties.getStaticPathPattern());
	//注册Interceptors
	welcomePageHandlerMapping.setInterceptors(
				getInterceptors(mvcConversionService, mvcResourceUrlProvider));
	//配置跨域请求处理
	welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
	return welcomePageHandlerMapping;
}

//WebMvcConfigurationSupport中的一个类
protected final Object[] getInterceptors(
			FormattingConversionService mvcConversionService,
			ResourceUrlProvider mvcResourceUrlProvider) {
	if (this.interceptors == null) {
		InterceptorRegistry registry = new InterceptorRegistry();
		addInterceptors(registry);
		
		//用来注册springmvc的类型转换服务,该类型转换服务会在请求处理过程中用于
		//请求参数或者返回值的类型转换。
		registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService));
		
		//Spring MVC配置定义的一个资源URL提供者对象ResourceUrlProvider
		registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider));
		this.interceptors = registry.getInterceptors();
	}
	return this.interceptors.toArray();
}

从上述代码中可以看到,当注册WelcomePageHandlerMappingbean时,会用构造器初始化,初始化过程如下:

WelcomePageHandlerMapping(
		TemplateAvailabilityProviders templateAvailabilityProviders,
		ApplicationContext applicationContext, 
		Optional<Resource> welcomePage, 
		String staticPathPattern) {
		//判断是否存在欢迎页,如果存在且设置的静态资源映射url为/**,则欢迎页为index.html
		//当请求到来时如果没有任何控制器处理,则根据此配置进行跳转-也就是跳转到index.html
		if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {
			logger.info("Adding welcome page: " + welcomePage.get());
			setRootViewName("forward:index.html");
		}
		else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
			logger.info("Adding welcome page template: index");
			setRootViewName("index");
		}
	}

从上述代码可以看到,设置的默认欢迎页面为index.html;如果请求没有任何控制器进行处理,则会跳转到默认的index.html页面。
这也是为什么,直接输入项目地址可以进行跳转的原因:例如localhost:8080/,则会直接跳转到index.html.

自行设置欢迎页

通过继承WebMvcConfigurer重写其addViewControllers方法,添加默认欢迎页

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    
    /**
     * 默认首页设置,当请求时项目地址的时候 返回login
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/index.html").setViewName("login");
        registry.addViewController("/main.html").setViewName("dashboard");
        super.addViewControllers(registry);
    }

如代码所示,当访问项目地址时localhost:8080/会跳转到login页面

springboot设置默认欢迎页原理一样,通过addViewControllers()方法添加的控制器最终都需要通过设置viewName进行跳转:
springboot默认:setRootViewName()
addViewController手动配置:setViewName()

//ViewControllerRegistration 中记录着所有设置的view
public ViewControllerRegistration addViewController(String urlPath) {
		ViewControllerRegistration registration = new ViewControllerRegistration(urlPath);
		registration.setApplicationContext(this.applicationContext);
		this.registrations.add(registration);
		return registration;
	}
//setViewName()方法往ViewControllerRegistration.ParameterizableViewController
//ParameterizableViewController就是根据view名字,返回view
public void ViewControllerRegistration$setViewName(String viewName) {
		this.controller.setViewName(viewName);
	}

TIPS:在pom文件中务必将前端文件和index.html配置到classes文件夹中,如果未配置,则会出现访问失败,出现404的现象;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值