一、视图解析
视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染。
1.1 视图解析原理
1、目标方法处理的过程中,所有数据都会被放在ModelAndViewContainer里面,包括数据和视图地址。
2、如果方法的参数是一个自定义类型对象(从请求参数中确定的),会把它重新放在ModelAndViewContainer。
3、任何目标方法执行完成后都会返回ModelAndView(数据和试图地址)。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
此步骤完成了方法执行、返回值处理(内容协商)
4、processDispatchResult处理派发结果(页面如何响应)
render(mv,request,resposne);进行页面渲染逻辑,mv是ModelAndView对象。
根据方法的String返回值得到了View对象【定义了页面的渲染逻辑】,以下是具体流程
1、所有的视图解析器尝试是否能根据当前返回值得到View对象
2、得到了 redirect:/main.html --> Thymeleaf创建new RedirectView()【重定向】
3、ContentNegotiationViewResolver 里面包含了下面所有的视图解析器,内部还是利用下面所有视图解析器得到视图对象。
4、view.render(mv.getModelInternal(), request, response); 视图对象调用自定义的render进行页面渲染工作
RedirectView如何渲染【重定向到一个界面】
1、获取目标url地址
2、response.sendRedirect(encodedURL);
所有的视图解析器:
视图对象:
视图解析:
- 返回值以 forward: 开始: new InternalResourceView(forwardUrl); --> 转发request.getRequestDispatcher(path).forward(request, response);
- 返回值以 redirect: 开始: new RedirectView() --> render就是重定向
- 返回值是普通字符串: new ThymeleafView()--->
二、模板引擎-Thymeleaf
2.1 thymeleaf简介
现代化、服务端Java模板引擎
2.2 基本语法
三、thymeleaf使用
3.1 引入starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
3.2 引入之后会自动配置好thymeleaf
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration { }
自动配好的策略
- 所有thymeleaf的配置值都在 ThymeleafProperties
- 配置好了 SpringTemplateEngine
- 配好了 ThymeleafViewResolver
- 我们只需要直接开发页面
//Thymeleaf配置类
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html"; //xxx.html
3.3 页面开发
<!--success.html-->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${msg}">哈哈</h1>
<h2>
<a href="www.atguigu.com" th:href="${link}">去百度</a> <br/>
<!--@方式会把link拼接到项目路径后面-->
<a href="www.atguigu.com" th:href="@{link}">去百度2</a>
</h2>
</body>
</html>
@GetMapping("/test/thymleaf")
public String testThymleaf(Model model) {
model.addAttribute("msg", "消息来了");
//要加http,不然会把link直接接在项目路径后面
model.addAttribute("link", "http://www.baidu.com");
return "success";
}