FreeMarker模板引擎避坑指南:从基础配置到高级用法全解析

SpringBoot系列:Spring Boot使用模板引擎FreeMarker 可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源。 阅读详情

FreeMarker实战避坑手册:从配置陷阱到高阶技巧的深度解析

如果你在Java项目中用过FreeMarker,大概率经历过这样的场景:明明模板文件就在那里,却报找不到;生成的HTML页面乱码,调试半天才发现是编码问题;或者想实现一个稍微复杂点的逻辑,却发现模板语法用起来处处掣肘。这些问题看似琐碎,却实实在在地消耗着开发效率。

FreeMarker作为一款老牌且强大的模板引擎,其设计哲学是“将表现逻辑与业务逻辑分离”。这个理念很美好,但在实际落地时,尤其是与现代框架如Spring Boot深度集成时,各种默认配置、路径约定和语法细节,往往成为新手甚至有一定经验的开发者踩坑的重灾区。本文不打算重复官方文档的基础语法,而是聚焦于那些文档里可能一笔带过,但实践中却频繁引发问题的“坑点”,并结合Spring Boot环境,提供一套经过验证的最佳实践方案。无论你是正在将JSP项目迁移到FreeMarker,还是在构建全新的微服务,这些经验都能帮你少走弯路。

1. 环境配置与路径解析:避开第一个“拦路虎”

很多开发者拿到FreeMarker,第一步就卡在了配置上。不同于直接在JSP里写Java代码,FreeMarker需要一个明确的配置对象(Configuration)来管理模板加载、缓存、编码等全局设置。在纯Java SE环境中,你需要手动实例化并配置它;而在Spring Boot中,虽然提供了自动化配置,但理解其背后的机制至关重要。

1.1 Spring Boot自动配置的“潜规则”

Spring Boot为FreeMarker提供了spring-boot-starter-freemarker起步依赖,这极大地简化了集成。但自动配置意味着它有一套默认约定,如果你不了解,就会感到困惑。

首先,Spring Boot会自动配置一个FreeMarkerConfigurer Bean和FreeMarkerConfigurationFactory。默认的模板加载路径是classpath:/templates/。这意味着,只要你把.ftl或.ftlh文件放在src/main/resources/templates/目录下,通常就能被找到。

然而,问题常常出现在你想自定义模板路径时。比如,你的项目结构可能将模板按模块划分:

src/main/resources/
├── templates/
│   ├── admin/
│   └── web/

如果你直接在Controller中返回"admin/userList.ftl",Spring MVC的视图解析器(FreeMarkerViewResolver)会尝试在classpath:/templates/下寻找admin/userList.ftl,这通常能正常工作。但如果你通过Configuration对象直接获取模板,路径处理方式可能不同。

关键点:在Spring Boot中,修改默认模板路径,推荐通过配置文件进行,而非硬编码。在application.yml中:

spring:
  freemarker:
    # 设置模板加载路径,多个路径用逗号分隔
    template-loader-path: classpath:/templates/, file:/opt/custom-templates/
    # 建议启用此设置,避免缓存导致开发时修改不生效
    cache: false
    charset: UTF-8
    suffix: .ftl

注意:template-loader-path支持多个路径,FreeMarker会按顺序查找。将cache设置为false在开发阶段非常有用,可以即时看到模板修改效果。但在生产环境,务必将其设为true以提升性能。

1.2 字符编码问题的“三重奏”

乱码问题是Web开发中的常客,FreeMarker场景下,它可能出现在三个环节,任何一个环节出错都会导致最终输出乱码:

  1. 模板文件本身的编码:.ftl文件必须以UTF-8(无BOM)格式保存。这是源头,用IDE(如IntelliJ IDEA或VS Code)可以轻松设置文件编码。
  2. FreeMarker配置的默认编码:即configuration.setDefaultEncoding("UTF-8")。Spring Boot默认就是UTF-8,但如果你手动配置Configuration,务必显式设置。
  3. 输出流(Response)的编码:在Web环境中,这通常由Spring MVC的视图解析器和Servlet容器的过滤器(如CharacterEncodingFilter)共同决定。

一个常见的坑是,即使你前三步都做对了,生成的HTML页面在浏览器中显示还是乱码。这可能是因为模板中缺失了HTML的<meta charset>声明。虽然响应头Content-Type: text/html;charset=UTF-8已指定编码,但某些浏览器在解析初始片段时仍可能依赖HTML内的元标签。因此,一个健壮的模板开头应该是:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>${pageTitle!''}</title>
</head>

1.3 模板加载策略:Classpath vs. 文件系统

Configuration对象提供了多种模板加载器(TemplateLoader):

  • ClassTemplateLoader: 从类路径加载。
  • FileTemplateLoader: 从文件系统加载。
  • WebappTemplateLoader: 从Servlet上下文(如/WEB-INF/)加载。
  • StringTemplateLoader: 直接从字符串加载模板内容(适用于动态模板)。

在Spring Boot的Web应用中,最常用的是基于类路径的加载,因为它与打包成JAR的部署方式兼容。但是,如果你需要支持模板热更新(无需重启应用),使用FileTemplateLoader指向一个外部目录会是更好的选择。这时,你需要自定义FreeMarkerConfigurer:

@Configuration
public class CustomFreeMarkerConfig {

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
        
        // 使用文件系统加载器,并允许从多个目录加载
        FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/opt/templates/primary"));
        FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/opt/templates/fallback"));
        MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[]{ftl1, ftl2});
        configuration.setTemplateLoader(mtl);
        
        configuration.setDefaultEncoding("UTF-8");
        configurer.setConfiguration(configuration);
        // 覆盖Spring Boot的默认路径设置
        configurer.setTemplateLoaderPaths("file:/opt/templates/");
        return configurer;
    }
}

这个配置展示了如何使用MultiTemplateLoader组合多个加载器,并优先从文件系统加载,实现了灵活的模板管理策略。

2. 数据模型绑定与作用域:让数据流动更清晰

将数据从Java后端传递到FreeMarker模板,通常通过一个Map或ModelAndView对象。这个过程看似简单,但如何组织数据、处理空值、在不同模板间共享数据,却有很多技巧。

2.1 模型结构的优化策略

避免向模板传递一个庞大、扁平化的Map。一个好的实践是根据视图的语义来组织数据模型。例如,一个用户详情页可能需要用户信息、订单列表、消息通知等。你可以这样组织:

// 不推荐:扁平化,难以维护
model.addAttribute("userName", user.getName());
model.addAttribute("userAge", user.getAge());
model.addAttribute("orderList", orders);
model.addAttribute("unreadMsgCount", count);

// 推荐:按语义分组,模板中访问更清晰
Map<String, Object> data = new HashMap<>();
data.put("user", user); // user对象,包含name, age等属性
data.put("orders", new HashMap<String, Object>() {{
    put("list", orders);
    put("total", orders.size());
}});
data.put("notification", Map.of("unreadCount", count));

在模板中,访问方式就变成了${user.name}、${orders.list}、${notification.unreadCount},结构清晰,易于理解。

2.2 空值处理:防御性模板编程

FreeMarker对空值(null)非常敏感,直接访问可能抛出异常。这是最常见的运行时错误之一。FreeMarker提供了多种操作符来处理空值:

  • 默认值操作符 (!): ${user.bio!} 或 ${user.bio!"暂无简介"}。这是最常用的方式。
  • 空值判断 (??): <#if user.bio??>${user.bio}</#if>。用于条件判断。
  • 缺失值判断 (! 和 ?? 的区别):!处理的是null或缺失的变量;而??只判断变量是否为null,如果变量在数据模型中根本不存在,??会报错。因此,更安全的写法是结合使用:<#if (user.bio!)?has_content>。?has_content会检查值是否为null、空字符串、空序列或空集合。

一个进阶技巧是,在全局配置中设置更宽松的空值处理策略(生产环境慎用):

configuration.setClassicCompatible(true); // 启用“经典兼容模式”

此模式下,FreeMarker对缺失变量的行为更像JSP,不会抛出异常,而是输出空字符串。但这可能掩盖潜在的数据问题,不利于调试,通常不建议开启。

2.3 共享宏、函数与工具类

在多个模板中,你可能会重复一些显示逻辑,比如格式化日期、金额,或者生成一个分页组件。FreeMarker提供了**宏(Macro)和函数(Function)**来实现复用。

宏类似于一个可复用的模板片段:

<#-- 定义在单独的 /common/macros.ftl 文件中 -->
<#macro pagination page currentUrl>
    <div class="pagination">
        <#if page.hasPrevious>
            <a href="${currentUrl}?page=${page.number-1}">上一页</a>
        </#if>
        <span>第 ${page.number+1} 页 / 共 ${page.totalPages} 页</span>
        <#if page.hasNext>
            <a href="${currentUrl}?page=${page.number+1}">下一页</a>
        </#if>
    </div>
</#macro>

在业务模板中引入并使用:

<#import "/common/macros.ftl" as com>
<@com.pagination page=pageData currentUrl="/user/list" />

函数则用于处理数据,返回一个值。你可以将常用的Java工具类暴露给模板。在Spring中,可以通过FreeMarkerConfigurer的setFreemarkerVariables方法注入:

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
    // ... 其他配置
    Map<String, Object> sharedVariables = new HashMap<>();
    sharedVariables.put("dateUtil", new MyDateUtil()); // 自定义日期工具类
    sharedVariables.put("textUtils", new org.apache.commons.lang3.StringUtils()); // 第三方工具类
    configurer.setFreemarkerVariables(sharedVariables);
    return configurer;
}

模板中即可调用:${dateUtil.format(user.createTime, 'yyyy-MM-dd')}。

3. 模板语法进阶与性能陷阱

掌握了基础配置和数据绑定后,写出高效、优雅的模板是下一个目标。FreeMarker的语法功能丰富,但不当使用也可能带来性能问题或难以维护的代码。

3.1 列表迭代与状态变量

<#list>指令是模板中最常用的指令之一。除了基本的迭代,它提供了状态变量(item_index, item_has_next, item?counter等),能极大方便UI渲染。

<#list users as user>
    <tr class="${user?item_cycle('row1', 'row2')}"> <#-- 交替行样式 -->
        <td>${user?counter}. ${user.name}</td> <#-- 显示序号 -->
        <td>${user.age}</td>
        <td>
            <#if !user_has_next>
                <strong>最后一位用户</strong> <#-- 判断是否是最后一项 -->
            </#if>
        </td>
    </tr>
</#list>

性能注意:对于超大型列表(例如上万条),在模板中直接迭代可能消耗大量内存和渲染时间。考虑在Java端进行分页,或者使用FreeMarker的<#items>指令(需要配合特定的序列包装器)进行流式处理,但更常见的做法是将分页逻辑放在业务层。

3.2 条件判断与逻辑处理

FreeMarker的<#if>、<#elseif>、<#else>逻辑清晰。但需要注意,它的条件表达式比较严格:

  • 数字0和布尔值false在判断中为假。
  • 空字符串、空序列/集合在<#if>中为假(可使用?has_content判断)。
  • 比较操作符(==, !=, >, <等)两边必须是相同类型,否则需要转换。

一个有用的技巧是使用内建函数简化判断:

<#-- 判断字符串是否包含子串 -->
<#if product.tags?contains("promo")>
    <span class="badge">促销</span>
</#if>

<#-- 判断序列/集合是否为空,更安全的方式 -->
<#if (user.comments![])?size gt 0>
    <#-- 有评论 -->
</#if>

3.3 避免在模板中进行复杂计算

FreeMarker模板的核心职责是“展示”,而非“计算”。将复杂的业务逻辑(如数据聚合、转换、远程服务调用)放在Java代码中,将结果以简单的形式传递给模板。例如,不要这样:

<#-- 不推荐:在模板中计算总价 -->
<#assign total = 0>
<#list order.items as item>
    <#assign total = total + item.price * item.quantity>
</#list>
总价:${total}

而应该在Controller或Service层计算好order.totalAmount,然后直接在模板中显示${order.totalAmount}。这保证了模板的简洁和可测试性。

3.4 模板片段包含与布局管理

对于网站共同的页头、页脚、导航栏,使用<#include>指令。但<#include>是静态包含,在编译时即确定。对于更灵活的布局管理,如装饰器模式(Decorator Pattern),FreeMarker本身不直接支持,但可以结合<#macro>或使用第三方库(如SiteMesh,或Spring Boot的布局功能,如Thymeleaf的Layout Dialect有类似思想)来实现。一个简单的自定义布局方案如下:

  • 定义布局模板 (layout.ftl):
    <!DOCTYPE html>
    <html>
    <head>
        <title><#nested "title"> - 我的网站</title>
        <#nested "head">
    </head>
    <body>
        <header>...</header>
        <main>
            <#nested "content">
        </main>
        <footer>...</footer>
        <#nested "scripts">
    </body>
    </html>
    
  • 使用布局的内容模板 (page.ftl):
    <#import "/layout.ftl" as layout>
    <@layout.main>
        <#assign title = "用户主页" in layout>
        <#assign head in layout>
            <link rel="stylesheet" href="/css/user.css">
        </#assign>
        <#assign content in layout>
            <h1>欢迎,${user.name}!</h1>
            <p>这是你的个人主页。</p>
        </#assign>
        <#assign scripts in layout>
            <script src="/js/user.js"></script>
        </#assign>
    </@layout.main>
    

这种方式通过宏和命名插槽实现了灵活的页面布局,虽然比专门的布局引擎稍显繁琐,但提供了完全的控制权。

4. 集成Spring Boot的最佳实践与调试技巧

将FreeMarker与Spring Boot结合,能发挥最大的生产力。以下是一些提升开发体验和代码质量的实践。

4.1 配置属性详解与优化

除了之前提到的路径和编码,application.yml中还有许多有用的配置:

spring:
  freemarker:
    enabled: true # 是否启用FreeMarker
    prefer-file-system-access: false # 是否优先文件系统访问模板(开发时可设为true热加载)
    settings: # 直接设置FreeMarker的Configuration属性
      template_exception_handler: rethrow # 异常处理方式:rethrow, debug, html_debug, ignore
      number_format: 0.## # 数字格式化
      date_format: yyyy-MM-dd
      datetime_format: yyyy-MM-dd HH:mm:ss
      locale: zh_CN # 本地化设置,影响数字、日期格式
      classic_compatible: false # 是否启用经典兼容模式(慎用)

template_exception_handler 是一个关键设置。在开发环境,可以设置为debug或html_debug,这样当模板出错时,浏览器会显示详细的错误信息和高亮的问题代码位置。在生产环境,务必设置为rethrow或配置一个自定义的异常处理器,将错误信息记录到日志,而不是暴露给用户。

4.2 在Controller与Service中的高效使用

在Spring MVC的Controller中,返回视图名是最常见的方式。但有时你需要直接生成模板内容,比如生成邮件正文、导出报告文件等。

@Service
public class ReportService {
    
    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;
    
    public String generateHtmlReport(ReportData data) throws Exception {
        Configuration config = freeMarkerConfigurer.getConfiguration();
        Template template = config.getTemplate("report/template.ftl");
        
        StringWriter writer = new StringWriter();
        template.process(data.toMap(), writer);
        return writer.toString();
    }
    
    public void generatePdfReport(ReportData data, HttpServletResponse response) throws Exception {
        String html = generateHtmlReport(data);
        // 使用 flying-saucer, iText 等库将HTML转换为PDF
        // ... 设置response header (Content-Type, Content-Disposition)
        // ... 输出PDF流
    }
}

提示:对于非常高频的模板渲染,可以考虑缓存Template对象。但Spring Boot和FreeMarker默认已经提供了模板缓存机制(生产环境spring.freemarker.cache=true),通常无需手动管理。

4.3 调试与日志监控

FreeMarker的日志输出对于定位问题非常有帮助。确保你的日志框架(如Logback)正确配置了freemarker或org.springframework.web.servlet.view.freemarker的日志级别为DEBUG或TRACE。

当遇到“Template not found”错误时,DEBUG日志会显示FreeMarker搜索模板的所有路径,这能帮你快速确认路径配置是否正确。

对于复杂的模板逻辑,可以在模板中使用<#ftl>指令的strip_whitespace属性来控制空白字符的去除,或者临时插入调试输出:

<#-- 临时调试,输出变量值 -->
<#assign debug = "当前用户: " + (user.name!"null")>
<!-- ${debug} --> <#-- HTML注释,输出到源码中便于查看 -->
<#-- 或者使用FreeMarker的 ?c 内建函数进行JSON式转义输出 -->
<#-- <#noescape>${user?no_esc}</#noescape> --> (谨慎使用,避免XSS)

更安全的方式是在Java端,通过Environment对象获取当前渲染状态的信息,但这需要更深入的API调用。

4.4 安全考量:防止模板注入

虽然FreeMarker本身是沙盒化的(模板不能直接执行任意Java代码),但不当的使用仍可能带来风险,主要是通过<#assign>或?eval执行用户输入的数据。绝对不要将未经净化的用户输入作为FreeMarker表达式进行求值。

// 危险!永远不要这样做
String userInput = request.getParameter("templatePart");
model.addAttribute("dynamicContent", userInput); // 用户可能输入 `${someMaliciousFunction()}`

// 在模板中
${dynamicContent} <#-- 如果dynamicContent是FreeMarker代码,它将被执行! -->

正确的做法是,将用户输入始终视为纯文本数据,如果需要动态内容,应通过预定义的宏、函数或数据模型来控制,而不是动态拼接模板代码。

最后,关于FreeMarker的版本选择,建议使用2.3.x系列的最新稳定版(如2.3.32),它修复了许多旧版本的bug,并提供了更好的性能和安全性。在Maven或Gradle中明确指定版本,避免依赖传递带来意外版本。

FreeMarker模板引擎入门:从基础到实践的全面指南 FreeMarker模版引擎从入门到实践 阅读详情

相关推荐

Java模板引擎深度对比:StringTemplate与FreeMarker全面解析

本文对比分析了Java生态中两款主流模板引擎StringTemplate和FreeMarker。StringTemplate强调严格的MVC分离和无副作用设计,语法简单但功能有限,适合需要强规范性的项目;FreeMarker则提供更丰富的模板语言功能和与Java深度集成,适用于复杂业务场景。性能方面,StringTemplate在初始化时间、渲染速度和内存占用上略占优势,而FreeMarker在国际化、安全防护等企业级需求上表现更优。开发者应根据项目对MVC严格性、功能需求及性能要求的平衡进行选择。

记录学习的过程 1287

SpringBootCodeGenerator 源码解读:Freemarker模板引擎的巧妙集成

SpringBootCodeGenerator(又名大狼狗代码生成器)是一款基于SpringBoot2+Freemarker的高效JAVA代码生成工具,旨在通过模板引擎技术释放开发者双手,支持mysql/oracle/pgsql三大数据库,可根据DDL-SQL语句快速生成JPA/JdbcTemplate/Mybatis等多种持久层框架代码。本文将深入解析项目中Freemarker模板引擎的集成方案

gitblog_01413的博客 353

web开发-Thymeleaf、FreeMarker模板引擎

Spring Boot 推荐使用Thymeleaf、FreeMarker、Velocity、Groovy、Mustache等模板引擎。不建议使用JSP。Spring Boot 对以上几种引擎提供了良好的默认配置,默认 src/main/resources/templates 目录为以上模板引擎的配置路径。一、Spring Boot 中使用Thymeleaf模板引擎简介:Thymeleaf 是类似于...

heguiliang_123的博客 1172

FreeMarker模板引擎主流程深度解析

FreeMarker是一款基于 Java 的模板引擎,广泛应用于 Web 页面、邮件、静态文件等内容生成领域。凭借其高性能、灵活可扩展、强大的模板语言和丰富的集成能力,成为 Java 生态中主流的模板解决方案之一。FreeMarker 最早由 Jonathan Revusky 于 2000 年发起,后由 Apache 基金会托管。它提供了一套功能强大、语法灵活的模板语言,支持条件、循环、宏、继承等高级特性。FreeMarker 设计目标是视图与业务逻辑解耦,提升开发效率和系统可维护性。继承。

IT技术学习与工作笔记分享 2214

Freemarker模板引擎深度解析与应用

Freemarker主要包含三个核心组件:模板(Template)、数据模型(Data Model)和配置(Configuration)。模板是静态的文本文件,通常为HTML或XML,其中嵌入了特定的指令和变量。数据模型是用于向模板提供数据的结构,通常以键值对的形式存在。配置则是Freemarker引擎的设置,它定义了模板的加载方式、缓存机制等。理解这些核心概念为后续深入学习和使用Freemarker打下了坚实的基础。

weixin_33298352的博客 1107

FreeMarker模板引擎:开发指南与实战手册

本文还有配套的精品资源,点击获取 简介:FreeMarker是一个开源的模板引擎,主要用于生成动态文本内容,特别适合Java环境下的Web应用开发。它支持与Spring MVC等框架集成,通过分离业务逻辑和视图层,提高开发效率。本文详细介绍FreeMarker的核心概念、语法、Web集成、性能优化以及与其他技术的结合。学习FreeMarker将帮助开发者利用这一工具快速、安...

weixin_42509507的博客 1503

Pippo框架模板引擎完全指南:Freemarker、Pebble、Jade等六大引擎深度解析

🚀 **Pippo框架**作为一款轻量级的Java Web框架,其强大的**模板引擎**支持是其核心特色之一。无论您是刚接触Java Web开发的新手,还是寻求更高效开发方式的老手,Pippo的模板引擎系统都能为您提供灵活、高效的视图层解决方案。本文将为您全面解析Pippo框架支持的六大模板引擎,帮助您选择最适合项目需求的工具。 ## 📊 Pippo框架模板引擎概览 Pippo框架提供了丰

gitblog_00529的博客 1001

FreeMarker中文教程手册:全面掌握模板引擎

FreeMarker是一款用Java编写的模板引擎,主要用于生成文本输出。它被广泛应用于Web开发中,尤其是动态HTML页面的生成。其核心思想是将业务逻辑层和展示层分离,提高开发效率,使开发人员能够专注于各自的专业领域。模板文件是FreeMarker用来生成文本输出的核心。一个模板文件通常包含静态文本和FreeMarker指令。静态文本是模板中不需要FreeMarker处理的部分,而指令则是FreeMarker用于动态内容生成的部分。让我们看看一个模板文件的基本结构:<html><head>

weixin_33308579的博客 939

Freemarker模板引擎技术

问题】当渲染文章数据时,由于文章的数据很多,直接去查询文章内容表的话,效率比较低。解决】使用freemarker将文章的内容通过模板技术生成静态的html文件存储到minio中,这样用户就只需要拿着minio的url去minio里获取静态页面即可。效率大大提高。

qq_57882997的博客 1700

掌握Freemarker模板引擎:实践指南

Freemarker 是一个灵活且强大的模板引擎,广泛应用于Java Web应用中,用于生成文本输出。它通过将业务数据与HTML模板相结合来创建动态网页,从而分离了内容和表现层。Freemarker可以处理各种文本格式,比如HTML、XML、CSV等,而不仅仅是网页。模板语言简单易懂,使得非Java开发者也可以创建和修改模板。Freemarker 的核心是基于预定义的标签和变量,这使得模板的可读性和可维护性非常好。同时,它还提供了一系列配置选项,允许开发者定制模板处理方式,以适应不同的业务场景。

weixin_42510243的博客 817

利用随机矩阵理论(random matrix theory)确定微生物网络构建阈值

利用随机矩阵理论(random matrix theory)确定微生物网络构建阈值

微生物生态学分析 7640

freemarker模板引擎

FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网 页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一 款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。

#helloworld的博客 1080

基于阻抗控制的工业机器人轨迹跟踪系统 Simulink/Simscape 仿真

  本文是对文献 [1] 的复现。 关于阻抗控制   阻抗控制的提出可以追溯到 1984 年,Neville Hogan 在 American Control Conference 发表的 Impedance Control:An Approach to Manipulation ,次年,Hogan N. 又在 Journal of Dynamic Systems Measurement and Control-transactions of The Asme 发表了阻抗控制经典三部曲 —— Imped.

-贝塔- 的博客 2万+

JavaEE进阶——FreeMarker模板引擎

I. 简介 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于...

等一杯咖啡的博客 2万+

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 421

TIA博途WINCC中如何设置多语言及语言切换的具体方法

TIA博途WINCC中如何设置多语言及语言切换的具体方法

Robot_PLC_HMI_Automation 1万+

Thymeleaf vs JSP vs FreeMarker:模板引擎深度解析与选型指南

以下是一篇关于Thymeleaf与其他主流模板引擎(如JSP、FreeMarker、Velocity等)的解析。

m0_75236543的博客 1876

uni-app:实现APP设置手机闹钟+取消闹钟+响铃重复/文字等,帮用户设置好闹钟并备注文本,uni-app设置安卓系统闹钟和苹果ios系统闹钟(uniapp调用手机上的闹钟,详细示例代码demo)

uniapp设置安卓和iOS闹钟的插件,uni-app设置安卓系统闹钟,uniapp设置苹果ios系统闹钟,uniapp设置定时闹铃的完整解决方案,UniApp设置手机闹钟,uniApp如何设置手机闹铃,uniapp设置闹钟,设置闹钟提醒,uni-app设置安卓系统闹钟_通过uniapp设置原声闹钟,调用android系统闹钟,如何在App中启动系统闹钟,uniapp如何取消闹钟,通过调用ios的原生接口来设置手机闹钟,uni-app 调用手机闹钟功能,uniap调用ios系统闹钟,uniapp调用手机上的

✅ 精选推荐文章 4235

模板引擎Freemarker基础知识

Freemarker基础知识Freemarker是什么FreeMarker 基础指令List指令遍历Map数据if指令其它指令运算符空值处理内建函数入门Demo要导入的依赖配置文件模型类创建模板接口数据使用模板文件静态化使用模板字符串静态化 Freemarker是什么 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 常用的java模板引擎还有 Jsp、Freemarker、Thymeleaf 、Velocit

Dark_Blue__的博客 3730

Codex 的 AGENTS.md 到底怎么写?前端、后端两套实战模板,照抄就能用

文件名是大写AGENTS.md,放在项目根目录构建、测试、类型检查命令都是可直接复制执行的只写了 Agent 从代码里推断不出来的约定红线规则用了明确的否定句式(禁止/不要/Never)标注了自动生成目录和禁止修改的模块写清了交付要求(改动清单 + 验证命令 + 风险说明)没有任何密钥、密码、连接串整体一页能看完,核心要点 10 条以内每一条都能通过"删掉会不会更容易犯错"的测试一份短小精准的 AGENTS.md,比一份充斥模糊规则的长文件有用得多。

篮球界最会写bug的人;程序猿中打球最菜的人。 618

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7210

Java工具11-Java模板引擎:Thymeleaf与Freemarker

Java模板引擎对比:Thymeleaf与Freemarker 核心差异分析: 语法设计: Thymeleaf采用HTML属性语法(th:text),支持静态原型预览 Freemarker使用独立指令语法(<#if>),需预编译 集成性: Thymeleaf与Spring生态深度集成,是Spring Boot默认引擎 Freemarker作为通用模板引擎,在非Spring场景更灵活 性能表现: Freemarker解析速度更快(字节码预编译) Thymeleaf首次加载较慢但缓存后性能接近 开发

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

模板引擎:FreeMarker

FreeMarker 是一种功能强大的模板引擎,主要用于生成动态文本输出,如网页、电子邮件、配置文件等。它支持变量、表达式、循环、条件判断等编程结构,能够灵活处理数据并生成动态内容。FreeMarker 与 Java 集成良好,可轻松用于生成 HTML、XML 等文本格式,并支持与 Spring、Struts 等框架集成。其工作原理基于模板文件和数据模型,通过模板引擎解析并生成最终输出。使用步骤包括引入 FreeMarker 库、创建模板文件、准备数据模型、配置 FreeMarker 并生成输出。

weixin_62307424的博客 1206

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

前端模板引擎 -- Freemarker

一、Freemarker介绍 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据,简单来讲就是模板加数据模型,然后输出页...

来日可期的博客 5005

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Freemarker模板引擎详解-优快云博客

Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包,或者说是一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。Freemarker 是使用纯java编写的,为了提高页面的访问速度,需要把页面静态化, 那么Freemarker就是被用来生成html页面。到目前为止,Freemarker使用越来越广泛,不光光只是它强大的生成技术,而且它能够与spring进行很好的集成。

求知若渴、虚心若愚 1074
上一篇: MCP Client 开发中 -32000 报错的诊断与解决
下一篇: 【深尚想】LTR-390UV-01光宝环境光传感器在智能穿戴与健康监测中的创新应用
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值