springboot 之Thymeleaf模板引擎+MVC装配原理

springboot 之Thymeleaf模板引擎+MVC装配原理

1.模板引擎

​ 前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。

​ jsp支持非常强大的功能,包括能写Java代码,但是呢,我们现在的这种情况,SpringBoot这个项目首先是以jar的方式,不是war,像第二,我们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的

​ 那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?

SpringBoot推荐你可以来使用模板引擎:

​ 模板引擎,我们其实大家听到很多,其实jsp就是一个模板引擎,还有用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模板引擎有非常多,但再多的模板引擎,他们的思想都是一样的,什么样一个思想呢我们来看一下这张图:

springboot 之Thymeleaf模板引擎+MVC装配原理_第1张图片

模板引擎的作用:就是我们来写一个页面模板,比如有些值呢,是动态的,我们写一些表达式。而这些值,从哪来呢,就是我们在后台封装一些数据。然后把这个模板和这个数据交给我们模板引擎,模板引擎按照我们这个数据帮你把这表达式解析、填充到我们指定的位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这就是我们这个模板引擎,不管是jsp还是其他模板引擎,都是这个思想。只不过呢,就是说不同模板引擎之间,他们可能这个语法有点不一样。其他的我就不介绍了,我主要来介绍一下SpringBoot给我们推荐的Thymeleaf模板引擎,这模板引擎呢,是一个高级语言的模板引擎,他的这个语法更简单。而且呢,功能更强大。

2.Thymeleaf

Thymeleaf 官网:https://www.thymeleaf.org/

Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf

Spring官方文档:找到我们对应的版本

https://docs.spring.io/spring-boot/docs/2.5.0/reference/htmlsingle/#using-boot-starter

2.1 分析源码

全局搜索thymeleaf模板的配置类:ThymeleafProperties

springboot 之Thymeleaf模板引擎+MVC装配原理_第2张图片

总结结论:

使用thymeleaf模板引擎:默认的前缀和后缀

只需要把html文件放在templates 下,就能够自动渲染了。

2.2 使用步骤

​ 1.导入依赖坐标

 
 <dependency>
     <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-thymeleafartifactId>
 dependency>

​ 2.编写controller

@Controller
public class TestController {

    @RequestMapping("/test")
    public String index(){
        return "test";
    }
}

​ 3.测试页面,在templates目录下,新建一个test.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
Thymeleaf 渲染~~~
body>
html>

​ 4.启动项目

springboot 之Thymeleaf模板引擎+MVC装配原理_第3张图片

2.3 数据传输

@RequestMapping("/index")
    public String index(Map<String,Object> map){
        //存入数据
        map.put("msg","

Hello

"
); map.put("users", Arrays.asList("JJ","Lxx")); return "index"; }
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<h1>测试页面h1>

<div th:text="${msg}">div>

<div th:utext="${msg}">div>



<h4 th:each="user :${users}" th:text="${user}">h4>

<h4>
    
    <span th:each="user:${users}">[[${user}]]span>
h4>
body>
html>

我们要使用thymeleaf,需要在html文件中导入命名空间的约束,方便提示。

xmlns:th=“http://www.thymeleaf.org”

测试结果:
springboot 之Thymeleaf模板引擎+MVC装配原理_第4张图片

  Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样;
  Message Expressions: #{...}:获取国际化内容
  Link URL Expressions: @{...}:定义URL;
  Fragment Expressions: ~{...}:片段引用表达式

3.mvc自动装配原理

3.1springboot 对springMVC自动做了那些配置?

官网地址Spring Boot Reference Documentation

Spring MVC Auto-configuration
// Spring Boot为Spring MVC提供了自动配置,它可以很好地与大多数应用程序一起工作。
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.
// 自动配置在Spring默认设置的基础上添加了以下功能:
The auto-configuration adds the following features on top of Spring’s defaults:
// 包含视图解析器
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
// 支持静态资源文件夹的路径,以及webjars
Support for serving static resources, including support for WebJars 
// 自动注册了Converter:
// 转换器,这就是我们网页提交数据到后台自动封装成为对象的东西,比如把"1"字符串自动转换为int类型
// Formatter:【格式化器,比如页面给我们了一个2019-8-10,它会给我们自动格式化为Date对象】
Automatic registration of Converter, GenericConverter, and Formatter beans.
// HttpMessageConverters
// SpringMVC用来转换Http请求和响应的的,比如我们要把一个User对象转换为JSON字符串,可以去看官网文档解释;
Support for HttpMessageConverters (covered later in this document).
// 定义错误代码生成规则的
Automatic registration of MessageCodesResolver (covered later in this document).
// 首页定制
Static index.html support.
// 图标定制
Custom Favicon support (covered later in this document).
// 初始化数据绑定器:帮我们把请求数据绑定到JavaBean中!
Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).

/*
如果您希望保留Spring Boot MVC功能,并且希望添加其他MVC配置(拦截器、格式化程序、视图控制器和其他功能),则可以添加自己
的@configuration类,类型为webmvcconfiguer,但不添加@EnableWebMvc。如果希望提供
RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义
实例,则可以声明WebMVCregistrationAdapter实例来提供此类组件。
*/
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration 
(interceptors, formatters, view controllers, and other features), you can add your own 
@Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide 
custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or 
ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

// 如果您想完全控制Spring MVC,可以添加自己的@Configuration,并用@EnableWebMvc进行注释。
If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

3.2 ContentNegotiatingViewResolver 内容协商视图解析器

​ 自动配置了viewResolver,==SpringMVC视图解析器

​ 根据方法的返回值得到视图对象(View).然后视图对象决定如何去渲染(转发,重定向)

源码分析:WebMVCAutoConfiguration 找到ContentN二狗太ingViewResolver

springboot 之Thymeleaf模板引擎+MVC装配原理_第5张图片

点进这个类,找到对应的解析视图的代码:

springboot 之Thymeleaf模板引擎+MVC装配原理_第6张图片

springboot 之Thymeleaf模板引擎+MVC装配原理_第7张图片

总结:ContentNegotiatingViewResolver这个视图解析器就是用来组合所有的视图解析器的

springboot 之Thymeleaf模板引擎+MVC装配原理_第8张图片

3.3自定义一个视图解析器

3.4修改Springboot的默认配置

自动配置:原理都是一样的,通过使用WebMVC的自动配置原理分析,

SpringBoot 在自动配置很多组件的时候,先看看容器中有没有用户自己配置的(@Bean)

组件可以存放多个(视图解析器)

3.5 扩展使用功能Springmvc

使用步骤:

​ 编写一个@Configuration 注解类,并且类型腰围WebMVCConfigurer ,@EnableWebMvc注解,新建包config,写一个类MyMvcConfig;

/**
 * 类型就是WebMvcConfigurer,所以实现其接口
 * 可以使用自动以的扩展mvc的功能
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 浏览器发送/test,就会跳转到test页面
        registry.addViewController("/testConfig").setViewName("testConfig");
    }
}
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<p>确实也跳转过来了!所以说,我们要扩展SpringMVC,
    官方就推荐我们这么去使用,既保SpringBoot留所有的自动配置,
    也能用我们扩展的配置!p>
body>
html>

springboot 之Thymeleaf模板引擎+MVC装配原理_第9张图片

我们可以去分析一下原理:

1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter

2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)

3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration

父类中有这样的一段话:
springboot 之Thymeleaf模板引擎+MVC装配原理_第10张图片

在这个类中去寻找一个刚才设置的viewController当做参考,发现它调用了一个:
springboot 之Thymeleaf模板引擎+MVC装配原理_第11张图片

springboot 之Thymeleaf模板引擎+MVC装配原理_第12张图片

所有的WebMvcConfiguration都会被作用,不止Spring自己的配置类,我们自己的配置类当然也会被调用;

3.6全面接管SpringMVC

If you want to take complete control of Spring MVCyou can add your own @Configuration annotated with @EnableWebMvc.

全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!

只需在我们的配置类中要加一个@EnableWebMvc。

我们看下如果我们全面接管了SpringMVC了,我们之前SpringBoot给我们配置的静态资源映射一定会无效。

你可能感兴趣的:(Java,spring)