当前位置: 首页 > news >正文

springmvc整合thymeleaf

概述

Thymeleaf提供了一组Spring集成,使您可以将其用作Spring MVC应用程序中JSP的全功能替代品。

这些集成将使您能够:

  • @Controller像使用JSP一样,将Spring MVC 对象中的映射方法转发到Thymeleaf管理的模板。
  • 在模板中使用Spring表达式语言(Spring EL)代替OGNL。
  • 在与表单支持Bean和结果绑定完全集成的模板中创建表单,包括使用属性编辑器,转换服务和验证错误处理。
  • 显示Spring管理的消息文件中的国际化消息(通过常规MessageSource对象)。
  • 使用Spring自己的资源解析机制解析您的模板。

thymeleaf自己也做了spring的集成,所以我们并不需要做太多的配置,就可以达到我们想要的结果。thymeleaf提供了两种集成方法:①、注解配置,也就是java代码,②、xml文件配配置,本文主要介绍第二种xml配置。

你能get到的知识点:

1、springmvc整合thymeleaf

2、spring提供的三种model的使用

3、解决html前端thymeleaf不生效问题(见问题1)

4、解决html前端显示乱码问题(见问题2)

springmvc整合thymeleaf

一:加入依赖

在springmvc里面,除了要加入 thymeleaf的主依赖之外,还需要 thymeleaf-spring4,否则会报 org.thymeleaf.spring4.view.ThymeleafViewResolver,找不到thymeleaf解析器,所以 thymeleaf-spring4也是必不可少的。

Thymeleaf具有针对Spring Framework 3.x和4.x的集成,由两个独立的库分别称为thymeleaf-spring3和提供thymeleaf-spring4。这些库打包在单独的.jar文件(thymeleaf-spring3-{version}.jar和thymeleaf-spring4-{version}.jar)中,需要添加到类路径中,以便在应用程序中使用Thymeleaf的Spring集成

            <!--        thymeleaf--><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring4</artifactId><version>3.0.11.RELEASE</version></dependency><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.11.RELEASE</version></dependency>

复制

在springmvc配置文件中配置thymeleaf解析器,官方文档中Thymeleaf提供了上述两个接口的实现:

    org.thymeleaf.spring4.view.ThymeleafVieworg.thymeleaf.spring4.view.ThymeleafViewResolver

复制

不过现在都已经被 org.thymeleaf.spring4.view.ThymeleafViewResolver所代替,至于以上配置是否还能够生效,就要靠你来试试了。

 <!-- thymeleaf 模板解析器 --><bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/" /><property name="suffix" value=".html" /><property name="templateMode" value="HTML" /><property name="cacheable" value="false" /><property name="characterEncoding" value="UTF-8"/></bean><bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver" /></bean><!--    视图解析器--><bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine" /><property name="characterEncoding" value="UTF-8"/></bean>

复制

ViewResolvers是负责获取特定操作和语言环境的View对象的对象。通常,控制器要求ViewResolvers转发到具有特定名称的视图(由controller方法返回的String),然后应用程序中的所有视图解析器将按有序链执行,直到其中一个能够解析该视图为止。如果返回了View对象,并且将控件传递给该对象以呈现HTML。

注:值得注意的是,如果自己设置了spring的视图解析器,需要将其注释掉,否则thymeleaf解析器可能不会生效,我就是因为这个调试了好久,最后才发现这个问题。

<!--    配置视图解析器 prefix:前缀, suffix:后缀   使用thymeleaf需要将其注释掉--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".html"/></bean>

复制

:编写控制器

需要从控制层传数据到视图时,我们就会使用model,常用的三种model就是:Model、ModelMap、ModelAndView。使用这三种model时,spring框架自动创建实例并作为controller的入参,用户无需自己创建

1、使用Model

/*** 在Model里存入一个用户信息* @return hello页面*/@GetMapping("returnModelAndView")public String returnModelAndView(Model model){model.addAttribute("userInfo",new UserInfo("lomtom","123",new Address("湖南","邵阳")));return "hello";}

复制

Model是一个接口, Model源码:

public interface Model {Model addAttribute(String var1, Object var2);Model addAttribute(Object var1);Model addAllAttributes(Collection<?> var1);Model addAllAttributes(Map<String, ?> var1);Model mergeAttributes(Map<String, ?> var1);boolean containsAttribute(String var1);Map<String, Object> asMap();
}

复制

2、使用ModelMap

ModelMap继承LinkedHashMap

ModelMap源码:

public class ModelMap extends LinkedHashMap<String, Object> {public ModelMap() {}public ModelMap(String attributeName, Object attributeValue) {this.addAttribute(attributeName, attributeValue);}public ModelMap(Object attributeValue) {this.addAttribute(attributeValue);}public ModelMap addAttribute(String attributeName, Object attributeValue) {Assert.notNull(attributeName, "Model attribute name must not be null");this.put(attributeName, attributeValue);return this;}public ModelMap addAttribute(Object attributeValue) {Assert.notNull(attributeValue, "Model object must not be null");return attributeValue instanceof Collection && ((Collection)attributeValue).isEmpty() ? this : this.addAttribute(Conventions.getVariableName(attributeValue), attributeValue);}public ModelMap addAllAttributes(Collection<?> attributeValues) {if (attributeValues != null) {Iterator var2 = attributeValues.iterator();while(var2.hasNext()) {Object attributeValue = var2.next();this.addAttribute(attributeValue);}}return this;}public ModelMap addAllAttributes(Map<String, ?> attributes) {if (attributes != null) {this.putAll(attributes);}return this;}public ModelMap mergeAttributes(Map<String, ?> attributes) {if (attributes != null) {Iterator var2 = attributes.entrySet().iterator();while(var2.hasNext()) {Entry<String, ?> entry = (Entry)var2.next();String key = (String)entry.getKey();if (!this.containsKey(key)) {this.put(key, entry.getValue());}}}return this;}public boolean containsAttribute(String attributeName) {return this.containsKey(attributeName);}
}

复制

3、使用ModelAndView

/*** 在ModelAndView里存入一个用户信息* @return ModelAndView*/@GetMapping("returnModelAndView")public ModelAndView returnModelAndView(ModelAndView modelAndView){modelAndView.setViewName("hello");modelAndView.addObject("userInfo",new UserInfo("lomtom","123",new Address("湖南","邵阳")));return modelAndView;}

复制

ModelAndView顾名思义就是模型和试图的结合。ModelAndView源码:

public class ModelAndView {private Object view;private ModelMap model;private HttpStatus status;private boolean cleared = false;......
}

复制

四:编写html

首先,写一个链接,请求 returnModelAndView请求。

<a href="returnModelAndView">ModelAndView</a>

复制

然后,写hello.html页面用于验证

<h2>你好啊,你成功了</h2>
<p th:text="${userInfo.userName}+'来自'+${userInfo.address.province}+${userInfo.address.city}"></p>

复制

五:结果

六:记录我遇到的问题

问题1:配置好一切后,thymeleaf无法解析,所有关于thymeleaf的显示都无法生效。解决:由于我配置了spring的视图解析,所以导致thymeleaf的试图解析无法生效,所以去掉spring的视图解析。

thmelaf介绍Springmvc的视图解析:快速浏览其属性足以了解其配置方式:

  • viewClass建立View实例的类。对于JSP解析器,这是必需的,但是当我们与Thymeleaf合作时,根本不需要。
  • prefix与suffixThymeleaf的TemplateResolver对象中相同名称的属性的工作方式相似。
  • order 确定在链中查询ViewResolver的顺序。
  • viewNames 允许使用此ViewResolver解析视图名称(带通配符)。

问题2:前端显示乱码,具体表现为后台传入的不乱码,但是html中原本存在的乱码。解决:在试图解析器和模板解析器中加入参数:<propertyname="characterEncoding"value="UTF-8"/>

相关文章:

springmvc整合thymeleaf

概述 Thymeleaf提供了一组Spring集成&#xff0c;使您可以将其用作Spring MVC应用程序中JSP的全功能替代品。 这些集成将使您能够&#xff1a; Controller像使用JSP一样&#xff0c;将Spring MVC 对象中的映射方法转发到Thymeleaf管理的模板。在模板中使用Spring表达式语言&…...

Redis 内存管理机制

Redis作为一个内存数据库&#xff0c;内存资源非常珍贵。因此&#xff0c;Redis引入了3种内存管理机制来释放不必要的内存&#xff0c;包括定期删除、惰性删除和内存淘汰机制。 定期删除 定期删除是Redis内存管理机制的一种&#xff0c;它用于删除过期的键值对。Redis每隔 10…...

Apache Zeppelin系列教程第九篇——Zeppelin NoteBook数据缓存

背景 在使用Zeppelin JDBC Intercepter 对于Hive 数据进行查询过程中&#xff0c;如果遇到非常复杂的sql&#xff0c;查询效率是非常慢 比如&#xff1a; select dt,count(*) from table group by dt做过数据开发的同学都知道&#xff0c;在hive sql查询过程中&#xff0c;hive…...

用代码实现一个简单计算器

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造…...

运维圣经:挖矿木马应急响应指南

目录 挖矿木马简介 挖矿流程 挖矿木马应急响应 一. 隔离被感染主机 二. 确定挖矿进程 三. 挖矿木马清除 1、阻断矿池地址的连接 2、清除挖矿定时任务、启动项等 3、禁用可疑用户 4、定位挖矿木马文件的位置并删除 5、全盘杀毒、加固 挖矿木马简介 挖矿&#xff1a;…...

【Flutter】Flutter 如何获取安装来源信息

文章目录 一、 前言二、 安装来源信息的基本概念1. 什么是安装来源信息2. 为什么我们需要获取安装来源信息 三、 如何在 Flutter 中获取安装来源信息1. 准备工作2. 安装必要的依赖库3. 编写代码获取安装来源信息 四、 完整示例代码五、总结 一、 前言 在这篇文章中&#xff0c…...

Stimulsoft Reports用户手册:Report Designer介绍

Stimulsoft Reports.Net是一个基于.NET框架的报表生成器&#xff0c;能够帮助你创建结构、功能丰富的报表。StimulReport.Net 的报表设计器不仅界面友好&#xff0c;而且使用便捷&#xff0c;能够让你轻松创建所有报表&#xff1b;该报表设计器在报表设计过程中以及报表运行的过…...

跨模态检索论文阅读:Dissecting Deep Metric Learning Losses for Image-Text Retrieval(GOAL)

Dissecting Deep Metric Learning Losses for Image-Text Retrieval 剖析图像文本检索中的深度度量学习损失 2022.10 视觉语义嵌入&#xff08;VSE&#xff09;是图像-文本检索中的一种流行的应用方法&#xff0c;它通过学习图像和语言模式之间的联合嵌入空间来保留语义的相似性…...

贪心算法part5 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

文章目录 435. 无重叠区间思路思路代码困难 763.划分字母区间思路官方题解代码困难 56. 合并区间思路思路代码 今日收获 435. 无重叠区间 思路 重叠问题都需要先排好序&#xff0c;再贪心 思路代码 func eraseOverlapIntervals(intervals [][]int) int {sort.Slice(interva…...

IMX6ULL裸机篇之SPI实验-ICM20608代码实现

一. SPI 实验 SPI实验&#xff1a;学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608&#xff0c;读取 ICM-20608 的六轴数据。 本文学习 SPI通信实验中&#xff0c;涉及从设备的 SPI代码编写。 之前学习了 SPI 主控芯片代码的编写&#xff0c;如下所示&#xff1a; IMX6ULL…...

51单片机读取DS18B20温度传感器

1.首先我们知道DS18B20是单总线协议&#xff0c;只有一根数据线。所以Data数据线即使发送端又是接收端&#xff0c;同时DS18B20内部接了弱上拉电阻&#xff08;如图一所示&#xff09;&#xff0c;数据线默认为高电平。有了这些概念&#xff0c;我们就能进行下一步。 图一&…...

set/map学习

我们要开始学习map和set的使用&#xff0c;虽然使用更加复杂&#xff0c;但是STL整体的设计&#xff0c;本身就具有很强的前瞻性和延续性&#xff0c;比如说迭代器等&#xff0c;我们顺着文档来看。这也是除了vector之外最重要的容器&#xff0c;当然还有unordered_map 和 unor…...

JavaScript Web APIs学习总结

以后声明变量我们有限使用哪一个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#xff0c;只要地址不变&…...

萤石摄像头RTSP流获取(黑屏解决)

前言 在获取萤石摄像头RTSP视频流时&#xff0c;视频流获取不成功&#xff0c;黑屏并且一直显示缓冲中。下面对获取过程中查阅的资料和解决方案做一下汇总。 打开RTSP 在萤石云视频APP中打开RTSP&#xff0c;【我的】-【工具】-【局域网设备预览】-【开始扫描】-【选择摄像头…...

ThreadLocal引发的内存泄漏分析

预备知识&#xff08;引用&#xff09; Object o new Object(); 这个o&#xff0c;我们可以称之为对象引用&#xff0c;而new Object()我们可以称之为在内存中产生了一个对象实例。 当写下 onull时&#xff0c;只是表示o不再指向堆中object的对象实例&#xff0c;不代表这个…...

银行数据治理:数据质量管理实践

现代商业银行日常经营活动中积累了大量数据&#xff0c;这些数据除了支持银行前台业务流程运转之外&#xff0c;越来越多地被用于决策支持领域&#xff0c;风险控制、产品定价、绩效考核等管理决策过程也都需要大量高质量数据支持。银行日常经营决策过程的背后&#xff0c;实质…...

2.7V至25V宽输入电压15A 峰值电流

HT7179是一款高功率异步升压转换器&#xff0c;集成 20mΩ功率开关管&#xff0c;为便携式系统提供高效的 小尺寸解决方案。 HT7179具有2.7V至25V宽输入电压范围&#xff0c;可为 采用单节或两节锂电池&#xff0c;或12V铅酸电池的应 用提供支持。该器件具备15A开关电流能力&a…...

Vue 父子组件应用指南:从基础到实战

文章目录 一、创建父组件二、创建子组件三、在父组件中使用子组件四、父子组件之间的通信1. 数据传递2. 事件传递 Vue.js 是一种流行的 JavaScript 框架&#xff0c;用于构建用户界面。其中&#xff0c;父子组件的概念是 Vue 开发中非常重要的一部分。本文将介绍如何使用 Vue 创…...

todotodo

todotodo...

创建autotool项目

GNU Autotools是linux系统一套自动化编译工具&#xff0c;生成的项目可移植&#xff0c;通过configure && make即可生成目标程序。GNU Autotools组件有&#xff1a;autoscan, aclocal, autoconf, automake,autoheader等。 不用管这些工具的原理&#xff0c;只要知道他们…...

计算机概念

计算机的体系结构 计算机俗称“电脑”computer(kəmˈpjuːtə(r))哈哈&#xff0c;本质上就是一台在各个领域被广泛使用的设备&#xff0c;主要由硬件和软件两大部分组成。 常见的硬件&#xff1a;CPU、内存、硬盘、显卡、主板、键盘、显示器、鼠标、... CPU - 中央处理…...

【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

文章目录 TOPSIS简介方法和原理数学定义数学语言描述现实案例 正负理想解定义实例 量纲 TOPSIS法的算法步骤1.用向量规范化的方法求得规范决策矩阵2.构成加权规范阵C(c~ij~)~m*n~3.确定正负理想解的距离4.计算各方案到正理想解与负理想解的距离5.计算各方案的综合评价指数6.排列…...

网络安全(黑客)工具

1.Nmap 它是网络管理员 必用的软件之一&#xff0c;以及用以评估网络系统安全。正如大多数被用于网络安全的工具&#xff0c;nmap 也是不少黑客及骇客&#xff08;又称脚本小子 &#xff09;爱用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器&#xff…...

探究前后端数据交互方式

前端和后端在 Web 开发中扮演着不同的角色&#xff0c;两者需要进行数据的传递和交互。本篇文章将主要讨论前后端数据交互方式的不同类型和应用场景。 一、什么是前后端数据交互&#xff1f; 在 Web 开发中&#xff0c;前端负责用户界面的设计和交互&#xff0c;后端负责数据…...

Yolov5轻量化:CVPR2023|RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构

1.RIFormer介绍 论文:https://arxiv.org/pdf/2304.05659.pdf 本文基于重参数机制提出了RepIdentityFormer方案以研究无Token Mixer的架构体系。紧接着,作者改进了学习架构以打破无Token Mixer架构的局限性并总结了优化策略。搭配上所提优化策略后,本文构建了一种极致简单且…...

Spring-Retry实现及原理

前言 重试&#xff0c;其实我们其实很多时候都需要的&#xff0c;为了保证容错性&#xff0c;可用性&#xff0c;一致性等。一般用来应对外部系统的一些不可预料的返回、异常等&#xff0c;特别是网络延迟&#xff0c;中断等情况。还有在现在流行的微服务治理框架中&#xff0…...

Java中的锁

为什么会有这些锁呢&#xff1f; 因为一种类型的锁很难应对线程操作同步资源的情况。 乐观锁和悲观锁 自旋锁和适应性自旋锁 无锁、偏向锁、轻量级锁和重量级锁 公平锁和非公平锁 可重入锁和非可重入锁 乐观锁和悲观锁 悲观锁认为当它操作数据的时候&#xff0c;必然用一…...

学习系列:5种常见的单例模式变体及其实现方式

单例模式是一种创建型设计模式&#xff0c;它保证一个类只有一个实例&#xff0c;并提供了一个全局访问点。在实际应用中&#xff0c;我们可能会遇到一些特殊情况&#xff0c;需要对单例模式进行一些变体&#xff0c;以满足不同的需求。下面介绍几种常见的单例模式变体。 1. 懒…...

三菱FX5U系列PLC之间进行简易PLC间链接功能的具体方法

三菱FX5U系列PLC之间进行简易PLC间链接功能的具体方法 功能介绍: 在最多8台FX5U或者FX3U PLC之间通过RS-485通信方式连接,进行软元件相互链接的功能。 接线注意事项: 根据链接模式和所使用的从站数量的不同,链接软元件的占用点数也有所变化。根据链接软元件的起始编号,对占…...

基于DBACAN的道路轨迹点聚类

目录 前言道路栅格化轨迹聚类参考资料 前言 很多针对道路轨迹的挖掘项目前期都需要对道路进行一段一段的分割成路段&#xff0c;然后对每一个路段来单独进行考察&#xff0c;如设定路段限速标识&#xff0c;超速概率等&#xff0c;如何对道路进行划分&#xff0c;其实是一个很…...

网站构建/营销型网站的分类不包含

作为开发人员&#xff0c;每个人都会遇到有关在生产服务器上启用GC日志的问题。 建议在生产服务器上启用GC登录吗&#xff1f; 是的&#xff0c;建议在生产服务器上启用GC登录 。 通过在JVM上启用GC登录的开销很小。 根据标准性能评估公司&#xff08;SPEC&#xff09; &#x…...

江苏建设工程标准网站/爱站网seo

下面三个都是正确的写法&#xff0c;调用的是os包里path子项的join函数&#xff0c;作用是将路径相加成一个完整路径&#xff1a;from os.path import join print(join(C:\\windows, system32))import os print(os.path.join(C:\\windows, system32))import os.path print(os.p…...

南宁国贸网站建设/营销app

深度学习—从入门到放弃&#xff08;二&#xff09;简单线性神经网络 1.基本结构 就像昨天说的&#xff0c;我们构建深度学习网络一般适用于数据大&#xff0c;处理难度也大的任务&#xff0c;因此对于网络的结构需要有一个非常深入的了解。这里以一个分类猫狗的线性神经网络…...

微信公众号(网站建设)合同/亚马逊alexa

转载于:https://www.cnblogs.com/liying123/p/5268796.html...

做网站有哪些费用/网站建设黄页视频

1.Python的注释注释的目的是让阅读人员能够轻松读懂每一行代码的意义&#xff0c;同时也为后期代码维护提供便利。在python中&#xff0c;单行注释以#开头&#xff0c;如下所示.#第一个注释 print(Hello,Wold!)#第二个注释Python的多行注释用两个三引号 包含起来&#xff0c;如…...

网站建设沈阳公司哪家好/360免费建站教程

服务器上的Tomcat 经常过一段时间就会死掉&#xff0c;为了防治Tomcat突然当掉影响业务&#xff0c;设置一个定时重启计划。 bat脚本如下&#xff1a; echo restart tomcat6 service, log to C:\workspace\tomcat_restart.log echo 1. stop tomcat6 service echo 2. sleep 10 s…...