SpringBoot——模板引擎及原理

优质博文:IT-BLOG-CN

一、模板引擎的思想

模板是为了将显示与数据分离,模板技术多种多样,但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。

在这里插入图片描述

二、SpringBoot模板引擎

SpringBoot推荐的模板引擎是Thymeleaf语法简单,功能强大。
【1】引入thymeleafstarter启动器。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><!-- 默认版本号在parent的dependents中配置,如果要替换其中的版本,设置如下 -->
<properties><thymeleaf.version>3.0.2.RELEASE</thymeleaf.version><!-- 布局功能的支持程序 thymeleaf3主程序,适配layout2以上版本 --><thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
</properties>

【2】查看thymeleaf的默认配置:进入ThymeleafAutoConfigurationThymeleafProperties配置文件中,如下:

@ConfigurationProperties(prefix = "spring.thymeleaf"
)
public class ThymeleafProperties {private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");public static final String DEFAULT_PREFIX = "classpath:/templates/";public static final String DEFAULT_SUFFIX = ".html";private boolean checkTemplate = true;private boolean checkTemplateLocation = true;//只要我们吧HTML页面放在classpath:/templates/下就能够自动渲染private String prefix = "classpath:/templates/";private String suffix = ".html";
}

【3】测试:创建controller如下:同时在templates文件夹下创建suceess.html与返回值相同。启动后输入:http://localhost:8080/success 便可跳转到success.html页面。

@Controller
public class success {@RequestMapping("/success")public String success(){return "success";}
}

三、thymeleaf 使用

【1】导入thymeleaf的名称空间:就会具有thymeleaf的语法提示,不导入也可以,只是么有语法提示了。

<html lang="en"  xmlns:th="http://www.thymeleaf.org">

【2】写一个简单的demo上个手,如下controller层,给返回的页面添加数据,如下:

@Controller
public class success {@RequestMapping("/success")public String success(Map<String,String> map){map.put("hello","你好");return "success";}
}

【3】打开我们的静态页面success.html,根据thymeleaf模板引擎语法,获取hello的值,如下:

<body><h1>成功</h1><div th:text="${hello}">这是成功页面</div>
</body>

【4】需要注意的是:当hello有值时,显示 hello获取到的值,如果单独只访问 success.html时,只显示前端页面的内容 “这是成功页面” 能够非常友好的结合前后端进行编程。


四、thymeleaf语法规则

【1】th:text:改变当前元素里面的文本内容。语法文档:https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.pdf

th:任意html属性:可以替换原生的HTML的元素。

【2】表达式语法:行里表达式:[[xx]] —>相当于 th:text , [(xx)]—>相当于th:utext

● Simple expressions:(表达式语法)○ Variable Expressions: ${...}:获取变量值,底层时OGNL;1)、获取对象的属性、调用方法;2)、使用内置的基本对象;#location...3)、内置的一些工具对象;#strings...○ Selection Variable Expressions: *{...}:选择表达式,与${}的功能一样,有一个不同,可以参考文档。○ Message Expressions: #{...}:用来获取国际化信息○ Link URL Expressions: @{...}:用来定义URL连接○ Fragment Expressions: ~{...}:片段引入表达式
● Literals(字面量)○ Text literals: 'one text' , 'Another one!' ,…○ Number literals: 0 , 34 , 3.0 , 12.3 ,…○ Boolean literals: true , false○ Null literal: null○ Literal tokens: one , sometext , main ,…
● Text operations:(文本操作)○ String concatenation: +○ Literal substitutions: |The name is ${name}|
● Arithmetic operations:(数学运算)○ Binary operators: + , - , * , / , %○ Minus sign (unary operator): -
● Boolean operations:(布尔运算)○ Binary operators: and , or○ Boolean negation (unary operator): ! , not
● Comparisons and equality:(比较运算)○ Comparators: > , < , >= , <= ( gt , lt , ge , le )○ Equality operators: == , != ( eq , ne )
● Conditional operators:(条件运算)○ If-then: (if) ? (then)○ If-then-else: (if) ? (then) : (else)○ Default: (value) ?: (defaultvalue)○ Special tokens:○ Page 17 of 106
● No-Operation: _:(特殊操作)

【3】公共页面抽取

<!--抽取公共片段-->
<div th:fragment="copy">2011 The Good Thymes Virtual Grocery
</div><!--引入公共片段: ~{templatename::fragmentname} 片段 ~{templatename::selector} 选择器-->
<div th:insert="~{footer :: copy}"></div>
<-- or -->
<div th:insert="footer :: copy"></div>

三种引入功能片段的区别:
▶ th:insert:将公共片段整个插入到声明引入的元素中。
▶ th:replace:将声明引入的元素替换成公共片段。
▶ th:include:将被引入的片段的内容包含进这个标签中。

<footer th:fragment="copy">2011 The Good Thymes Virtual Gro
</footer><!--引入方式-->
<div th:insert="footer :: copy"></di>
<div th:replace="footer :: copy"></div>
<div th:include="footer :: copy"></div><!--效果-->
<div><footer>2011 The Good Thymes Virtual Grocery</footer>
</div><footer>2011 The Good Thymes Virtual Grocery
</footer><div>2011 The Good Thymes Virtual Grocery
</div>

【4】日期格式化:通过内置对象dates进行格式化。

<td th:text="${#dates.format(emp.birth,'yyyy-MM-dd')}"></td>

【5】通过 PUT请求提交数据:
 ● SpringMVC 中配置 HiddenHttpMethodFilter,(SpringBoot自动配置好)。
 ● 页面创建一个 post表单。
 ● 创建一个 input项,name=“_method”,值就是我们指定的方式。

private String methodParam = "_method";
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {HttpServletRequest requestToUse = request;if("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {//重点:获取_method传过来的值String paramValue = request.getParameter(this.methodParam);if(StringUtils.hasLength(paramValue)) {String method = paramValue.toUpperCase(Locale.ENGLISH);if(ALLOWED_METHODS.contains(method)) {requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);}}}filterChain.doFilter((ServletRequest)requestToUse, response);
}

页面实际操作:

<input type="hidden" name="_method" value="put" th:if="${emp}!=null">

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何进行无代码开发?有哪些无代码开发工具和无代码软件开发平台?

无代码开发是指不写代码&#xff0c;通过可视化工具进行应用程序开发。无代码开发让非技术用户通过拖拽和选择等简单操作&#xff0c;就能快速创建应用程序。 如何学习无代码开发 随着科技的不断发展&#xff0c;新的技术和工具不断涌现&#xff0c;无代码开发就是其中一种。掌…

YOLOv5算法进阶改进(5)— 主干网络中引入SCConv | 即插即用的空间和通道维度重构卷积

前言:Hello大家好,我是小哥谈。SCConv是一种用于减少特征冗余的卷积神经网络模块。相对于其他流行的SOTA方法,SCConv可以以更低的计算成本获得更高的准确率。它通过在空间和通道维度上进行重构,从而减少了特征图中的冗余信息。这种模块的设计可以提高卷积神经网络的性能。�…

代码随想录二刷 | 哈希表 | 总结篇

代码随想录二刷 &#xff5c; 哈希表 &#xff5c; 总结篇 理论基础哈希表经典题目数组作为哈希表set作为哈希表map作为哈希表 理论基础 一般来说哈希表都是用来快速判断一个元素是否出现集合里。 对于哈希表&#xff0c;要知道哈希函数和哈希碰撞在哈希表中的作用。 哈希函…

Redis常用操作及应用(二)

一、Hash结构 1、常用操作 HSET key field value //存储一个哈希表key的键值 HSETNX key field value //存储一个不存在的哈希表key的键值 HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对 HGET key fie…

Java代码的编译与执行过程

一、编译过程 1、javac 编译 Java源代码通过编译器&#xff08;javac&#xff09;编译为字节码文件(.class)。 idea中的 build 和 maven package等指令都可以编译为 .class 2、类加载器(Class Loader) 类加载器负责将类的字节码文件加载到内存中&#xff0c;以便在运行时创…

数据在内存中的存储练习题

数据在内存中的存储练习题 文章目录 数据在内存中的存储练习题1. 练习一2.练习二3. 练习三4. 练习四5. 练习五6. 练习六7. 总结 1. 练习一 #include <stdio.h>int main() {char a -1;signed b -1;unsigned char c -1;printf("a %d b %d c %d", a, b, c)…

Java的特性

Java是一种广泛使用的编程语言&#xff0c;它具有许多独特的特性&#xff0c;包括简单易学、面向对象、可移植性、安全性、多线程等。下面我将对这些特性进行详细的介绍&#xff0c;并阐述它们的重要性。 一、简单易学 Java是一种相对容易学习的编程语言。它的语法简单明了&…

人工智能|机器学习——机器学习如何判断模型训练是否充分

一、查看训练日志 训练日志是机器学习中广泛使用的训练诊断工具&#xff0c;每个 epoch 或 iterator 结束后&#xff0c;在训练集和验证集上评估模型&#xff0c;并以折线图的形式显示模型性能和收敛状况。训练期间查看模型的训练日志可用于判断模型训练时的问题&#xff0c;例…

C++ 泛型编程,函数模版和类模版

1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础 就比如说活字印刷术&#xff0c;就是提供一个模具&#xff0c;然后根据模具来印刷出不同的字。 泛型编程跟着类似&#xff0c;提供一个模版&#xff0c;根据这…

微服务--05--配置管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 配置管理这些问题都可以通过统一的配置管理器服务解决。而Nacos不仅仅具备注册中心功能&#xff0c;也具备配置管理的功能&#xff1a; 1.配置共享1.1.添加共享配置…

【Spark基础】-- RDD 转 Dataframe 的三种方式

一、环境说明 Oracle JDK 11Scala 2.12.17Apache Spark 3.1.1Apache Hadoop 3.1.0 二、RDD 转 Dataframe 的方法 1、通过 StructType 创建 Dataframe(强烈推荐使用这种方法) /*** 方法一:通过 StructType 创建 Dataframe* @param spark SparkSession* @param rdd 输入* @…

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…

方舟笔记:方舟开发框架概述

方舟笔记 方舟开发框架概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134677116 今年&#xff08;…

API接口测试工具的主要作用及选择指南

API接口测试是现代软件开发中至关重要的一环。为了确保不同组件之间的无缝集成和功能正常运作&#xff0c;API接口测试工具应运而生。本文将介绍API接口测试工具的主要作用&#xff0c;以及在选择适合项目的工具时需要考虑的因素。 1、功能测试&#xff1a;API接口测试工具的首…

Linux内存回收:LRU算法

linux操作系统再内存不足时会使用Swap机制&#xff0c;将一些不经常使用的匿名内存页放到磁盘当中&#xff0c;等下次需要时再读取到内存当中&#xff0c;而这个LRU算法就是用来选择把哪些不常使用的匿名内存页放到磁盘当中的。 LRU&#xff08;Least Recently Used&#xff09…

【面经八股】搜广推方向:面试记录(四)

【面经&八股】搜广推方向:面试记录(四) 文章目录 【面经&八股】搜广推方向:面试记录(四)1. 自我介绍2. 项目问答3. 八股4. 编程题4.1 大数加法4.2 平面最近点对问题求解5. 反问环节1. 自我介绍 。。。。。。 2. 项目问答 问的有点细。。。。。。 3. 八股 1)…

使用 eyed3 从 mp3 文件名获取歌曲名设置 ID3 属性

需求 近期有朋友拜托弄一批 mp3 放 U 盘里面以便开车的时候听&#xff0c;于是下载了一批歌曲&#xff0c;都整理成 歌曲名-歌唱者.mp3 这样的文件名。可是有些播放器会优先使用 ID3&#xff08;即 mp3 文件的一个自带的信息段。顺便吐槽一下&#xff0c;官方网站 https://id3…

android交叉编译pidstat iostat mpstat

android交叉编译pidstat iostat mpstat 文章目录 android交叉编译pidstat iostat mpstat编译环境编译工具下载 编译过程编译环境系统环境NDK版本的选择 源码下载只编译简单的pidstat mpstat iostat编译编译脚本问题 使用技术支持 编译环境 编译工具下载 参考这个&#xff1a;…

python避坑指南(更新中)

os.path.join 避免连续的/&#xff0c;看示例即清楚&#xff0c;最好的避免方法是字符串首末都不要加’/&#xff1a; join用法 用join前面的符号将参数数组里面的字符串连接起来&#xff0c;注意join只有一个参数

tlais智能学习辅助系统-修改部门功能实现

学习黑马程序员的JavaWeb课程&#xff0c;自己写的部门信息修改部分程序 控制层&#xff1a; //DeptController.java /** * 根据ID查询部门信息 * param id * return */ GetMapping("/{id}") public Result select(PathVariable Integer id){log.info("查询id…