Thymeleaf实战:th:if条件判断与th:each循环遍历的进阶技巧

爬取二手房数据:Python爬虫+Geopy实战,看透房价与地理位置的隐藏关系 哪些区域单价虚高(房源少但单价远高于周边);哪些小区性价比高(靠近地铁/学校,单价低于同地段平均水平);房价与地理位置的量化关系(如距离地铁每远1公里,单价下降多少)。如果想扩展分析范围,可爬取多个城市/区域的数据,对比不同城市的房价差异;或结合时间维度(定期爬取),分析房价的涨跌趋势。 阅读详情

1. 从新手到高手:重新认识Thymeleaf的条件与循环

如果你刚开始接触Spring Boot项目,尤其是像若依这样的快速开发框架,前端页面里那些以th:开头的标签可能会让你有点懵。我记得我第一次看到th:if和th:each的时候,心里就在想:“这不就是JSP里的JSTL标签吗?怎么又换了一套写法?” 但用了一段时间后,我发现Thymeleaf的设计确实更优雅,特别是它支持HTML原型直接在浏览器里预览,这对前端调试来说太友好了。

很多新手教程只会告诉你th:if是用来做条件判断的,th:each是用来循环遍历列表的,然后给几个简单的例子就结束了。但实际开发中,我们面对的场景要复杂得多。比如,你可能需要根据用户的角色、订单的状态、数据的有效性等多个条件组合来决定一个按钮是否显示;又或者,你需要遍历一个嵌套了好几层的复杂对象,比如一个包含商品列表的订单,而每个商品又有自己的规格属性列表。如果只掌握基础用法,遇到这些情况就会束手无策。

这篇文章,我就结合自己这些年踩过的坑和积累的经验,跟你深入聊聊th:if和th:each的进阶玩法。我不会只讲语法,而是会通过一个个真实的开发场景,告诉你如何用它们写出更简洁、更高效、也更易于维护的模板代码。我们的目标不是记住几个标签,而是掌握一种解决问题的思路。

2. th:if条件判断:不止是“显示”与“隐藏”

th:if的基础用法很简单:当表达式的结果为true时,渲染这个HTML元素;为false时,整个元素都不会出现在最终的HTML里。但它的威力,远不止于此。

2.1 多条件组合的优雅写法

原始文章里提到了用and来连接多个条件,比如(${t.pid}==${s.id}) and ${t.recycle!=1}。这没问题,但当条件越来越多时,一行代码会变得又长又难读。我推荐两种更清晰的做法。

第一种,利用Thymeleaf的内置工具对象。 比如,你经常需要判断一个集合是否为空,或者一个字符串是否有内容。与其写冗长的${list != null and !list.isEmpty()},不如直接用#lists和#strings工具类:

<div th:if="${#lists.isEmpty(userList)}">
    <p>暂时没有用户数据。</p>
</div>
<div th:if="${#strings.isEmpty(searchKeyword)}">
    <p>请输入搜索关键词。</p>
</div>

#lists.isEmpty()会同时处理null和空集合的情况,比你自己写判断更安全、更简洁。#strings工具类还能做很多事,比如判断开头结尾、计算长度、安全比较等。

第二种,将复杂条件判断移到后端。 这是很多新手容易忽略的一点。模板引擎是为了展示逻辑,而不是承载复杂的业务逻辑。如果一个元素的显示与否,需要依赖五六个字段的计算结果,那么最好在后端Controller或Service层就计算好这个布尔值,然后以一个简单的属性传给前端。

// 在Controller或Service中
model.addAttribute("showAdvancedOption", user.isVIP() && order.getAmount() > 1000 && config.isFeatureEnabled());
<!-- 在前端模板中 -->
<button th:if="${showAdvancedOption}" class="btn btn-premium">VIP专属功能</button>

这样,前端的模板会非常干净,而且业务逻辑的修改只需要在后端进行,不会影响到视图层。

2.2 善用th:unless和三元运算符

th:unless是th:if的反义词,当表达式为false时渲染元素。它特别适合用于“默认显示,仅在特定条件下隐藏”的场景。比如,一个删除按钮,只有管理员能看到:

<!-- 使用 th:if -->
<button th:if="${user.role == 'ADMIN'}" class="btn btn-danger">删除</button>

<!-- 使用 th:unless,逻辑更直接:非管理员不显示 -->
<button th:unless="${user.role != 'ADMIN'}" class="btn btn-danger">删除</button>

虽然这个例子中两者差异不大,但th:unless有时能让意图更明确。

对于简单的“二选一”内容渲染,三元运算符是更紧凑的选择。它可以直接用在属性值里:

<span th:class="${user.active} ? 'text-success' : 'text-muted'">
    [[${user.active} ? '在线' : '离线']]
</span>
<p th:text="${task.priority > 5} ? '高优先级任务' : '普通任务'"></p>

注意,这里我用的是[[...]]内联表达式来输出文本,它和th:text效果类似,但可以直接写在HTML标签体内,对于简单的文本插值非常方便。

2.3 处理null值的安全策略

空指针异常是Java开发者的“老朋友”,在模板里也不例外。直接使用可能为null的属性,比如${user.profile.address.city},如果profile为null,页面就会渲染错误。

Thymeleaf提供了一种安全的导航操作符?.,它和Java 8的Optional有点像。如果.前面的对象为null,整个表达式会优雅地返回null,而不会抛出异常。

<!-- 危险写法,profile可能为null -->
<p>城市:[[${user.profile.address.city}]]</p>

<!-- 安全写法 -->
<p>城市:[[${user?.profile?.address?.city}]]</p>

结合th:if,我们可以先判断再使用:

<div th:if="${user?.profile?.address != null}">
    <p>地址:[[${user.profile.address.fullAddress}]]</p>
</div>
<div th:unless="${user?.profile?.address != null}">
    <p>该用户未填写地址。</p>
</div>

这种写法虽然安全,但嵌套太深也会影响可读性。所以,再次强调,对于特别复杂的对象图,最好在后端就处理好,把最终需要展示的、已经确保非空的字符串传给前端。

3. th:each循环遍历:驾驭复杂数据结构

th:each是处理列表数据的利器,但它的能力远不止遍历一个简单的List<String>。

3.1 理解状态变量,获取循环元信息

在th:each="item : ${items}"这个基本语法里,我们只声明了一个迭代变量item。但Thymeleaf还允许我们声明第二个变量,即状态变量。这个名字你可以自己定,通常叫iterStat、status或者loop。

<tr th:each="product, stat : ${productList}">
    <td>序号:[[${stat.index + 1}]]</td>
    <td>商品名:[[${product.name}]]</td>
    <td>是否是偶数行:[[${stat.even}]]</td>
    <td>是否是第一项:[[${stat.first}]]</td>
</tr>

状态变量提供了丰富的元信息,我整理了一个表格,方便你查阅:

属性名说明示例值(假设遍历5个元素)
index当前迭代的索引,从0开始0, 1, 2, 3, 4
count当前迭代的计数,从1开始1, 2, 3, 4, 5
size被迭代对象的总大小5
current当前迭代变量本身,等同于itemproduct对象
even / odd布尔值,当前索引是否为偶数/奇数true/false交替
first / last布尔值,当前项是否为第一项/最后一项仅首尾为true

这些信息非常实用。比如,用stat.even和stat.odd来实现表格行的斑马纹交替背景色:

<tr th:each="item, stat : ${list}"
    th:class="${stat.odd} ? 'table-row-odd' : 'table-row-even'">
    ...
</tr>

或者,在遍历时,给最后一项添加一个特殊的样式或操作:

<div th:each="step, iter : ${steps}">
    <span>步骤 [[${iter.count}]]</span>
    <hr th:if="${!iter.last}" /> <!-- 如果不是最后一项,才显示分隔线 -->
</div>

3.2 遍历Map和嵌套集合

实际数据很少是平坦的。我们经常需要处理Map<String, Object>或者对象里嵌套集合的情况。

遍历Map时,每次迭代会得到一个Map.Entry对象,它有key和value两个属性:

<dl th:each="entry : ${categoryMap}">
    <dt>分类键:[[${entry.key}]]</dt>
    <dd>分类名:[[${entry.value}]]</dd>
</dl>

遍历嵌套集合是更常见的挑战。比如,一个订单列表,每个订单里又有商品列表。这里的关键是理清层次关系,为每一层的迭代变量取一个清晰的名字。

<!-- 假设 orders 是一个 List<Order>,每个Order有一个 items 属性是 List<OrderItem> -->
<div th:each="order, orderStat : ${orders}">
    <h3>订单号:[[${order.orderNo}]] (共 [[${order.items.size()}]] 件商品)</h3>
    <table>
        <tr th:each="item, itemStat : ${order.items}">
            <td>[[${itemStat.count}]]</td> <!-- 商品在当前订单内的序号 -->
            <td>[[${item.productName}]]</td>
            <td>[[${item.quantity}]]</td>
            <!-- 注意:这里要获取“祖父级”的orderStat.index,需要谨慎 -->
            <td>订单索引:[[${orderStat.index}]],商品索引:[[${itemStat.index}]]</td>
        </tr>
    </table>
</div>

在这个例子里,order和item分别代表外层和内层的当前对象,orderStat和itemStat是它们各自的状态变量。你可以通过orderStat.index和itemStat.index清楚地知道当前商品位于哪个订单、以及在该订单中的位置。这种清晰的命名能极大避免在复杂循环中搞混变量。

3.3 性能优化与分页思考

虽然th:each用起来很方便,但直接把成千上万条数据的列表丢给它遍历,肯定会严重影响页面渲染性能。对于大数据集,分页是必须的。

通常,分页逻辑在后端完成,Controller会查询当前页的数据(比如一个Page<User>对象)和分页信息(总页数、当前页码等)传给前端。前端模板的职责主要是展示当前页的数据和渲染分页控件。

<!-- 遍历当前页的数据 -->
<tr th:each="user : ${page.content}">
    <td>[[${user.name}]]</td>
    ...
</tr>

<!-- 渲染分页导航 -->
<nav>
    <ul class="pagination">
        <li th:class="${page.first} ? 'disabled' : ''">
            <a th:href="@{/users(page=${page.number - 1})}">上一页</a>
        </li>
        <!-- 这里可以再用一个th:each来生成页码,但注意控制显示的页码数量,避免过多 -->
        <li th:each="i : ${#numbers.sequence(1, page.totalPages)}"
            th:class="${(page.number + 1) == i} ? 'active' : ''">
            <a th:href="@{/users(page=${i - 1})}">[[${i}]]</a>
        </li>
        <li th:class="${page.last} ? 'disabled' : ''">
            <a th:href="@{/users(page=${page.number + 1})}">下一页</a>
        </li>
    </ul>
</nav>

这里用到了另一个有用的工具#numbers.sequence(start, end)来生成一个数字序列,用于循环生成页码链接。同时,通过判断page.first和page.last来禁用“上一页”和“下一页”按钮。

注意:在模板中进行复杂的计算(比如生成分页序列)会增加模板的复杂度。更常见的做法是,在后端将计算好的分页导航数据(如一个包含页码范围、是否有上一页/下一页的VO对象)直接传给前端,前端只负责渲染。这再次印证了那个原则:让模板保持简单,把复杂逻辑留给后端。

4. 实战融合:th:if与th:each的组合拳

单独使用th:if和th:each已经很强大了,但当它们组合在一起时,才能解决真正复杂的UI逻辑。

4.1 在循环内部进行条件判断

这是最常见的组合场景。在遍历列表时,根据每一项的特定属性,决定如何渲染该项。

<ul>
    <li th:each="notification : ${notifications}">
        <div th:if="${notification.type == 'ALERT'}" class="alert alert-warning">
            <strong>警告!</strong> [[${notification.content}]]
        </div>
        <div th:if="${notification.type == 'INFO'}" class="alert alert-info">
            <i class="icon-info"></i> [[${notification.content}]]
        </div>
        <div th:unless="${notification.type == 'ALERT' or notification.type == 'INFO'}">
            普通消息:[[${notification.content}]]
        </div>
    </li>
</ul>

在这个通知列表的例子中,我们根据type字段,为不同类型的通知渲染不同的HTML结构和样式。th:unless在这里用于兜底,处理其他未知或普通的类型。

4.2 循环前/后的条件控制

有时候,我们不仅要在循环内部判断,还要控制整个循环是否执行,或者在循环结束后做一些事情。

<!-- 先判断列表是否存在且非空,再循环 -->
<div th:if="${not #lists.isEmpty(products)}">
    <table>
        <tr th:each="prod : ${products}">
            <td>[[${prod.name}]]</td>
        </tr>
    </table>
    <p class="text-muted">共找到 [[${#lists.size(products)}]] 条记录。</p>
</div>
<div th:if="${#lists.isEmpty(products)}">
    <div class="alert alert-info">没有找到相关商品。</div>
</div>

这个模式非常实用:先检查数据,如果有数据就渲染表格和统计信息;如果没有数据,就显示一个友好的空状态提示,而不是一个空荡荡的表格或者直接报错。

4.3 实现复杂的行内操作按钮

结合th:each和th:onclick,我们可以为列表的每一行动态生成操作按钮,并将当前行的数据作为参数传递给JavaScript函数。这是实现“编辑”、“删除”等行内操作的关键。

原始文章里给出了一个th:onclick传递多参数的例子,用的是removeFile([[${userStat.id}]],[[${userStat.returnContractPath}]])。这里有个非常重要的细节:参数被[[...]]包裹。这是Thymeleaf的内联表达式,它确保在JavaScript上下文中,这些值被正确地输出为JavaScript字面量(字符串会被加上引号,数字则不会),避免了语法错误。

我们来写一个更完整的例子,包含编辑和删除:

<table>
    <tr th:each="item, stat : ${dataList}">
        <td>[[${item.name}]]</td>
        <td>
            <!-- 编辑按钮:跳转到编辑页面 -->
            <a th:href="@{/item/edit(id=${item.id})}" class="btn btn-sm btn-outline-primary">编辑</a>
            
            <!-- 删除按钮:触发JS确认并调用API -->
            <button type="button" class="btn btn-sm btn-outline-danger"
                    th:onclick="'confirmDelete(\'' + ${item.id} + '\', \'' + ${item.name} + '\')'">
                删除
            </button>
            
            <!-- 启用/禁用状态切换按钮 -->
            <button type="button" class="btn btn-sm"
                    th:class="${item.enabled} ? 'btn-success' : 'btn-secondary'"
                    th:onclick="'toggleStatus(\'' + ${item.id} + '\', ' + ${item.enabled} + ')'"
                    th:text="${item.enabled} ? '已启用' : '已禁用'">
            </button>
        </td>
    </tr>
</table>

<script th:inline="javascript">
    /*<![CDATA[*/
    function confirmDelete(id, name) {
        if (confirm('确定要删除“' + name + '”吗?此操作不可恢复。')) {
            // 这里发起Ajax请求到后端删除
            fetch('/api/item/' + id, { method: 'DELETE' })
                .then(response => {
                    if (response.ok) {
                        alert('删除成功');
                        location.reload(); // 刷新页面
                    } else {
                        alert('删除失败');
                    }
                });
        }
    }
    
    function toggleStatus(id, currentStatus) {
        var newStatus = !currentStatus;
        // 发起Ajax请求更新状态
        // ...
    }
    /*]]>*/
</script>

注意th:onclick里字符串的拼接。为了生成正确的JavaScript函数调用字符串,我们需要用单引号'将字符串类型的参数(如id, name)包裹起来。对于布尔值或数字类型的参数(如item.enabled),则不需要加引号。这种拼接虽然有效,但容易出错且不美观。更推荐的做法是使用内联表达式的另一种形式,或者将逻辑移到单独的JavaScript文件中,通过data-*属性来传递参数。

5. 避坑指南与最佳实践

掌握了高级技巧,还要懂得如何避开常见的陷阱,并遵循一些最佳实践,才能写出健壮的代码。

5.1 警惕th:each与th:onclick的常见陷阱

陷阱一:在th:onclick中错误地调用后端方法。 我见过有人这样写:th:onclick="${item.deleteMethod()}"。这是完全错误的!${}表达式会在服务器端、页面渲染时就被执行。这意味着页面每次加载(包括刷新),都会调用这个deleteMethod(),而不是在用户点击按钮时才调用。th:onclick的属性值应该是一个JavaScript函数调用字符串,它只在浏览器端被点击时执行。

陷阱二:循环中生成ID的重复问题。 如果你在循环内为元素设置id,比如th:id="'item-' + ${item.id}",这本身没问题。但如果你在循环内又用JavaScript通过这个id去获取元素,就要小心了。更好的做法是使用class配合data-*属性,或者利用事件委托。

<!-- 不太好的做法:每个按钮都有一个唯一的id,JS需要循环绑定 -->
<button th:each="item : ${list}" th:id="'btn-' + ${item.id}" class="btn">删除</button>
<script>
// 需要为每个按钮单独绑定事件
</script>

<!-- 更好的做法:使用相同的class和data属性 -->
<button th:each="item : ${list}" class="btn-delete" th:data-id="${item.id}">删除</button>
<script>
// 事件委托,只需绑定一次
document.addEventListener('click', function(e) {
    if (e.target.classList.contains('btn-delete')) {
        var id = e.target.dataset.id;
        confirmDelete(id);
    }
});
</script>

5.2 保持模板简洁可维护

  1. 最小化逻辑:模板的主要职责是展示。尽可能将复杂的判断、计算、数据转换逻辑放到后端的Controller、Service或者一个专门的工具类中。传给模板的数据应该是“准备好被展示”的形态。
  2. 使用片段(Fragment)复用代码:如果某段带有复杂th:if和th:each的HTML结构在多个页面出现,不要复制粘贴。使用Thymeleaf的th:fragment和th:replace(或th:insert)来定义和引用代码片段。
  3. 注释是必要的:对于特别复杂的条件判断或嵌套循环,添加简单的Thymeleaf注释(<!--/* 这是解释 */-->)可以帮助你和其他开发者理解代码意图。

5.3 调试技巧

当th:if或th:each没有按预期工作时,别慌。首先,检查浏览器中最终生成的HTML源代码(不是Thymeleaf模板文件),看看元素是否被渲染出来,属性值是否正确。其次,可以在Controller中打印或调试传到模型(Model)里的数据,确保数据本身是正确的。有时候,问题不是出在模板语法上,而是后端传的数据不对。

Thymeleaf的条件判断和循环遍历,就像是你手中的瑞士军刀,基础功能简单,但组合起来能应对各种复杂场景。核心思想永远是:让模板专注于视图渲染,将业务逻辑后置。多练习,多思考如何将复杂的UI需求拆解成简单的th:if和th:each的组合,你会发现自己处理前端动态页面的能力越来越强。

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码 XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优 阅读详情

相关推荐

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1191

thymeleaf判断集合是否为空,循环遍历list,map集合

<div th:if="${#lists.isEmpty(list(你的集合名字))} " > 空 </div> <div th:if="${not #lists.isEmpty(list)(你的集合名字)} "> 非空 </div> <div th:each="lists,index : ${list}"> 姓名:<input type="text" th:value="${list.

一只猿Hou的博客 4286

Matlab实战:5分钟搞定脉冲多普勒雷达信号处理仿真(附完整代码)

本文详细介绍了如何使用Matlab在5分钟内完成脉冲多普勒雷达信号处理仿真,包括环境配置、线性调频信号生成、数字下变频处理、动目标检测及性能优化技巧。通过完整代码示例和实用技巧,帮助工程师快速验证算法可行性,提升雷达信号处理效率。

nokia的博客 946

thymeleaf 的th:if 用原生html+javascript实现

一开始的thymeleaf页面 <th:block th:if="${session.newBeeMallUser==null}"> <ul class="login"> <li><a href="login">登录</a><> <li><a href="register">注册</a><> </ul> <div c

weixin_45564209的博客 2017

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1789

在Ubuntu 18下安装SIMULIA Abaqus 2020

参考资料: https://github.com/imirzov/Install-Abaqus-2019-on-Ubuntu-18.04-LTS 安装环境: Ubuntu 18.4 LTS 软件版本: SIMULIA for Linux 2020 1 准备 安装光盘及破解文件 解压光盘至一目录,不能挂载,因为要修改文件内容 /home/sunwk/Downloads/abaqus2020 更改文件权限为最大 sudo chmod -R 777 abaqus2020/ * 复制libpng12

oak619的博客 1万+

spring-boot(thymeleaf)中th:field和th:value的区别

spring-boot中th:field和th:value的区别 一:常用th:标签简介: 我们再用spring-boot框架的时候,可能不会采用我们以往用的jsp页面的方式,而是通过采用thymeleaf渲染的方式进行 前后台数据的交互。常用的标签有 th:href,用法:th:href="/brand/selectbrand...

0bug0warning的博客 8万+

NuPlayer 之 Renderer

触发postDrainAudioQueue_l()或postDrainVideoQueue()开始渲染。解码器输出数据 → NuPlayer::Decoder::onMessageReceived。音频数据存入mAudioQueue,视频数据存入mVideoQueue。• 每次写入后通过mNotifyConsumed通知解码器。• 通过AudioSink::write()写入音频设备。• 根据VSync信号和音频时钟调整渲染时机。• 通过Surface直接提交给显示系统。

aningxiaoxixi的博客 316

Thymeleaf th:each 循环迭代与 th:if、th:switch 条件判断

文章目录th:each 循环迭代循环基本用法获取迭代状态条件判断th:ifth:unlessth:switch th:each 循环迭代 循环基本用法 1、对于信息页面,数据格式是一样时,页面通常都是循环迭代它们,写过 JSP 的 JSTL 的就知道,JSTL 有一个 <c:foreach>,同理 Thymeleaf 也有一个 th:each。作用都是一样的,都是用于遍历数组、List...

const_ 5440

AI在保险产品定价优化中的创新应用

在当今保险市场中,准确合理的产品定价是保险公司实现可持续发展的关键因素之一。传统的保险产品定价主要基于经验数据和精算模型,但这种方式往往存在数据处理效率低、对复杂风险因素考虑不足等问题。本文的目的在于深入探讨AI技术如何在保险产品定价中进行创新应用,以提高定价的准确性、效率和灵活性,更好地满足市场需求和客户个性化需求。本文的范围涵盖了AI技术在保险产品定价各个环节的应用,包括风险评估、费率计算、产品设计等方面。同时,还会涉及到相关的核心算法、数学模型以及实际应用案例等内容。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 983

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

Thymeleaf中"th:each""th:if"的用法解析

"th:each"用于迭代遍历 <table> <thead> <tr> <th>序号</th> <th>用户名</th> <th>密码</th> ...

flying_hengfei的博客 5718

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 在线蒸馏 (附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv11的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了,本文内容为在线蒸馏教程,之前的文章为离线蒸馏!

Snu77的博客 2667

4)Thymeleaf th:each 循环迭代与 th:if、th:switch 条件判断

目录 th:each 循环迭代 循环基本用法 获取迭代状态 条件判断 th:if th:unless th:switch th:each 循环迭代 循环基本用法 1、对于信息页面,数据格式是一样时,页面通常都是循环迭代它们,写过 JSP 的 JSTL 的就知道,JSTL 有一个<c:foreach>,同理 Thymeleaf 也有一个 th:each。作用都是一...

蚩尤后裔-汪茂雄 10万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Thymeleaf th:each遍历,th:if、th:switch 条件判断,input,select,radio 回显赋值

1. th:each 遍历 <!-- 遍历集合,如果被遍历的变量 userList 为 null 或者不存在,则不会进行遍历,也不报错--> <tr th:each="user : ${userList}"> <!-- 将用户的主键 uId 存在在 name 属性中--> <td th:text="${user.u...

上班搞IT,下班搞ITF。 4907

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Thymeleaf条件渲染与循环:掌握th:if、th:unless和th:each的高级用法

Thymeleaf是一款现代的服务器端Java模板引擎,广泛应用于Web开发中。本文将详细介绍Thymeleaf中条件渲染(th:if、th:unless)和循环(th:each)的高级用法,帮助开发者轻松实现动态页面效果。 ## 一、条件渲染:th:if与th:unless的终极指南 条件渲染是Web开发中常用的功能,Thymeleaf提供了th:if和th:unless两个属性来实现这一需

gitblog_00982的博客 439

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java th标签_Thymeleaf中th:each及th:if使用方法解析

一、th:each作用:用于遍历controller层发送过来的集合。例:Controller代码:@Controllerpublic class HelloController {@RequestMapping("/success")public String success(Map map){map.put("users", Arrays.asList("张三","李四","王五"));ret...

weixin_42115513的博客 2579

Thymeleaf 常用的 th 属性

html有的属性,Thymeleaf基本都有,而常用的属性大概有七八个。其中th属性执行的优先级从1~8,数字越低优先级越高。th:text , th:value , th:each , th:if , th:insert , th:fragment , th:object , th:attr

qq_71695227的博客 2632

Thymeleaf 条件判断、迭代遍历

条件判断 th:if 进行判断处理 举个例子: <p th:if="${user.getAge()} == '男'"> 性别:男 </p> 这里使用的是 ModelAndView 传递的 user 对象 th:switch 配合 th:case 用来分流处理 举个例子: <div th:switch="${user.getAge()}"> &...

cheng_cuo_tuo的博客 1073

java th标签,Thymeleaf中th:each及th:if使用方法解析

一、th:each作用:用于遍历controller层发送过来的集合。例:Controller代码:?下面我们通过th:each属性在html页面将其遍历显示出来?讲解:th:each="user:${users}"其中${users}是将取出名为users的List集合,每次遍历取出List集合中的一个元素赋值给user注意:th:each每次遍历都会生成一个包含它的标签,如我们举的这个例子,u...

weixin_39744894的博客 1349

thymeleaf中th:field和th:value的区别

th:text 进行文本替换 不会解析html th:utext 进行文本替换 会解析html th:href,用法:th:href="/brand/service",(用来指明要要跳转的链接) th:object,用法:th:object="${brand}",(用来接受后台传过来的对象) th:field,用法:th:field="*{name}",(用来绑定后台对象和表单数据) th:value,用法:th:value="${brand.name}",(用对象对name值替换value属性) th:.

wh1236666的博客 1万+

Thymeleaf (三) ---------Thymeleaf 属性

目录一、th:action 属性二、th:method 属性三、th:href 属性四、th:src 属性五、th:text 属性六、th:style 属性七、th:each 属性1、循环列表2、遍历数组 Array 大部分属性和 html 的一样,只不过前面加了一个 th 前缀。 加了 th 前缀的属性,是经过模版引擎处理的 一、th:action 属性 定义后台控制器的路径,类似标签的 action 属性,主要结合 URL 表达式,获取动态变量 <form id="login" th:actio

在森林里麋了鹿 6742

(项目实战干货)Spring boot 中Thymeleaf 模板 html 标签使用

Spring boot 中Thymeleaf 模板 html 标签使用 ​ 在Spring boot 项目开发中,会常常使用到Thymeleaf模板。在对Thymeleaf模板标签的使用技巧,有的人不是很熟悉。这篇文章专门介绍一下模板标签的使用技巧。静态原型中(html页面)Thymeleaf元素与html元素相结合使用的说明与代码例子。文中会提高大量Thymeleaf标签的属性介绍和使用的逻辑示例代码。 1 文字内联标签引入 ​ Thymeleaf模板中的使用文字内联标签,需要在使用的html元素上加上

zhtbs的博客 2万+

Thymeleaf实战:5个高频属性(th:if/th:each/th:href/th:onclick/th:src)避坑指南

本文深入解析Thymeleaf模板引擎中5个高频属性(th:if/th:each/th:href/th:onclick/th:src)的使用技巧与避坑指南。通过实际案例展示条件渲染、循环控制、链接构建、事件绑定和资源引用的最佳实践,帮助Java开发者提升Web开发效率,避免常见错误。

r7s8t的博客 192

thymeleaf th:表达式总结

gt:great than(大于)> ge:great equal(大于等于)>= eq:equal(等于)== lt:less than(小于)< le:less equal(小于等于)<= ne:not equal(不等于)!= eg:例子应用 <span th:if="${each ne null}"> <span>显示 </span> <span th:i...

wqr111的博客 2173

THYMELEAF常用属性

THYMELEAF常用属性 th:action 定义后台控制器路径,类似标签的action属性。 例如: < form id=“login-form” th:action="@{/login}">…< /form> th:each 对象遍历,功能类似jstl中的<c:forEach>标签。 例如: public class StudentRequestBean ...

qq_43096062的博客 957
上一篇: 用Wireshark抓包实战解析HTTP/TCP协议:从三次握手到拥塞控制
下一篇: CDC跨时钟域信号处理:单bit快时钟域到慢时钟域的高效同步策略
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值