SpringBoot Web开发

静态资源

我们默认的静态资源都是存放在static下面

image-20220519093003995

那么他是如何自动找到这个文件下面的???进入到源码中进行查看可以发现,他们都去寻找了webjars 的一个文件

image-20220519093209781

image-20220519093825829

同时这一段代码也告诉我们如何访问到静态资源,启服务器,这样我们可以访问成功

image-20220519094605189

当然这也只是一种的方式,那么另外一种方式,我们这里的所有的资源都会被默认的收录。

image-20220519095408227

而在这个顺序中,resource的优先级最高,其次是static最后是public

首页定制

首先会自动寻找资源下面的index文件,而对于templates下面的页面,只能通过controller进行跳转。

image-20220519101141908

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;

/**
* @author zss
*/
//表明这是一个配置类
@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;
}

image-20220519111127256

我们可以看到这个图片中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,一旦加上这个注解,会导致所有的配置都不生效,我们可以看出他导入了一个类

image-20220519142130750

我们进入到这个类,会发现这个继承了这个另外一个属性WebMvcConfigurerComposite

image-20220519143340932

进入到mvc自动装配的类WebMvcAutoConfiguration.class,我们查看到@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}),当缺失这个类的时候,注解才会生效,但是@EnableWebMvc又间接的使用了这个类,会导致所有的配置全部失效。

image-20220519143115055