FreeMarker快速入门指南

FreeMarker是一个基于模板和数据模型生成文本输出的Java库。它广泛应用于Web开发、代码生成、邮件模板等场景。本文将带你快速上手FreeMarker的核心概念和基本用法。

什么是FreeMarker

FreeMarker是一个模板引擎,它将模板文件(.ftl文件)与数据模型结合,生成最终的文本输出。其核心优势包括:

  • 模板与逻辑分离:视图层完全独立于业务逻辑
  • 功能强大:支持复杂的表达式、宏定义、继承等特性
  • 性能优秀:模板预编译,执行效率高
  • 易于学习:语法简洁直观

添加依赖

在Maven项目中添加FreeMarker依赖:

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version>
</dependency>

基本概念

FreeMarker的工作流程包含三个核心组件:

  1. Template(模板):包含静态文本和FreeMarker指令的文件
  2. Data Model(数据模型):Java对象,为模板提供动态数据
  3. Output(输出):模板和数据模型合并后的最终结果

第一个示例

让我们通过一个简单示例来理解FreeMarker的基本用法:

1. 创建模板文件

创建一个名为welcome.ftl的模板文件:

<!DOCTYPE html>
<html>
<head><title>欢迎页面</title>
</head>
<body><h1>欢迎 ${userName}!</h1><p>今天是 ${currentDate}</p><#if isVip><p style="color: gold;">您是我们的VIP用户!</p><#else><p>感谢您的访问!</p></#if><h2>您的订单</h2><ul><#list orders as order><li>${order.productName} - ¥${order.price}</li></#list></ul>
</body>
</html>

2. Java代码实现

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;public class FreeMarkerDemo {public static void main(String[] args) {try {// 1. 创建Configuration对象Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);cfg.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));cfg.setDefaultEncoding("UTF-8");// 2. 获取模板Template template = cfg.getTemplate("welcome.ftl");// 3. 准备数据模型Map<String, Object> dataModel = new HashMap<>();dataModel.put("userName", "张三");dataModel.put("currentDate", new Date());dataModel.put("isVip", true);// 创建订单列表List<Map<String, Object>> orders = new ArrayList<>();Map<String, Object> order1 = new HashMap<>();order1.put("productName", "笔记本电脑");order1.put("price", 5999);orders.add(order1);Map<String, Object> order2 = new HashMap<>();order2.put("productName", "无线鼠标");order2.put("price", 99);orders.add(order2);dataModel.put("orders", orders);// 4. 生成输出StringWriter out = new StringWriter();template.process(dataModel, out);System.out.println(out.toString());} catch (IOException | TemplateException e) {e.printStackTrace();}}
}

核心语法

变量输出

${变量名}              // 输出变量值
${user.name}           // 输出对象属性
${user.getName()}      // 调用方法
${price?string.currency} // 格式化输出

条件判断

<#if condition>条件为真时的内容
<#elseif anotherCondition>另一个条件为真时的内容
<#else>默认内容
</#if>

循环遍历

<#list items as item>${item_index}: ${item.name}
</#list>// 检查列表是否为空
<#list users as user>${user.name}
<#else>没有用户数据
</#list>

默认值处理

${name!"未知"}          // 如果name为null,显示"未知"
${age?c}               // 数字格式化
${date?string("yyyy-MM-dd")} // 日期格式化

宏定义

<#macro greeting name color="blue"><p style="color: ${color}">你好,${name}!</p>
</#macro>// 使用宏
<@greeting name="张三" />
<@greeting name="李四" color="red" />

实际应用场景

1. Web开发中的视图层

FreeMarker常用于Spring MVC中作为视图解析器,生成动态HTML页面。

2. 邮件模板

// 邮件模板示例
public String generateEmailContent(User user, Order order) {Map<String, Object> model = new HashMap<>();model.put("user", user);model.put("order", order);return processTemplate("email/order-confirmation.ftl", model);
}

3. 代码生成

FreeMarker可以根据数据模型生成Java代码、SQL脚本等。

最佳实践

  1. 模板组织:将模板文件放在统一目录下,使用合理的文件夹结构
  2. 数据准备:在Controller或Service层准备完整的数据模型,避免在模板中进行复杂逻辑处理
  3. 错误处理:妥善处理TemplateException和IOException异常
  4. 性能优化:重用Configuration对象,避免重复创建
  5. 安全考虑:对用户输入进行适当的转义处理

小结

FreeMarker是一个功能强大且易于使用的模板引擎。通过分离模板和数据,它让代码结构更清晰,维护更容易。掌握了基本语法和核心概念后,你就可以在项目中灵活运用FreeMarker来处理各种文本生成需求。

随着项目复杂度的增加,你还可以深入学习FreeMarker的高级特性,如自定义指令、模板继承、国际化支持等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96104.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96104.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96104.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx主配置文件

一&#xff0c;Nginx基本介绍1&#xff0c;nginx概念Nginx 是一款轻量级、高性能的服务器软件&#xff0c;核心能力是 “处理网络请求”&#xff0c;被广泛用于网站、App 的后端架构中。Nginx 就像一个 “高效的网络交通指挥官”&#xff0c;核心价值是用最少的资源&#xff0c…

基于ResNet50的智能垃圾分类系统

基于ResNet50的智能垃圾分类系统&#xff1a;从理论到实践的完整指南 源码获取https://mbd.pub/o/bread/YZWXlZ1yZg 引言&#xff1a;智能垃圾分类的时代背景与意义 随着城市化进程的加速和人口数量的增长&#xff0c;垃圾处理问题日益成为全球性的环境挑战。传统的垃圾分类…

灾难性遗忘:神经网络持续学习的核心挑战与解决方案

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. 灾难性遗忘的定义与核心问题 灾难性遗忘&#xff08;Catastrophic…

OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现

&#x1f50d; OPENPPP2 —— IP标准校验和算法深度剖析&#xff1a;从原理到SSE2优化实现 引用&#xff1a; IP校验和算法&#xff1a;从网络协议到SIMD深度优化IP校验和算法&#xff1a;从标量到SIMD的高级优化&#xff08;SSE4.1&#xff09; GDB online Debugger C17 Co…

4.4 机器学习 - 集成学习

集成学习通过 “组合多个基础模型” 提升泛化能力&#xff0c;核心分为并行集成&#xff08;Bagging&#xff09;、串行集成&#xff08;Boosting&#xff09; 和多层集成&#xff08;Stacking&#xff09; 三大范式&#xff0c;分别对应 “降方差”“降偏差”“兼顾偏差与方差…

机器学习 - 使用 ID3 算法从原理到实际举例理解决策树

一、什么是决策树1.基本概念决策树是一种树形结构&#xff0c;由结点&#xff08;node&#xff09; 和有向边&#xff08;directed edge&#xff09; 组成。其中结点分为两类&#xff1a;内部结点&#xff08;internal node&#xff09;&#xff1a;表示一个属性&#xff08;特…

【期末复习】嵌入式——S5PV210开发板

本文为嵌入式课程期末复习&#xff0c;仅供参考&#xff0c;所用课本&#xff1a;嵌入式Linux操作系统&#xff08;李建祥著&#xff09;。第一章1.1 简述嵌入式微处理器数据存储格式的大&#xff0c;小端模式。大端模式是指数据的高字节保存在内存的低地址中&#xff0c;而数据…

word文档结尾批量插入图片 docx批量插入图片 指定几张

如果你有一些word文档。比如工作总结。你想每一个文档里面都插入几张图片。插入到每个文档的结尾&#xff0c;那么你可以使用这个工具。首先准备好你的文档。然后把它们拖进右边的方框中。拖动的时候&#xff0c;拖动第一个&#xff0c;然后准备好你的图片。把你的图片全部拖动…

CodeBuddy国际版又更新了体验感1

CodeBuddy国际版又更新了 更好的使用体验更少的资源消耗合理的消耗剩余资源使用起来也是很不错的&#xff0c;这次更新自动模式想不到的少&#xff0c;可以用于其他的例如翻译与写测试用例或者其他的说明文档等或者是阅读一下项目更好了解项目总的上来说 使用体验响应速度还是不…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的公益课引流策略研究

摘要&#xff1a;本文聚焦公益课引流场景&#xff0c;探讨开源AI智能名片、链动21模式与S2B2C商城小程序的融合应用。通过构建低成本用户裂变体系&#xff0c;分析该技术组合在精准筛选、社群运营、激励机制设计中的协同效应。研究提出"智能名片画像-链动裂变激励-S2B2C生…

季度最强策略:年化247%,回撤10%,夏普比率3.79。附大小盘轮动策略python源代码。

原创内容第993篇&#xff0c;专注AGI&#xff0c;AI量化投资、个人成长与财富自由。 季度最强策略&#xff1a; 年化247%&#xff0c;回撤10%&#xff0c;夏普比率3.79。3积分可查看参数。 大小盘轮动的策略源代码&#xff1a; 年化收益18.8%。 from engine import Task, Eng…

testng.xml

一、TestNG.xml 是 TestNG 测试框架的核心配置文件&#xff0c;用于组织和控制测试执行。通过它&#xff0c;可以灵活地管理测试套件、测试类、方法&#xff0c;并设置各种执行参数一个基本的 testng.xml文件通常以 ​​DOCTYPE 声明​​开头&#xff0c;并遵循特定的文档类型定…

上架商品合规流程有多条,有的长,有的短,有的需要审核,校验商品的合规性

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

[嵌入式][stm32h743iit6] 野火繁星stm32h743iit6开发板使用学习记录

[嵌入式][stm32h743iit6] 野火繁星stm32h743iit6开发板使用学习记录野火繁星STM32H743IIT6开发板使用学习速记问题描述尝试解决野火繁星STM32H743IIT6开发板使用学习速记 问题描述 在使用该开发板学习stm32hal库pwm开发时, 偶遇代码无法驱动sg90舵机进行旋转, 无论占空比设置…

Android 热点开发的相关api总结

Android 热点 一、前言热点开发属于系统级功能开发&#xff0c;涉及的核心 API 多为系统签名权限保护&#xff08;如android.permission.TETHER_PRIVILEGED&#xff09;&#xff0c;通常仅系统应用&#xff08;如 Settings&#xff09;可正常调用。 实际开发中&#xff0c;除基…

Claude Code 使用指南

Claude Code 使用指南 在 AI 辅助编程领域&#xff0c;我们正经历从简单的代码补全到能够自主执行复杂任务的“智能体”&#xff08;Agent&#xff09;的深刻变革。Claude Code 正是这一变革的杰出代表。它并非一个简单的问答机器人&#xff0c;而是一个设计精密的编程协作系统…

Spring Boot常用注解-详细解析+示例

1. SpringBootApplication详细解析&#xff1a;组合注解&#xff0c;包含Configuration&#xff08;标记配置类&#xff09;、EnableAutoConfiguration&#xff08;开启自动配置&#xff09;、ComponentScan&#xff08;组件扫描&#xff09;。启动类标注后&#xff0c;Spring …

基于原神游戏物品系统小demo制作思路

概述 本文介绍了一个基于C的游戏物品与角色管理系统&#xff0c;该系统实现了游戏中的物品分类、角色属性管理、队伍组建以及背包物品使用等功能。该系统采用面向对象的设计原则&#xff0c;通过继承和多态实现了可扩展的物品效果系统。 系统架构 1. 物品类型系统 系统定义了三…

Grounded-Segment-Anything 环境配置

Grounded-Segment-Anything 环境配置Grounded-Segment-Anything 介绍环境配置Install osx&#xff08;非必须&#xff09;:Install RAM & Tag2Text:报错 module ‘pkgutil‘ has no attribute ‘ImpImporter‘. Did you mean: ‘zipimporter‘?运行输出分割文本提示检测远…

ZYNQ 定时器

一、ZYNQ定时器简介 每个Cortex-A9处理器都有自己的专用32位定时器和32位看门狗定时器。两个处理器共享一个全局64位定时器。这些计时器的时钟始终为CPU频率&#xff08;CPU_3x2x&#xff09;的1/2。在系统级&#xff0c;有一个24位看门狗定时器和两个16位三重定时器/计数器。系…