使用thymeleaf时,th:类标签失效的原因

article/2025/10/10 19:57:22

问题出现:

  最近学习后端,学到了thymeleaf这一块,学习中出现了一个问题我没有注意到,导致后面页面编写出现重大bug:项目中我使用了thymeleaf,配置的映射路由为:/index,访问首页的时候,tomcat配置有个设置默认打开的网页,我写成了xxx/index.html,我开始的时候运行了一遍,发现界面显示不正确,后来我看视频写的是xxx/index,我就改了下,就运行成功了,也没有深究原因。直到后面使用a标签跳转页面的时候,才发现跳转后的th:标签失效了(<a th:href="@{/xxx.html}">跳转到xxx页面</a>)

问题原因:

  我们代码中配置路由的时候是配置的/index,所以thymeleaf就不会对/index.html进行解析,所以打开的是原始的html界面,而th:前缀对于html来说是一个不能理解的东西(就好比你把java代码直接copy到c++编译器里去运行,肯定都无法识别,就相当于两种不同的语言),它是thymeleaf中的内容,所以里面有关thymeleaf的标签就会全部失效。

那我们怎么才能让它生效呢,这就得通过thymeleaf中间的TemplateEngine对象解析(其中的process方法),这样th:标签才能被识别处理。下面是servlet如何使用thymeleaf处理页面的代码:

基本的视图处理servlet类

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ViewBaseServlet extends HttpServlet {private TemplateEngine templateEngine;@Overridepublic void init() throws ServletException {// 1.获取ServletContext对象ServletContext servletContext = this.getServletContext();// 2.创建Thymeleaf解析器对象ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);// 3.给解析器对象设置参数,告诉解析器该如何处理传过来的视图名称// ①HTML是默认模式,明确设置是为了保证代码更容易理解templateResolver.setTemplateMode(TemplateMode.HTML);// ②设置前缀templateResolver.setPrefix(servletContext.getInitParameter("view-prefix"));// ③设置后缀templateResolver.setSuffix(servletContext.getInitParameter("view-suffix"));templateResolver.setCacheTTLMs(60000L);templateResolver.setCacheable(true);templateResolver.setCharacterEncoding("utf-8");// 4.创建模板引擎对象templateEngine = new TemplateEngine();// 5.给模板引擎对象设置模板解析器templateEngine.setTemplateResolver(templateResolver);}protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.设置响应体内容类型和字符集resp.setContentType("text/html;charset=UTF-8");// 2.创建WebContext对象WebContext webContext = new WebContext(req, resp, getServletContext());// 3.处理模板数据templateEngine.process(templateName, webContext, resp.getWriter());}
}

  init方法配置了视图解析器,对拿到的视图名称,设置前后缀,编码等。processTemplate用于解析视图

问题与解决:

FruitServlet类

package servlet;import bean.Fruit;
import dao.FruitDAO;
import dao.FruitDAOImpl;
import myssm.myspringmvc.ViewBaseServlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;@WebServlet("/index")
public class FruitServlet extends ViewBaseServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {FruitDAO fruitDAO = new FruitDAOImpl();List<Fruit> fruitList = fruitDAO.getAllFruits();HttpSession session = req.getSession();session.setAttribute("fruitList",fruitList);// 此处的视图名称是index// 那么thymeleaf会将这个 视图逻辑名称 对应到 物理视图名称 上去// 逻辑视图名称:index// 物理视图名称:view-prefix + 逻辑视图名称 + view-suffix// 所以真实的视图名称是: /index.htmlsuper.processTemplate("index",req,resp);}
}

  该类继承了ViewBaseServlet类,调用了父类的processTemplate方法处理index视图,并返回给浏览器。@WebServlet是将映射关系写进web.xml文件中。访问/index就是调用FruitServlet类。

test.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div><a href="./index.html">跳转到水果页面,方法1</a><a href="./index">跳转到水果页面,方法2</a>
</div>
</body>
</html>

  用于比较使用indexindex.html的差别

fruit.html(css省略了)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><div id="fruit_list"><table id="tb_fruit"><tr><th class="tCell">名称</th><th class="tCell">单价</th><th class="tCell">库存</th><th>操作</th></tr><tr th:if="${#lists.isEmpty(session.fruitList)}"><td colspan="4">对不起,数据为空!</td></tr><tr th:unless="${#lists.isEmpty(session.fruitList)}" th:each="fruit : ${session.fruitList}"><td th:text="${fruit.name}"></td><td th:text="${fruit.price}"></td><td th:text="${fruit.reserve}"></td><td>删除</td></tr></table></div>
</body>
</html>

  显示调用结果。

方法一结果:
在这里插入图片描述
  可以看到地址栏是http://localhost:8080/index.html,页面无数据显示,th:标签全部失效。

方法二结果:
在这里插入图片描述
  可以看到地址栏是http://localhost:8080/index,页面显示正常,th:标签生效

结论:

方法一:直接获取到了html的静态页面,没有经过thymeleaf解析,th:失效

方法二:/index对应FruitServlet类(web.xml中配置了映射关系),调用FruitServlet这个类的方法,最终通过processTemplate方法处理/index.html页面,最后返回给浏览器,th:生效


http://chatgpt.dhexx.cn/article/FhxI3GCG.shtml

相关文章

HTML——表头标签th的属性

<th>标签的属性和<td>标签的属性及语法格式非常的相似&#xff0c;用于设定表格中某一表头的属性。 <th>标签中常用的属性 标签描述align设置单元格内容的水平对齐方式valign设置单元格内容的垂直对齐方式bgcolor设置单元格的背景颜色background设置单元格的…

标签thead与th的区别

标签thead与th的区别 如图所示&#xff0c;thead 和 tbody标签在tr外层&#xff0c;具有更好的语义化&#xff0c;而th在 tr 之内&#xff0c;与td同级&#xff0c;起到文字加粗的效果

html中table标签、tr标签、th标签、td标签的基础知识

html中table标签、tr标签、th标签、td标签的基础知识 表格的结构表格的基本标签表格标签的基本属性table标签的基本属性tr标签的基本属性th和td标签的基本属性 表格高级样式设置相关概念外边框线样式属性frame内部边框样式属性rules 单元格合并水平方向单元格的合并垂直方向单元…

4、HTML——表格标签、表单标签

目录 一、表格标签&#xff1a;table—tr—td/th 1、合并单元格 1.1 合并同行不同列的单元格&#xff08;列合并&#xff09; 1.2 合并同列不同行的单元格&#xff08;行合并&#xff09; 二、表单标签&#xff1a;form 1、form标签 2、input输入标签 2.1 type属性…

html中的tr,td,th标签

tr是 table row 表格的行 HTML中 标签定义 HTML 表格中的行。tr 元素包含一个或多个 th 或 td 元素。 td是table data(表格数据) HTML中 标签定义 HTML 表格中的标准单元格。 元素中的文本通常是普通的左对齐文本。 th是table heading表格标题 &#xff0c;一般表格第一行的数…

javascript网页二次元3D小人详细教程

一.科班直接复制以下代码到vscode打开网页即可(小白请往下看教程) 二.小白详细教程(没有代码编译软件一样能做出来看到效果) 三.视频展示 一.科班直接复制以下代码到vscode打开网页即可(小白请往下看教程) javascript网页二次元小人(眼睛跟随鼠标移动) <!DOCTYPE html>…

web期末作业网页设计——JavaScript

目录 一.作品简介 二.网页效果 首页 花语 登录界面 注册界面 三.网页代码 首页 登录界面 注册界面 视频界面 一.作品简介 网站系统文件种类包含&#xff1a;html网页结构文件、css网页样式文件、js网页特效文件、images网页图片文件。 网页作品代码简单&#xff…

HTML+CSS+JavaScript网页特效源代码(复制代码保存即可使用)

以下下代码直接复制保存即可使用 特效一特效二特效三特效四特效五特效六特效七 特效一 方块运动演示 <html><head> <meta charset"utf-8"> <title>蓝盒子</title> <style>body { margin: 0; padding: 0;background: black…

JavaScript实现网页关灯效果

JavaScript实现网页关灯效果 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获取输入框…

JavaScript 网页购物车项目

今天是JavaScript的一个汇总&#xff0c;最近小编把自己曾经写过的JavaScript 网页购物车项目给整理了一下&#xff0c;大家可以看一下&#xff0c;然后自己也可以写一个网页购物车项目噢&#xff0c;然后我们的JavaScript的学习也到此结束啦&#xff01;下周开始给大家更新 新…

js实现网页自动化

不讲废话&#xff0c;直接主题 一、总览 二、元素获取 1、原生获取 2、jq获取 三、元素操作 $0 代表当前元素&#xff0c;下面给几个典型的例子&#xff0c;其他以此类推。 1、文本框 $0.value "United States"2、下拉框 $0.value "United States" …

JavaScript实现网页计算器

Hbuilder X中实现网页计算器&#xff08;-*/&#xff09; 文章目录 一、计算器代码二、代码分析 一、计算器代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>计算器</title><style type"text/css"…

JavaScript网页购物车

今天给大家讲解一个网页购物车的案例&#xff0c;案例比较简陋&#xff0c;包含登录注册购物车界面。 在做项目之前&#xff0c;你要在自己项目中建一个img包&#xff0c;用来存储你项目中所需用到的图片&#xff0c;如下图所示 一、登录注册介绍 界面代码展示 <style>h…

Web网页之JavaScript

一.JavaScript简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 二.JavaScript是什么&#xff1f; JavaScript是一门脚本语言。JavaScript 是一种轻量级的编…

javascript网页设计期末作业 购物网站

本次主要介绍下之前上传的作业的主要功能&#xff0c;网页下载地址&#xff1a; 网页设计期末作业 购物网站 如果对本文章内容还有疑问可以观看视频&#xff0c;也可以在评论区留言&#xff1a; javascript 网页设计期末作业 购物网站 网页实现的主要功能有&#xff1a; 1.…

【精选】JavaScript网页时钟

文章目录 前言一、效果展示一、使用的技术二、日期对象1.指定时间2.获取目前时间 三、源代码总结 前言 今天带大家使用JavaScript定制一款网页时钟 一、效果展示 一、使用的技术 主要使用了js的日期对象,实现的时候先创建一个日期对象&#xff0c;并进行网页布局,对时间获取之…

JavaScript网页设计作业(美食网站设计与实现)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Javascript网页设计作业: HTML班级网页设计 基于HTML+CSS+JS制作我们的班级网页(web前端学生网页设计作品)

&#x1f4c2;文章目录 一、&#x1f468;‍&#x1f393;网站题目二、✍️网站描述三、&#x1f4da;网站介绍四、&#x1f310;网站演示五、&#x1f527; 网站代码&#x1f9f1;HTML结构代码&#x1f492;CSS样式代码 六、&#x1f947; 如何让学习不再盲目七、&#x1f381…

网页之js

js jsjs基础语法规则数据类型函数定义调用对象内置对象自定义对象bom窗口移动domcss样式事件在前面的博客中我写了一些html和css样式的基础,但是,哪些仍然不够,碰到一些复杂的功能可能就无法解决了,所以我们又用到了js js 那么先来讲讲js,这个可以解决很多在页面操作上的…

3.2JavaScript网页编程——JavaScript网页编程基础

这里写目录标题 总体JS知识流程JS基本知识JS组成引入方式&#xff1a;内联、内部形式、外部输入输出字面量let&#xff08;推荐&#xff09;和var&#xff08;面经有&#xff09;变量&#xff08;标识符&#xff09;规则&#xff08;31&#xff08;不能数字开头&#xff09;&am…