优先级如下:1 -> 2 -> 3 -> 4
以上4个是SpringBoot默认读取静态资源文件目录,因此不需要配置任何参数,直接输入URL即可访问
http://localhost:8080/b.html
结果:

静态资源项目结构:
测试同时访问a.html

访问地址:
http://localhost:8080/a.html
测试结果:

1)那么这个时候如果我们想要通过controller然后跳转到对应页面该怎么办呢?
一般来说,controller跳转的页面都是放在templates目录下的,
如果我们像之前访问static目录下的文件那样,直接访问templates下的html文件
http://localhost:8080/test.html
结果:

@Controller//不能是@RestController【@RestController会转换为json格式】
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("22222");
// return "/test.html"; //直接访问
// return "forward:/test.html";//请求转发
return "redirect:/test.html";//重定向
}
}

结果:访问成功
2)如果我们目录层级有多层呢?
@Controller//不能是@RestController【@RestController会转换为json格式】
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("3333");
return "/html/test.html";
}
}

可以直接通过在跳转的视图上添加上路径【但是如果路径太长就会有太多重复代码且不易扩展】
解决办法:
①可以通过yml配置文件+controller请求转发/重定向
②可以通过模板引擎如:thymeleaf
导入jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置前后缀:
spring:
#设置页面前后缀
thymeleaf:
prefix: classpath:/templates/html/
suffix: .html
设置SpringBoot项目静态资源位置【修改之后,默认静态资源位置失效】
spring.resources.static-location参数指定了SpringBoot-Web项目中静态文件存放位置,该参数默认设置为:classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,servlet context:/。
以上地址中没有/template地址,当前配置文件中配置此项后,默认配置失效,使用自定义设置。
spring:
web:
resources:
static-locations: classpath:/templates/
设置静态资源访问路径【/login/test.html】
①在yml配置static-path-pattern
spring:
mvc:
static-path-pattern: /login/**
# /login/** 访问login目录下的资源及其子目录【多层目录】
# /login/* 访问login目录下的资源,不包括子目录【单层】
②这个时候,直接访问静态资源a.html
http://localhost:8080/a.html
报错:

③在URL前面加上login,再访问:
http://localhost:8080/login/a.html
成功:

spring:
mvc:
static-path-pattern: /login/**
# /login/** 访问login目录下的资源及其子目录【多层目录】
# /login/* 访问login目录下的资源,不包括子目录【单层】
比如没有设置这个配置项之前,访问静态资源http://localhost:8080/test.html;设置了之后就必须是http://localhost:8080/login/test.html
请求转发、重定向,三种方式:
/**
* 被跳转的controller
*/
@Controller
public class OtherController {
/**
* 被跳转的controller返回result.jsp
* @return
* @throws Exception
*/
@RequestMapping("/other.do")
public ModelAndView other()throws Exception{
ModelAndView mv = new ModelAndView();
mv.addObject("type", "被跳转的controller");
mv.setViewName("result");
return mv;
}
}
@Controller//不能是@RestController【@RestController会转换为json格式】
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("6666");
return "forward:/test.html";
}
}
request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);
如果templates有多层路径,可以通过在yml中配置静态资源路径+controller中的请求转发或重定向
①项目结构

②yml文件
spring:
web:
resources:
static-locations: classpath:/templates/html/
③TestController
@Controller//不能是@RestController【@RestController会转换为json格式】
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("777");
return "forward:/test.html";
}
}
实现方式:
主要作用:
/* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
*静态资源处理
*/
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/**
* 这里配置视图解析器
*/
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
①配置拦截器
首先,我们需要自定义拦截器
public class SystemInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("经过拦截器...");
return false;
}
}
②注册拦截器
@Configuration
public class MyWebMvcConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
registry.addInterceptor(new SystemInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");
}
}
@Controller
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("3333");
return "/html/test.html";
}
@RequestMapping("/login")
public String login(){
System.out.println("login...");
return "login.html";
}
}
④测试

1.访问test
http://localhost:8080/test
结果:
页面上空白,控制台打印:
2022-09-05 20:20:27.971 INFO 25188 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
经过拦截器...
2.访问login
http://localhost:8080/login
结果:
成功返回页面

①创建MyWebMvcConfigure类
将URL路径上的sub映射为test333
@Configuration
public class MyWebMvcConfigure implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/sub/**").addResourceLocations("classpath:/test333/");
}
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
// //注册拦截器
// registry.addInterceptor(new SystemInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");
// }
}
项目结构

②访问http://localhost:8080/sub/test3.html
映射之后为:classpath:/test333/test3.html

③结果,成功响应
