springmvc整合thymeleaf

news2025/2/14 7:13:20

概述

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.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中原本存在的乱码。解决:在试图解析器和模板解析器中加入参数:<propertyname="characterEncoding"value="UTF-8"/>

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

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

相关文章

win10中部署个人邮件服务器hMailServer

一、安装邮件服务器hMailServer hMailServer是一个免费的开源电子邮件服务器,适用于Microsoft Windows,本次实践以Windows10为例。hMailServer支持常见的电子邮件协议(IMAP、SMTP 和 POP3),并且可以轻松地与许多现有的 Web 邮件系统集成。它具有灵活的垃圾邮件保护,可以附…

Allegro PCB设计中:结构文件DXF导入、更新、PCB板框更改

1.将结构工程师输出的DXF文件导入到Allegro PCB设计中;文章来源地址https://www.yii666.com/blog/453846.html?action=onAll 2.结构文件DXF多次更改导致PCB板框尺寸涉及的修改; 1.Allegro导入结构DXF文件 Step1:首先进行单位精度设置,我们一般设置mil小数点二位;mm设置…

ROS-melodic:源码安裝teb_local_planner算法、替换DWA算法

一.安裝teb_local_planner算法 源码下载地址&#xff1a;GitHub - rst-tu-dortmund/teb_local_planner: An optimal trajectory planner considering distinctive topologies for mobile robots based on Timed-Elastic-Bands (ROS Package) 注意选择对应ROS版本的代码。 放在…

宝塔安装yapi

宝塔安装部署YApi图文教程&#xff0c;YApi旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API。 官方文档&#xff1a;https://hellosean1025.github.io/yapi/ 1.给宝塔安装PM2管理器同时安装node 下面看一下使用宝塔的PM2管理器…

掌握SQL注入利器:SQLMap使用入门教程及技巧分享

1、SQLMap安装与使用 SQLMap 是一个功能强大的自动化 SQL 注入工具&#xff0c;它可以用于检测和利用 SQL 注入漏洞。以下是 SQLMap 的使用教程的基本步骤&#xff1a; 1.安装 SQLMap&#xff1a; 首先&#xff0c;你需要从 SQLMap 的官方网站下载并安装 SQLMap 工具。根据你…

#2023开放原子全球开源峰会之旅

#2023我在开源峰会 2023开放原子全球开源峰会参会指南 嗨咯&#xff0c;大家好&#xff01; 6月11号&#xff0c;是一年一度的开放原子大会&#xff0c;有幸参加&#xff0c;很开心&#xff01; 文章目录 1、逛展区&#xff08;领周边&#xff09;环节1.1 CSDN展区1.2 阿里云 …

frp实现内网穿透(内网服务器到公网访问的方案)

目录 背景: 一、frp的简介 二、Frp Server的配置 三.Frp Client的配置 背景: 我使用python写了一个http后端&#xff0c;如代码所示&#xff0c;ip为10.1.136.73&#xff0c;port为8000&#xff0c;现在需要把http后端在公网可以被使用。一个较简单的方案是通过frp实现内网…

Centos7/Centos8安装Mysql8

​ 1.检测系统。 是否已经安装过mysql或其依赖&#xff0c;若已装过要先将其删除&#xff0c;否则第4步使用yum安装时会报错&#xff1a; # yum list installed | grep mysql若出现如下所示&#xff0c;则用第三行中的命令删掉mysql&#xff1a; # yum list installed | gr…

为什么超三成制造企业上市公司选择用友U9 cloud?

导读&#xff1a;30%制造企业上市公司和40%专精特新制造业上市公司都选择用友U9 cloud 当前&#xff0c;数智化转型已经成为中国制造重构竞争力、实现高质量发展的必经之路。《“十四五”智能制造发展规划》提出&#xff0c;到2025年&#xff0c;70%的规模以上制造业企业基本实…

命名管道:FIFO

至此&#xff0c;我们还只能在相关的程序之间传递数据&#xff0c;即这些程序是由一个共同的祖先进程启动的。但如果我们想在不相关的进程之间交换数据&#xff0c;这还不是很方便。 我们可以用FIFO文件来完成这项工作&#xff0c;它通常也被称为命名管道&#xff08;named pip…

一文看尽所有生成式模型:9大类别21个模型全回顾! DALL-E 2、Text-to-3D模型

DALL-E 2 由OpenAI开发的DALL-E 2能够从由文本描述组成的提示中生成原始、真实、逼真的图像和艺术&#xff0c;而且OpenAI已经对外提供了API来访问该模型。 DALL-E 2特别之处在于它能够将概念、属性和不同风格结合起来&#xff0c;其能力源于语言-图像预训练模型CLIP神经网络…

【SCI/EI录用案例】2区快刊1个月22天录用,新增5篇录用、1篇见刊、8篇检索

2023年6月3日-2023年6月9日 经核实&#xff0c;由我处Unionpub学术推荐的5篇论文已被期刊部录用、1篇见刊、8篇检索&#xff0c;以下是部分案例展示&#xff1a; 2区智能算法类SCI&EI 【期刊简介】IF:4.0-5.0&#xff0c;JCR2区&#xff0c;中科院3区 【检索情况】SCI&…

Win10底部任务栏无响应,跟着这3个方法做!

我的电脑型号是win10的&#xff0c;但最近我使用电脑时&#xff0c;出现了一件非常奇怪的事情&#xff0c;我点击桌面底部的任务栏&#xff0c;它不仅无响应&#xff0c;有时还会卡顿很久&#xff0c;不知道遇到win10底部任务栏无响应的情况应该怎么做呢&#xff1f;希望大家给…

AIGC繁花,绽放在精耕的算力土壤之上

2023年的春天&#xff0c;称得上一句AI之春。大模型成为技术力量新的爆发点&#xff0c;生成式AI&#xff08;AIGC&#xff09;应用风起云涌。 产业界争先恐后训大模型之际&#xff0c;广大用户最大的困惑是——发布了&#xff0c;但就是玩不到啊&#xff01; OpenAI有地域限制…

618有哪些数码好物值得入手?盘点几款618值得买的数码好物分享

距离618大促结束还有几天&#xff0c;还有谁没有入手几款数码好物的&#xff01;眼下618还没有彻底结束&#xff0c;现在上车还来得及。下面来给大家盘点几款数码好物&#xff0c;话不多说&#xff0c;一起来看看吧。 1.南卡OE不入耳蓝牙耳机 南卡OE不入耳蓝牙耳机采用了不入耳…

WDM波分复用技术:TFF(薄膜滤波) AWG(阵列波导光栅)介绍

WDM &#xff08;Wavelength Division Multiplexing&#xff09;技术是通过在光纤中传输多个不同波长的光信号来扩大光纤传输带宽并提高网络传输能力的一种技术&#xff0c;而TFF(薄膜滤波)和AWG&#xff08;阵列波导光栅&#xff09;则是两种常用的WDM技术。 TFF技术 TFF &a…

【统计模型】缺失数据处理方法

目录 一、缺失数据定义 二、缺失数据原因 三、缺失数据处理步骤 四、数据缺失机制 1.完全随机缺失&#xff08;MCAR&#xff09; 2.随机缺失&#xff08;MAR&#xff09; 3.非随机、不可忽略缺失&#xff08;NMAR&#xff09; 五、缺失数据处理方法 1.直接删除 2.缺失值…

耳朵小戴什么耳机合适,耳朵小佩戴都舒适的几款骨传导耳机分享

​骨传导耳机是通过骨骼震动来传递声音&#xff0c;不用经过外耳道和鼓膜&#xff0c;因此不会损伤听力&#xff0c;同时佩戴也更加舒适&#xff0c;不会影响对周围环境的感知。并且骨传导耳机的核心技术在于骨传导&#xff0c;它通过耳机后挂部分将声音直接传递到耳道&#xf…

skywalking-agent-java默认不支持spring cloud gateway问题

解决skywalking-agent-java不支持spring cloud gateway问题 开发环境&#xff1a;Windows10 、JDK17 下载解压Java Agent skywalking官网下载地址&#xff1a;https://skywalking.apache.org/downloads/ 解压目录为&#xff1a;D:\Programs\soft-Plugins\apache-skywalking…

CSS查缺补漏之常用文本属性、列表属性、表格属性、鼠标属性

文本属性 letter-spacing&#xff1a; 表示字母或汉字间距&#xff1b; word-spacing&#xff1a;表示单词之间或汉字之间空格的间距 <div>Loremip sumdolors itametconsecteturadipisicingelit.Voluptas.</div> <div>这是一首简单的小情歌 唱着我们心肠的曲…