【Servlet】thymeleaf快速入门

文章目录

  • 一、thymeleaf介绍
  • 二、入门案例

一、thymeleaf介绍

Thymeleaf:视图模板技术

在index.html页面上加载java内存中的fruitList数据,这个过程我们称之为渲染(render)。

thymeleaf是用来帮助我们做视图渲染的一个技术。


二、入门案例

一般servlet都需要在web.xml中注册,但如果觉得标签很多,servlet从3.0开始,也支持注解方式注册:@WebServlet(“/index”),所以我们的web.xml文件是可以删掉的。

在IndexServlet.java中获取数据库数据

// servlet从3.0开始,也支持注解方式注册
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        FruitDAO fruitDAO = new FruitDAOImpl();
        List<Fruit> fruitList = fruitDAO.getFruitList();
        HttpSession session = request.getSession();
        session.setAttribute("fruitList", fruitList);
    }
}

将数据展示到页面上:在web文件夹下新建index.html页面

加入thymeleaf的jar包

  1. 直接往根目录的lib里仍

    image-20240305165500060

  2. 新建文件夹lib_thymeleaf

    将thymeleaf的jar包全部拷贝进去

    image-20240305165839081

    然后将它添加为库

    image-20240305165938311

    名字跟文件夹名一样即可

    image-20240305170216823

    然后将项目包导入工程

    将项目包导入Artifact

2)在myssm文件夹下新建Servlet类ViewBaseServlet(这个类直接从thymeleaf源代码里拷出来即可)

类名不一定叫ViewBaseServlet,新建它的目的是因为它里面有两个方法。

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;

    @Override
    public void init() throws ServletException {

        // 1.获取ServletContext对象
        ServletContext servletContext = this.getServletContext();

        // 2.创建Thymeleaf解析器对象
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);

        // 3.给解析器对象设置参数
        // ①HTML是默认模式,明确设置是为了代码更容易理解
        templateResolver.setTemplateMode(TemplateMode.HTML);

        // ②设置前缀
        String viewPrefix = servletContext.getInitParameter("view-prefix");

        templateResolver.setPrefix(viewPrefix);

        // ③设置后缀
        String viewSuffix = servletContext.getInitParameter("view-suffix");

        templateResolver.setSuffix(viewSuffix);

        // ④设置缓存过期时间(毫秒)
        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());
    }
}

3)在web.xml中添加配置

  • 配置前缀 view-prefix
  • 配置后缀 view-suffix
<!-- 配置上下文参数 -->
<context-param>
    <param-name>view-prefix</param-name>
    <!-- / 代表的是web根目录 -->
    <param-value>/</param-value>
</context-param>
<context-param>
    <param-name>view-suffix</param-name>
    <param-value>.html</param-value>
</context-param>

它会在ViewBaseServlet中的init()方法中读取这两个配置,然后会创建出engin(引擎),然后根据引擎再去渲染我们的页面

image-20240305172046749

4)使得我们的Servlet继承ViewBaseServlet

// servlet从3.0开始,也支持注解方式注册
@WebServlet("/index")
public class IndexServlet extends ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        FruitDAO fruitDAO = new FruitDAOImpl();
        List<Fruit> fruitList = fruitDAO.getFruitList();
        HttpSession session = request.getSession();
        session.setAttribute("fruitList", fruitList);

        // 此处的视图名称是 index
        // 那么thymeleaf会将这个 逻辑视图名称 对应到物理视图名称上去
        // 逻辑视图名称: index
        // 物理视图名称: view-prefix + 逻辑视图名称 + view-suffix
        // 所以真实的视图名称是: /    index           .html,这个就是web目录下的index.html页面
        super.processTemplate("index", request, response);
    }
}

继承后我们的Servlet依旧是Servlet,这是因为ViewBaseServlet继承了HttpServlet

image-20240305172257119

5)调用父类ViewBaseServlet中的processTemplate方法

6)根据逻辑视图名称,得到 物理视图名称

7)重新启动项目

虽然地址栏依旧是index,但是它页面显示的已经是index.html这个页面了

image-20240305173009676

8)使用thymeleaf,将数据动态渲染

在需要渲染的标签里加上th,此时会报错,但alt + enter,然后直接回车即可

<tr th>

此时它会自动在上面加上表头,这个表头它会有提示,输入th:,然后就会出现提示

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

如果需要判断数据库中的fruitList是否为空,需要使用到内置对象

image-20240402151832159

访问session里的数据

image-20240305174403196

如果把session.省略掉了,它就会从request作用域获取数据。

<tr th:if="${#lists.isEmpty(session.fruitList)}">

单元格循环及迭代

让标记了 th:ifth:unless的标签根据条件决定是否显示。

<tr th:if="${#lists.isEmpty(session.fruitList)}">
    <td colspan="4">对不起,库存为空!</td>
</tr>
<tr th:unless="${#lists.isEmpty(session.fruitList)}" th:each="fruit : ${session.fruitList}">
    <!-- th:text:显示名称 -->
    <!-- 默认情况下,这里会显示文本,但是使用thymeleaf渲染后,它会把这个值覆盖掉里面的内容 -->
    <td th:text="${fruit.fname}">苹果</td>
    <td th:text="${fruit.price}">5</td>
    <td th:text="${fruit.fcount}">20</td>
    <td><img src="imgs/del.jpg" class="delImg"/></td>
</tr>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习从0到1 day20 第二阶段 面向对象 ③ 继承

循此苦旅&#xff0c;以达天际 —— 24.4.3 一、继承的基础语法 学习目标&#xff1a; ① 理解继承的概念 ② 掌握继承的使用方式 ③ 掌握pass关键字的作用 单继承 语法&#xff1a; class 类名(父类名): 类内容体 继承分为&#xff1a;单继承和多继承 继承表示&#xff1a;将从…

redis---HyperLogLog

HyperLogLog是一个基数统计的算法&#xff0c;如果集合中的每个元素都是唯一且不重复的&#xff0c;那么这个集合的基数就是集合中元素的个数 它的原理是使用随机算法来计算&#xff0c;通过牺牲一定的精确度&#xff0c;来换取更小的内存消耗&#xff0c;优点就是占用内存小。…

“帮助“Java成长的世界级大师不简单!

文章目录 初探编程&#xff1a;“天啊&#xff0c;真酷&#xff0c;程序真的能学习。”哺育Java成长&#xff0c;成为Java幕后英雄出书《Effective Java》斩获Jolt图书大奖 是谁&#xff1f;作品一出版就获得著名的Jolt图书大奖&#xff0c;每一版本豆瓣评分均超9.0&#xff01…

[已解决] slam_gmapping: undefined symbol: _ZN8GMapping14sampleGaussianEdm问题

之前用的好好的gampping建图功能包&#xff0c;今天突然不能用了&#xff0c;运行报错如下&#xff1a; /opt/ros/noetic/lib/gmapping/slam_gmapping: symbol lookup error: /opt/ros/noetic/lib/gmapping/slam_gmapping: undefined symbol: _ZN8GMapping14sampleGaussianEdm …

ShardingJdbc兼容达梦

ShardingJdbc兼容达梦 ​ 本章详细说ShardingJdbc和达梦数据库的扩展和配置问题&#xff0c;ShardingJdbc和DruidDataSource、Mybatis整合的兼容、冲突问题&#xff0c;以及这些问题的解决方案。&#xff0c;干货满满&#xff0c;全网独一份&#xff0c;建议收藏。本章不说Sha…

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)电子科技数码爱好者交流信息新闻畅聊讨论评价

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

680.验证回文串II-力扣

680.验证回文串II-力扣 给你一个字符串 s&#xff0c;最多可以从中删除一个字符。 请你判断 s 是否能成为回文字符串&#xff1a;如果能&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false。 示例1&#xff1a; 输入&#xff1a;s “aba” 输出&#xff1a;true示…

Python就业前景如何?薪资待遇怎么样?

前言 Python作为一种高级编程语言&#xff0c;已经在多个领域得到了广泛的应用&#xff0c;包括数据分析、人工智能、Web开发等。随着技术的不断发展和应用领域的不断扩展&#xff0c;Python的就业前景也越来越广阔。 首先&#xff0c;Python在数据分析领域的应用非常广泛。随…

mac | Windows 本地部署 Seata2.0.0,Nacos 作为配置中心、注册中心,MySQL 存储信息

1、本人环境介绍 系统 macOS sonama 14.1.1 MySQL 8.2.0 &#xff08;官方默认是5.7版本&#xff09; Seata 2.0.0 Nacos 2.2.3 2、下载&数据库初始化 默认你已经有 Nacos、MySQL&#xff0c;如果没有 Nacos 请参考我的文章 &#xff1a; Docker 部署 Nacos&#xff08;单机…

滴滴盈利,司机“受伤”

近日&#xff0c;滴滴对外披露了2023年Q4及全年业绩。 财报数据显示&#xff0c;2023年Q4&#xff0c;滴滴实现营收494亿元&#xff0c;同比增长55.4%&#xff0c;净利润达11亿元&#xff1b;2023年全年滴滴实现营收共计1924亿元&#xff0c;同比增长36.6%&#xff0c;净利润达…

springboot对接minio的webhook全过程

前言 近日需要将minio的apache2.0版本给用起来&#xff0c;顺便要完善一下原有的文件上传管理系统&#xff0c;其中很重要的一点是&#xff0c;在原有客户端直传的基础上&#xff0c;再添加 minio 的上传回调给服务端做后续处理。 本文重点在于&#xff0c;介绍整个minio与spr…

MySQL生产环境常见故障及解决方案汇总

MySQL生产环境常见故障及解决方案汇总 1. MySQL主从同步异常故障1.1. 情景说明1.2. 排查过程1.3. 数据同步2. MySQL慢查询故障1. MySQL主从同步异常故障 1.1. 情景说明 MySQL主库网卡需要更换IP地址,并将原IP地址配置为MySQL集群的VIP地址,上层应用程序其实不需要更改连接My…

VUE——生命周期

概念&#xff1a; mounted:挂载 new Vue({el: "#x",data: {},methods: {},mounted() {}, }) 系统会自己调用&#xff0c;不需要我们调用。 案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

JavaScript(五)---【DOM】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下&#xff1a; MongoDB 版本号的命名规则是 x.y.z&#xff0c;当其中的 y 是奇数时表示当前的版本为开发版&#xff0c;当其中的 y 是偶数时表示当前的…

“多组数组”题的注意事项,天杀的“鲁棒性”

【题目描述】 输入一些整数&#xff0c;求出它们的最小值、最大值和平均值&#xff08;保留3位小数&#xff09;。输入保证这些数都是不超过1000的整数。 输入包含多组数据&#xff0c;每组数据第一行是整数个数n&#xff0c;第二行是n个整数。n&#xff1d;0为输入结束标记&…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

经典文献阅读之--LOG-LIO(高效局部几何信息估计的激光雷达惯性里程计)

0. 简介 局部几何信息即法线和点分布在基于激光雷达的同时定位与地图构建&#xff08;SLAM&#xff09;中是至关重要&#xff0c;因为它为数据关联提供了约束&#xff0c;进一步确定了优化方向&#xff0c;最终影响姿态的准确性。然而即使在使用KD树或体素图的辅助下&#xff…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接&#xff1a;https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码&#xff1a;isqi

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…