news 2026/4/28 15:47:25

Spring Boot 模板引擎全家桶:项目实战与多引擎共存方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 模板引擎全家桶:项目实战与多引擎共存方案

目录

  1. Enjoy 模板引擎集成
  2. Freemarker 模板引擎集成
  3. Thymeleaf 模板引擎集成
  4. Beetl 模板引擎集成
  5. 多模板引擎共存配置
  6. 模板文件示例

1. Spring Boot 集成 Enjoy 模板引擎

添加依赖

<dependency> <groupId>com.jfinal</groupId> <artifactId>enjoy</artifactId> <version>5.1.5</version> </dependency>

配置类

@Configuration public class EnjoyConfig { @Bean public EnjoyTemplateEngine enjoyTemplateEngine() { EnjoyTemplateEngine engine = new EnjoyTemplateEngine(); engine.setDevMode(true); engine.setBaseTemplatePath("templates/"); engine.addSharedFunction("/common/_layout.html"); engine.addSharedMethod(new MyEnjoyExt()); return engine; } @Bean public ViewResolver enjoyViewResolver() { EnjoyViewResolver resolver = new EnjoyViewResolver(); resolver.setSuffix(".html"); resolver.setContentType("text/html;charset=UTF-8"); resolver.setOrder(0); resolver.setEngine(enjoyTemplateEngine()); return resolver; } } // Enjoy 扩展方法 public class MyEnjoyExt { public String formatDate(Date date) { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); } }

控制器示例

@Controller public class UserController { @GetMapping("/user") public String user(Model model) { model.addAttribute("userName", "张三"); model.addAttribute("createTime", new Date()); return "user"; // 对应 templates/user.html } }

2. Spring Boot 集成 Freemarker 模板引擎

添加依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>

配置文件 (application.yml)

spring: freemarker: suffix: .ftl charset: UTF-8 content-type: text/html cache: false template-loader-path: classpath:/templates/ settings: datetime_format: yyyy-MM-dd HH:mm:ss number_format: 0.## classic_compatible: true

控制器示例

@Controller public class ProductController { @GetMapping("/products") public String products(Model model) { List<Product> products = Arrays.asList( new Product("手机", 2999.00), new Product("电脑", 5999.00) ); model.addAttribute("products", products); return "product/list"; // 对应 templates/product/list.ftl } }

3. Spring Boot 集成 Thymeleaf 模板引擎

添加依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> </dependency>

配置文件 (application.yml)

spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML encoding: UTF-8 servlet: content-type: text/html cache: false check-template-location: true

配置类

@Configuration public class ThymeleafConfig { @Bean public ITemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setPrefix("classpath:/templates/"); resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); resolver.setCacheable(false); return resolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); engine.setEnableSpringELCompiler(true); Set<IDialect> dialects = new HashSet<>(); dialects.add(new SpringSecurityDialect()); dialects.add(new Java8TimeDialect()); engine.setAdditionalDialects(dialects); return engine; } }

控制器示例

@Controller public class ArticleController { @GetMapping("/articles") public String articles(Model model) { List<Article> articles = Arrays.asList( new Article("Spring Boot教程", "内容..."), new Article("Thymeleaf指南", "内容...") ); model.addAttribute("articles", articles); model.addAttribute("currentTime", LocalDateTime.now()); return "article/index"; } }

4. Spring Boot 集成 Beetl 模板引擎

添加依赖

<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.15.10.RELEASE</version> </dependency>

配置类

@Configuration public class BeetlConfig { @Bean public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() { BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration(); try { String root = "templates/"; ClasspathResourceLoader classpathResourceLoader = new ClasspathResourceLoader( BeetlConfig.class.getClassLoader(), root); beetlGroupUtilConfiguration.setResourceLoader(classpathResourceLoader); Properties properties = new Properties(); properties.setProperty("DELIMITER_STATEMENT_START", "@"); properties.setProperty("DELIMITER_STATEMENT_END", null); properties.setProperty("RESOURCE.autoCheck", "true"); beetlGroupUtilConfiguration.setConfigProperties(properties); return beetlGroupUtilConfiguration; } catch (Exception e) { throw new RuntimeException(e); } } @Bean public BeetlSpringViewResolver getBeetlSpringViewResolver() { BeetlSpringViewResolver resolver = new BeetlSpringViewResolver(); resolver.setConfig(getBeetlGroupUtilConfiguration()); resolver.setContentType("text/html;charset=UTF-8"); resolver.setSuffix(".btl"); resolver.setOrder(0); return resolver; } }

自定义函数

public class BeetlFunctions { public String formatPrice(Object price) { if (price == null) return "0.00"; return String.format("¥%.2f", Double.parseDouble(price.toString())); } public String substring(String str, int length) { if (str == null || str.length() <= length) { return str; } return str.substring(0, length) + "..."; } }

注册自定义函数

@Configuration public class BeetlExtConfig { @Autowired private BeetlGroupUtilConfiguration beetlConfig; @PostConstruct public void config() { GroupTemplate groupTemplate = beetlConfig.getGroupTemplate(); groupTemplate.registerFunction("formatPrice", new BeetlFunctions()); groupTemplate.registerFunction("substring", new BeetlFunctions()); } }

控制器示例

@Controller public class OrderController { @GetMapping("/orders") public String orders(Model model) { List<Order> orders = Arrays.asList( new Order("ORDER001", 199.99, new Date()), new Order("ORDER002", 299.99, new Date()) ); model.addAttribute("orders", orders); model.addAttribute("totalAmount", 499.98); return "order/list"; } }

5. 多模板引擎共存配置

@Configuration public class MultiTemplateConfig { @Bean @Order(1) public ThymeleafViewResolver thymeleafViewResolver() { ... } @Bean @Order(2) public FreeMarkerViewResolver freeMarkerViewResolver() { ... } @Bean @Order(3) public BeetlSpringViewResolver beetlSpringViewResolver() { ... } }

通过设置@Order值,可以控制不同模板引擎的视图解析优先级。


6. 模板文件示例

Enjoy 模板 (user.html)

<h1>用户信息</h1> <p>用户名:#{userName}</p> <p>创建时间:#(formatDate(createTime))</p>

Freemarker 模板 (product/list.ftl)

<h1>商品列表</h1> <table> <#list products as product> <tr> <td>${product.name}</td> <td>${product.price?string("0.00")}</td> </tr> </#list> </table>

Thymeleaf 模板 (article/index.html)

<h1>文章列表</h1> <div th:each="article : ${articles}"> <h3 th:text="${article.title}">标题</h3> <p th:text="${article.content}">内容</p> </div> <p>当前时间:<span th:text="${#temporals.format(currentTime, 'yyyy-MM-dd HH:mm')}"></span></p>

Beetl 模板 (order/list.btl)

<h1>订单列表</h1> <table> <% for(order in orders){ %> <tr> <td>${order.orderNo}</td> <td>${formatPrice(order.amount)}</td> <td>${order.createTime, dateFormat="yyyy-MM-dd"}</td> </tr> <% } %> </table> <p>总金额:${formatPrice(totalAmount)}</p>

✅ 以上就是 Spring Boot 集成四大主流模板引擎的完整配置和示例,开发者可以根据项目需求自由选择或共存使用。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 13:06:07

起止时间戳精确到毫秒:满足影视剪辑对齐需求

起止时间戳精确到毫秒&#xff1a;满足影视剪辑对齐需求 在一部纪录片的后期制作中&#xff0c;剪辑师正试图从两小时的访谈录音里找出受访者提到“城市更新”的所有片段。传统做法是反复拖动播放头、逐段试听、手动记下时间点——一个简单的关键词检索可能就要耗费数小时。如…

作者头像 李华
网站建设 2026/4/23 10:08:28

对接剪映、Premiere等视频软件的插件规划

对接剪映、Premiere等视频软件的插件规划 在短视频创作井喷的今天&#xff0c;内容生产效率已成为创作者最敏感的神经。一个5分钟的口播视频&#xff0c;可能需要30分钟来手动打字幕&#xff1b;一场两小时的访谈录制&#xff0c;往往要耗费半天时间做语音转写——这种“音画分…

作者头像 李华
网站建设 2026/4/23 4:36:25

pjsip底层内存管理策略:项目应用中的优化实践

pjsip内存池实战&#xff1a;如何让SIP系统在高并发下“零抖动”运行&#xff1f;你有没有遇到过这样的场景&#xff1f;一个基于pjsip的语音网关&#xff0c;在低负载时响应飞快&#xff0c;但一旦并发呼叫数突破50路&#xff0c;信令延迟突然飙升到几十毫秒&#xff0c;甚至隔…

作者头像 李华
网站建设 2026/4/28 9:55:39

DataGridView和定时器

一、DataGridView首先将控件添加到窗体&#xff0c;代码写一个对象用来生成表格public class Student {public string Name { get; set; }public int Age { get; set; }public string Info { get; set; }}public List<Student> list new List<Student>();list.A…

作者头像 李华
网站建设 2026/4/20 16:38:19

大模型智能体技术路线对比:从规划检索到洞察式规划的未来之路

文章评估了AI大模型智能体的技术路线&#xff0c;提出三种实现路径&#xff1a;基于上下文工程的智能体、规划检索整合的通用智能体&#xff0c;以及未来可能的洞察式规划垂直智能体。作者认为当前智能体尚未充分发掘大模型潜力&#xff0c;并以教育领域为例分析现有技术路线的…

作者头像 李华
网站建设 2026/4/19 23:36:00

Langchain4j-文档处理和 RAG 流程分析

文档处理和 RAG 流程分析 请关注公众号【碳硅化合物AI】 目录 概述文档加载流程文档解析和分割嵌入生成和存储RAG 检索增强流程关键类关系实现关键点说明总结 概述 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是 LangChain4j 的核心功能。基本思路&#x…

作者头像 李华