别再只用JSP了!SpringBoot3整合Thymeleaf,5分钟搞定一个动态用户列表页

别再只用JSP了!SpringBoot3整合Thymeleaf,5分钟搞定一个动态用户列表页 SpringBoot3与Thymeleaf构建现代化用户界面的艺术在Java Web开发领域模板引擎的选择往往决定了开发效率和最终用户体验。传统JSP虽然广为人知但其繁琐的标签库和与Java代码的高度耦合已逐渐无法满足现代Web开发的需求。SpringBoot3与Thymeleaf的组合为开发者提供了一种更优雅、更符合现代Web标准的解决方案。1. 为什么选择ThymeleafThymeleaf作为自然模板引擎的代表其核心理念是自然模板——HTML文件可以直接在浏览器中打开预览无需启动服务端。这种特性为前后端协作开发带来了革命性的改变设计友好设计师可以直接编辑HTML文件无需了解后端语法开发高效支持热加载修改后立即生效无需重启服务功能强大完整的表达式语言支持条件判断、循环、模板布局等标准兼容严格遵循HTML5标准不会破坏文档结构与JSP相比Thymeleaf避免了以下典型问题对比维度JSPThymeleaf预览方式必须部署才能查看可直接浏览器打开标签语法自定义标签库复杂标准HTML属性扩展错误提示编译期才能发现编辑时即可提示性能表现首次访问慢模板缓存优化提示Thymeleaf 3.x版本对性能进行了大幅优化模板解析速度比2.x提升近40%2. 快速搭建开发环境让我们从零开始构建一个SpringBoot3项目并集成Thymeleaf。首先使用Spring Initializr创建项目时需要选择以下依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency /dependencies关键配置项application.ymlspring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML cache: false # 开发环境关闭缓存 encoding: UTF-8项目结构建议src/ ├── main/ │ ├── java/ │ │ └── com/example/demo/ │ │ ├── controller/ │ │ ├── model/ │ │ └── DemoApplication.java │ └── resources/ │ ├── static/ │ ├── templates/ │ └── application.yml3. 实现动态用户列表让我们通过一个完整的用户列表案例展示Thymeleaf的核心功能。首先创建用户实体和控制器// User.java public class User { private Long id; private String name; private String email; private boolean active; // 省略getter/setter } // UserController.java Controller public class UserController { GetMapping(/users) public String listUsers(Model model) { ListUser users Arrays.asList( new User(1L, 张三, zhangsanexample.com, true), new User(2L, 李四, lisiexample.com, false), new User(3L, 王五, wangwuexample.com, true) ); model.addAttribute(users, users); model.addAttribute(currentTime, LocalDateTime.now()); return user/list; } }创建模板文件templates/user/list.html!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 title用户列表/title link th:href{/css/style.css} relstylesheet /head body h1用户管理 small th:text${#dates.format(currentTime, yyyy-MM-dd HH:mm)}/small/h1 div classalert alert-info th:if${#lists.isEmpty(users)} 暂无用户数据 /div table classtable th:unless${#lists.isEmpty(users)} thead tr thID/th th姓名/th th邮箱/th th状态/th th操作/th /tr /thead tbody tr th:eachuser, stat : ${users} th:class${user.active} ? active : inactive td th:text${user.id}1/td td th:text${user.name}示例用户/td td th:text${user.email}userexample.com/td td span classbadge th:class${user.active} ? badge-success : badge-danger th:text${user.active} ? 活跃 : 禁用 状态 /span /td td a th:href{/users/{id}/edit(id${user.id})} classbtn btn-sm btn-primary编辑/a /td /tr /tbody /table div th:replace~{fragments/pagination :: pagination}/div /body /html4. 高级功能实战4.1 模板布局与片段复用创建公共片段templates/fragments/header.html!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head th:fragmentcommon_header(title) meta charsetUTF-8 title th:text${title}默认标题/title link th:href{/css/bootstrap.min.css} relstylesheet script th:src{/js/jquery-3.6.0.min.js}/script /head在页面中使用head th:replace~{fragments/header :: common_header(用户列表)} !-- 这里的内容会被替换 -- /head4.2 表单处理与验证用户编辑表单示例form th:action{/users/save} th:object${user} methodpost input typehidden th:field*{id}/ div classform-group label用户名/label input typetext th:field*{name} classform-control th:classappend${#fields.hasErrors(name)} ? is-invalid/ div classinvalid-feedback th:if${#fields.hasErrors(name)} th:errors*{name}用户名错误提示/div /div div classform-group label邮箱/label input typeemail th:field*{email} classform-control/ /div button typesubmit classbtn btn-primary保存/button /form对应的控制器方法PostMapping(/users/save) public String saveUser(Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { return user/form; } // 保存逻辑 return redirect:/users; }4.3 国际化支持配置国际化资源文件# messages.properties user.list.title用户列表 user.name姓名 user.email邮箱 user.status状态 # messages_en_US.properties user.list.titleUser List user.nameName user.emailEmail user.statusStatus在模板中使用h1 th:text#{user.list.title}用户列表/h1 ... th th:text#{user.name}姓名/th th th:text#{user.email}邮箱/th th th:text#{user.status}状态/th4.4 与JavaScript集成Thymeleaf可以无缝与JavaScript交互script th:inlinejavascript /*![CDATA[*/ var users /*[[${users}]]*/ []; var currentUser /*[[${#authentication.principal}]]*/ null; function showUserDetail(id) { var user users.find(u u.id id); alert(用户: user.name \n邮箱: user.email); } /*]]*/ /script5. 性能优化建议缓存配置spring: thymeleaf: cache: true # 生产环境开启模板优化避免过度复杂的表达式使用th:with缓存频繁访问的变量合理使用片段(th:fragment)减少重复代码静态资源处理link th:href{/css/app-${environment.getProperty(app.version)}.css} relstylesheet开发工具使用Spring Boot DevTools实现热加载配置IDE的Thymeleaf插件获得代码提示在大型项目中我们还可以通过自定义方言扩展Thymeleaf功能public class MyDialect extends AbstractProcessorDialect { public MyDialect() { super(My Dialect, my, 1000); } Override public SetIProcessor getProcessors(String dialectPrefix) { return Set.of(new MyTagProcessor(dialectPrefix)); } } // 注册方言 Bean public MyDialect myDialect() { return new MyDialect(); }从实际项目经验来看合理使用Thymeleaf可以使前端开发效率提升30%以上特别是在需要频繁调整界面样式的场景下其自然模板特性显得尤为宝贵。