第一种方式:
项目运行效果为
是什么原因呢?
我们打开 WebMvcAutoConfiguration 类
有下面一段代码
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {
return new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
}
private Optional getWelcomePage() {
String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
}
private Resource getIndexHtml(String location) {
return this.resourceLoader.getResource(location + "index.html");
}
这段代码是注册一个返回index.html的 java bean
this.mvcProperties.getStaticPathPattern() 打开发现 this.staticPathPattern = "/**";
就是在项目根目录下查找 index.html 如果找到则跳转相应的index.html页面
如果我们想访问 templates 下面的index.html 也不删除static下面的 index.html 页面,那能不能实现呢?
答案是肯定的
首先第一种方式:
@Controller
public class HelloController {
@RequestMapping(value = {"/","/index.html"})
public String index(){
return "index";
}
}
当项目启动 controller 跳转到 templates 下面的页面
这种方式是不推荐使用的,推荐使用下面这一种
效果图为
第二种方式:
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 拦截某个请求跳转固定位置
*
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//super.addViewControllers(registry);
registry.addViewController("/nihao").setViewName("success");
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
}
}
因为 spring 5抛弃了WebMvcConfigurerAdapter 使用 WebMvcConfigurationSupport 代替了它
这个方法的作用就是监听某个请求.返回指定的页面
运行效果为