静态资源
我们默认的静态资源都是存放在static下面
那么他是如何自动找到这个文件下面的???进入到源码中进行查看可以发现,他们都去寻找了webjars 的一个文件
同时这一段代码也告诉我们如何访问到静态资源,启服务器,这样我们可以访问成功
当然这也只是一种的方式,那么另外一种方式,我们这里的所有的资源都会被默认的收录。
而在这个顺序中,resource的优先级最高,其次是static最后是public
首页定制
首先会自动寻找资源下面的index文件,而对于templates下面的页面,只能通过controller进行跳转。
MVC扩展配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.zss.springbootdemo.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Locale;
@Configuration public class MyMvcConfig implements WebMvcConfigurer {
@Bean public ViewResolver myViewResolver(){ return new MyViewResolver(); }
public static class MyViewResolver implements ViewResolver{
@Override public View resolveViewName(String viewName, Locale locale) throws Exception { return null; } } }
|
我们以视图解析器为例
1 2 3 4
| public interface ViewResolver { @Nullable View resolveViewName(String viewName, Locale locale) throws Exception; }
|
我们去寻找对应的实现方法,这里是遍历视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| private List<View> getCandidateViews(String viewName, Locale locale, List<MediaType> requestedMediaTypes) throws Exception { List<View> candidateViews = new ArrayList(); if (this.viewResolvers != null) { Assert.state(this.contentNegotiationManager != null, "No ContentNegotiationManager set"); Iterator var5 = this.viewResolvers.iterator();
while(var5.hasNext()) { ViewResolver viewResolver = (ViewResolver)var5.next(); View view = viewResolver.resolveViewName(viewName, locale); if (view != null) { candidateViews.add(view); }
Iterator var8 = requestedMediaTypes.iterator();
while(var8.hasNext()) { MediaType requestedMediaType = (MediaType)var8.next(); List<String> extensions = this.contentNegotiationManager.resolveFileExtensions(requestedMediaType); Iterator var11 = extensions.iterator();
while(var11.hasNext()) { String extension = (String)var11.next(); String viewNameWithExtension = viewName + '.' + extension; view = viewResolver.resolveViewName(viewNameWithExtension, locale); if (view != null) { candidateViews.add(view); } } } } }
if (!CollectionUtils.isEmpty(this.defaultViews)) { candidateViews.addAll(this.defaultViews); }
return candidateViews; }
|
我们可以看到这个图片中viewrasolvers,除了springboot自带的,还有引入的thymeleaf和自定义的myvvcconfig,而会自动从中选择一个最好的视图进行解析
SpringMVC doDispatch方法的基本思路梳理_HelloWorld_EE的博客-CSDN博客
扩展mvc进行视图跳转
1 2 3 4 5 6 7 8
| @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("show").setViewName("haha"); } }
|
但是这个注解之中不能加上@EnableWebMvc,一旦加上这个注解,会导致所有的配置都不生效,我们可以看出他导入了一个类
我们进入到这个类,会发现这个继承了这个另外一个属性WebMvcConfigurerComposite
进入到mvc自动装配的类WebMvcAutoConfiguration.class,我们查看到@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}),当缺失这个类的时候,注解才会生效,但是@EnableWebMvc又间接的使用了这个类,会导致所有的配置全部失效。