【springmvc thymeleaf】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>
二:设置thymeleaf解析器
在springmvc配置文件中配置thymeleaf解析器,官方文档中Thymeleaf提供了上述两个接口的实现:
org.thymeleaf.spring4.view.ThymeleafView
org.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中原本存在的乱码。
解决:在试图解析器和模板解析器中加入参数:<property name="characterEncoding" value="UTF-8"/>
作者有话
我写的可能并不怎么详细,详细配置请查看thymeleaf官方介绍:传送门,到最后,看都看完了,如果对你有帮助,请点个赞吧。

【springmvc thymeleaf】springmvc整合thymeleaf的更多相关文章
- SpringMVC整合Thymeleaf
Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...
- Thymeleaf+SpringMVC,如何从模板中获取数据
Thymeleaf+SpringMVC,如何从模板中获取数据 在一个典型的SpringMVC应用中,带@Controller注解的类负责准备数据模型Map的数据和选择一个视图进行渲染.这个模型Map对 ...
- Thymeleaf+Spring整合
前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是SpringMvc框架. 注意Thymeleaf支持同Spring框架的3.和4.版本的集成,但是这两个版本的支持是封装在thym ...
- 【Springboot】Springboot整合Thymeleaf模板引擎
Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...
- Springboot整合thymeleaf模板
Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...
- Spring Boot2 系列教程 (十二) | 整合 thymeleaf
前言 如题,今天介绍 Thymeleaf ,并整合 Thymeleaf 开发一个简陋版的学生信息管理系统. SpringBoot 提供了大量模板引擎,包含 Freemarker.Groovy.Thym ...
- SpringBoot 整合thymeleaf
1.Thymeleaf介绍(官网推荐:https://www.thymeleaf.org/doc/articles/thymeleaf3migration.html) Thymeleaf是跟Veloc ...
- SpringMVC与MyBatis整合之日期格式转换
在上一篇博客<SpringMVC与MyBatis整合(一)——查询人员列表>中遗留了日期格式转换的问题,在这篇记录解决过程. 对于controller形参中pojo对象,如果属性中有日期类 ...
- 3.springMVC+spring+Mybatis整合Demo(单表的增删该查,这里主要是贴代码,不多解释了)
前面给大家讲了整合的思路和整合的过程,在这里就不在提了,直接把springMVC+spring+Mybatis整合的实例代码(单表的增删改查)贴给大家: 首先是目录结构: 仔细看看这个目录结构:我不详 ...
随机推荐
- Linux永久开放端口
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 3306 -j A ...
- [LeetCode] 1103. Distribute Candies to People 分糖果
题目: 思路: 本题一开始的思路就是按照流程一步步分下去,算是暴力方法,在官方题解中有利用等差数列进行计算的 这里只记录一下自己的暴力解题方式 只考虑每次分配的糖果数,分配的糖果数为1,2,3,4,5 ...
- .NET异步程序设计之async&await
目录 0.背景引入 1.async和await基本语法 2.异步方法的执行顺序 3.取消一个异步操作 4.同步和异步等待任务 5.异步操作中的异常处理 6.多线程和异步的区分 7. 在 .NET MV ...
- php Rabbitmq扩展安装坑点
pecl install amqp 出现 checking for amqp using pkg-config... configure: error: librabbitmq not found 这 ...
- 深入学习JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- VUE三 vue-router(路由)详解
前端路由 根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作 优点 用户体验好,不需要每次都从服务器全部获取,快速展现给用户 缺点 使用浏览器的前进,后退键的时 ...
- GPS轨迹发生模拟器介绍
GPS轨迹发生模拟器介绍 GPS信号模拟器能够模拟卫星信号运动轨迹,模拟GPS卫星导航系统的导航信号.GPS轨迹发生器可以模拟导航系统确定位置点如日期.时间.经度.纬度.海拔信息.速度等.GPS轨迹模 ...
- golang 学习之路 string转换为其他类型 其他类型转换为string
将其他值转换为string 一般常用fmt.Sprintf(格式,转换的值) // 使用fmt.Sprintf 转换所有的类型为string 使用 这是第一种 // 注意在sprintf使用中需要注意 ...
- 华为面试题(JAVA版)
[编程题] 扑克牌大小时间限制:10秒空间限制:131072K扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写 ...
- Rational Rose 2007破解版
首先下载好软件,链接在这里 链接:https://pan.baidu.com/s/1op-W-ZX1tqefHffs3m-r0A 提取码:0jwm 这里面包含了Rational Rose 2007版的 ...