当前位置: 首页 > news >正文

10、《Thymeleaf模板引擎:动态页面开发全攻略》

Thymeleaf模板引擎:动态页面开发全攻略

一、Thymeleaf核心价值解析

天然HTML亲和力:Thymeleaf允许直接使用.html文件作为模板,支持浏览器直接预览静态原型,同时通过属性标签(如th:text)实现动态渲染,完美实现「动静结合」开发模式。

Spring生态深度整合:与Spring Boot无缝对接,自动配置模板解析器、消息源等组件,通过spring-boot-starter-thymeleaf依赖快速集成。

核心优势对比

  • 相比JSP:无需编译成Servlet,支持热更新
  • 相比Freemarker:更简洁的表达式语法,更强的布局管理能力

二、Spring Boot整合实战

1. 基础环境搭建

<!-- pom.xml 关键依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
// 配置示例(application.yml)
spring:
  thymeleaf:
    cache: false # 开发关闭缓存
    prefix: classpath:/templates/
    suffix: .html
    encoding: UTF-8
    mode: HTML

2. 基础数据渲染

// Controller示例
@Controller
public class UserController {
    
    @GetMapping("/users")
    public String userList(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        model.addAttribute("currentTime", LocalDateTime.now());
        return "user/list";
    }
}
<!-- templates/user/list.html -->
<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>用户名</th>
      <th>注册时间</th>
    </tr>
  </thead>
  <tbody>
    <!-- 循环渲染 -->
    <tr th:each="user : ${users}">
      <td th:text="${user.id}">1</td>
      <td th:text="${user.username}">示例用户</td>
      <!-- 日期格式化 -->
      <td th:text="${#dates.format(user.createTime, 'yyyy-MM-dd HH:mm')}"></td>
    </tr>
  </tbody>
</table>

三、高级模板布局方案

1. 片段化布局(Fragment)

<!-- 定义公共头部 -->
<header th:fragment="commonHeader">
  <nav>
    <a th:href="@{/}">首页</a>
    <a th:href="@{/users}">用户管理</a>
  </nav>
</header>

<!-- 页面引用 -->
<div th:replace="~{fragments/header :: commonHeader}"></div>

2. 参数化布局继承

<!-- layout/base.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${pageTitle}">默认标题</title>
    <th:block th:replace="~{fragments/css :: core}"></th:block>
</head>
<body>
    <div th:replace="~{fragments/header}"></div>
    
    <!-- 内容占位区 -->
    <div th:insert="${content}"></div>
    
    <div th:replace="~{fragments/footer}"></div>
</body>
</html>
<!-- 子页面继承 -->
<html th:replace="~{layout/base :: layout(
    pageTitle='用户列表',
    content=~{:: #mainContent}
)}">
<body>
    <div id="mainContent">
        <!-- 页面具体内容 -->
        <table>...</table>
    </div>
</body>
</html>

四、国际化(i18n)深度实践

1. 多语言资源配置

# messages.properties
welcome.message=Welcome!
user.list.title=User Management

# messages_zh_CN.properties
welcome.message=欢迎!
user.list.title=用户管理系统

2. 动态语言切换

// 语言切换控制器
@Controller
public class LocaleController {

    @GetMapping("/changeLang")
    public String changeLocale(@RequestParam String lang, 
                              HttpServletRequest request) {
        LocaleResolver localeResolver = RequestContextUtils
            .getLocaleResolver(request);
        localeResolver.setLocale(request, response, new Locale(lang));
        return "redirect:" + request.getHeader("Referer");
    }
}
<!-- 语言切换器 -->
<div class="lang-switcher">
    <a th:href="@{/changeLang(lang='en')}">English</a>
    <a th:href="@{/changeLang(lang='zh_CN')}">中文</a>
</div>

<!-- 国际化文本使用 -->
<h1 th:text="#{user.list.title}"></h1>
<p th:text="#{welcome.message(${#authentication.name})}"></p>

五、企业级开发技巧

1. 工具类方法扩展

// 自定义工具类
public class ThymeleafUtils {

    public static String maskPhone(String phone) {
        return phone.substring(0,3) + "****" + phone.substring(7);
    }
}

// 模板中调用
<td th:text="${@thymeleafUtils.maskPhone(user.phone)}"></td>

2. 安全防护实践

<!-- 自动HTML转义 -->
<div th:text="${userInput}"></div>

<!-- 禁用转义(慎用) -->
<div th:utext="${trustedHtml}"></div>

<!-- 防御XSS最佳实践 -->
<script th:inline="javascript">
    var userId = [[${user.id}]];
    var userName = /*[[${#strings.escapeJavaScript(user.name)}]]*/ "";
</script>

结语

Thymeleaf通过优雅的HTML原生模板设计,配合强大的Spring生态整合能力,已成为现代Java Web开发的优选方案。本文从基础整合到企业级应用场景,覆盖了服务端渲染、布局管理和国际化等核心功能。建议开发者在实际项目中注意:

  1. 模板目录结构的规范化管理
  2. 复杂业务逻辑应避免在模板中实现
  3. 结合Spring Security进行细粒度权限控制
  4. 使用Fragment缓存提升性能

相关文章:

  • 如何有效防止TikTok多店铺入驻时IP关联问题?
  • [鸿蒙笔记-基础篇_自定义构建函数及自定义公共样式]
  • 网络安全技术复习总结
  • 【Python深入浅出㊷】探索Python3中scikit-learn的无限可能
  • QtWebEngine::initialize()
  • MySQL查看存储过程和存储函数
  • 2025 AutoCable 中国汽车线束线缆及连接技术创新峰会启动报名!
  • vscode本地和远程对应分支没有同步提交数量
  • 从零开始认识大语言模型(LLM)
  • 尚航科技助力DeepSeek正式登陆无锡
  • 探秘Hugging Face与DeepSeek:AI开源世界的闪耀双子星
  • EtherCAT技术介绍
  • 深度学习中的知识蒸馏
  • 曼哈顿距离:菱形打印与路径规划
  • mysql读写分离与proxysql的结合
  • springboot中通过@Autowired依赖注入关联@RestControl@Service @Mapper @Data@TableName实现接口服务
  • React - 组件之props属性
  • 《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》
  • vue中使用lodash的debounce(防抖函数)
  • spring boot和spring cloud的关系
  • 贵州省总工会党组成员、副主席梁伟接受审查调查
  • 白宫启动“返乡计划” ,鼓励非法移民自愿离开美国
  • 云南一餐馆收购长江野生鱼加工为菜品,被查处罚款
  • 铲屎官花5万带猫狗旅行,宠旅生意有多赚?
  • OpenAI任命了一位新CEO
  • 川大全职引进考古学家宫本一夫,他曾任日本九州大学副校长