FreeMarker模板引擎入门:从基础到实践的全面指南
前言
什么是FreeMarker
FreeMarker是一个基于模板生成文本输出的通用工具,它使用纯Java编写,能够生成HTML、XML、JSON、RTF、Java源代码等多种格式的文本。FreeMarker模板引擎允许将数据模型与模板文件结合,生成动态的文本输出,广泛应用于Web开发、邮件生成、报告生成等场景。以下是对FreeMarker使用的详细解析。
FreeMarker的基本概念
- 模板文件(*.ftl):FreeMarker的模板文件通常以
.ftl为后缀,其中包含了用于生成文本的标记和指令。 - 数据模型:数据模型是一个包含要插入模板中数据的对象,通常是一个Map或JavaBean。
- 输出:通过模板和数据模型的结合,FreeMarker生成最终的文本输出。
FreeMarker模板的基本组成部分
- 文本:模板中直接输出的内容部分。
- 注释:不会输出的内容,格式为
<#-- 注释内容 -->。 - 取值(插值):代替输出数据模型的部分,格式为
${数据模型}或#{数据模型}。 - ftl指令:FreeMarker指令,类似于HTML标记,包括内建指令和自定义指令。
FreeMarker的基础语法
-
字符输出
${emp.name?if_exists}:变量存在时输出,否则不输出。${emp.name!}:变量存在时输出,否则输出空字符串。${emp.name?default("xxx")}:变量不存在时取默认值xxx。- 常用内部函数,如
${"123<br>456"?html}对字符串进行HTML编码,${"str"?cap_first}使字符串第一个字母大写等。
-
日期输出
${emp.date?string('yyyy-MM-dd')}:格式化日期输出。
-
数字输出
${emp.name?string.number}:以数字形式输出。${emp.name?string.currency}:以货币形式输出。${emp.name?string.percent}:以百分比形式输出。- 数字格式化插值可采用
#{expr;format}形式,其中格式可以是mX(小数部分最小X位)、MX(小数部分最大X位)等。
-
声明变量
<#assign foo=false/>:声明变量,并插入布尔值进行显示。${foo?string("yes","no")}:当变量为真时输出“yes”,否则输出“no”。
-
表达式中的运算符
- 比较运算符:=或==(判断两个值是否相等)、!=(判断两个值是否不等)、>或gt(大于)、<或lt(小于)、>=或lte(大于等于)、<=或gte(小于等于)。
- 算术运算符:+、-、*、/、%。
- 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)。
FreeMarker的控制语句
if逻辑判断
<#if condition> ...
<#elseif condition2> ...
<#elseif condition3> ...
<#else> ...
</#if>
switch语句
<#switch value> <#case refValue1> ... <#break> <#case refValue2> ... <#break> <#case refValueN> ... <#break> <#default> ...
</#switch>
集合与循环
<#list empList as emp> ${emp.name!}
</#list>
或者通过索引遍历集合:
<#list 0..(empList!?size-1) as i> ${empList[i].name!}
</#list>
FreeMarker的高级功能
-
宏定义
宏是一种可以在模板中定义并重复使用的代码块。通过宏定义,可以简化模板的编写,提高代码的可读性和可维护性。
-
自定义指令
自定义指令是FreeMarker提供的一种扩展机制,允许用户根据自己的需求定义新的指令。自定义指令可以包含复杂的逻辑和操作,以满足特定的模板需求。
-
国际化与本地化
FreeMarker支持国际化与本地化功能,允许根据用户的语言和地区设置生成不同语言的文本输出。这通常通过加载不同的语言资源文件来实现。
FreeMarker的使用步骤
- 导入FreeMarker库:将FreeMarker的jar包添加到项目中。
- 创建FreeMarker配置对象:使用
Configuration类来创建FreeMarker的配置对象,并设置模板文件的路径、编码格式等。 - 获取模板文件:使用
Configuration对象的getTemplate方法来获取模板文件的对象。 - 创建数据模型:创建一个数据模型对象,用于存储模板中所需的数据。
- 渲染模板:使用模板对象的
process方法将数据模型与模板文件进行渲染,并将结果输出到指定的位置。
注意事项
- 模板文件的路径和文件名:确保模板文件的路径和文件名正确无误。
- 数据模型中的变量:确保在数据模型中定义了所有在模板中使用的变量。
- 表达式的语法和用法:检查表达式的语法和用法是否正确。
- 控制语句的语法和用法:检查控制语句的语法和用法是否正确。
FreeMarker基本使用案例
FreeMarker在我看来是用来代替JSP进行取值的一种方式,因为FreeMarker不需要再页面中书写额外配置和java代码就可以取到后台存储在各个作用域中的数据,代码十分类似HTML,接下来,我将演示如何使用FreeMarker进行取值等基本操作。
注意:接下来演示的项目是在整合了SSM框架的基础上进行的。
第一步:导入相关依赖
pom.xml
<!--freemarker--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>
第二步:添加FreeMarker配置到SpringMVC配置文件中
spring-mvc.xml
<!-- 针对FREEMAKER的视图配置 --><bean id="viewResolver"class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"><property name="cache" value="true" /><property name="prefix" value="/ftl/" /><property name="suffix" value=".ftl" /><property name="contentType" value="text/html;charset=UTF-8"></property><property name="allowSessionOverride" value="true"/><property name="requestContextAttribute" value="request" /><property name="exposeSpringMacroHelpers" value="true" /><property name="exposeRequestAttributes" value="true" /><property name="exposeSessionAttributes" value="true" /></bean><bean id="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><property name="templateLoaderPath" value="/" /><property name="freemarkerSettings"><props><prop key="template_update_delay">0</prop><prop key="default_encoding">UTF-8</prop><prop key="number_format">0.##########</prop><prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop><prop key="classic_compatible">true</prop><prop key="template_exception_handler">ignore</prop></props></property></bean>
使用FreeMarker视图解析器代替jsp视图解析器
第三步:创建Controller层控制器
FreeController
存储User对象的前提是我已经创建了User实体类
@Controller
public class FreeController {@RequestMapping("/free")public String freeTest(Model model){User user =new User();user.setUser_name("数码暴龙战士");user.setBirthday(new Date());model.addAttribute("user",user);List<User> list =new ArrayList<>();User u1 =new User();u1.setUser_name("独孤求败");User u2 =new User();u2.setUser_name("步惊云");User u3 =new User();u3.setUser_name("聂风");list.add(u1);list.add(u2);list.add(u3);model.addAttribute("list",list);return "free";}
}
第四步:书写FreeMarker页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<#assign username="张三">
${username}
<hr/>
${user.user_name}
<hr/>
${user.password!"密码不存在"}
<hr/>
${user.birthday?string('yyyy-MM-dd HH:mm:ss zzzz')}
<hr/>
${user.birthday?date}
<hr/>
<#--判断对象属性值是否为空-->
<#if user.password?exists>有密码<#else >无数据
</#if>
<hr/>
<#--判断对象属性值是否为空-->
<#if user.password??>有密码
<#else >无数据
</#if>
<hr/><#include "/up.html"/>
<hr/>
<#assign arrList=['a','b','c','d']/>
<#if arrList?size=0>arrList数组为空<#else >数组不为空
</#if>
<hr/>
<br/><#list list as user>${user_index},${user.user_name}<br/>
</#list></body>
</html>
代码分析
<#assign username="张三"> 页面设置变量username,并赋值张三 ${username} 页面取变量username的值${user.user_name} 获取controller中存储在request域中的user对象的user_name属性值${user.password!"密码不存在"} 因为password未存值,使用!判断,值是否为空,为空输出!后面的字符串${user.birthday?string('yyyy-MM-dd HH:mm:ss zzzz')} 使用?string(日期格式),进行Date类型的格式化显示,zzzz表示中国标准时间${user.birthday?date} 使用默认的格式解析日期(这里是年月日,不包括时分秒)<#--判断对象属性值是否为空--> <#if user.password?exists>有密码<#else >无数据 </#if> 注意<#else>的位置,写在<#if>标签中间<#--判断对象属性值是否为空--> <#if user.password??>有密码 <#else >无数据 </#if> 两种判断方式,?exists等价于??<#include "/up.html"/> 引入另一个html页面的内容,包括html,css和js<#assign arrList=['a','b','c','d']/> <#if arrList?size=0>arrList数组为空<#else >数组不为空 </#if> 定义数组/集合,根据集合或数组的长度进行判断<#list list as user>${user_index},${user.user_name}<br/> </#list> 获取后台存入request域中的list集合,并变量输出;_index为固定写法,表示取索引下标,从0开始。
演示效果

相关文章:
FreeMarker模板引擎入门:从基础到实践的全面指南
前言 什么是FreeMarker FreeMarker是一个基于模板生成文本输出的通用工具,它使用纯Java编写,能够生成HTML、XML、JSON、RTF、Java源代码等多种格式的文本。FreeMarker模板引擎允许将数据模型与模板文件结合,生成动态的文本输出,广…...
YOLOv8模型改进 第十讲 添加全维度动态卷积(Omni-dimensional Dynamic Convolution,ODConv)
本篇文章将介绍一种全新的改进机制——全维度动态卷积ODConv,并展示其在YOLOv8中的实际应用。现全维动态卷积(Omni-dimensional Dynamic Convolution,ODConv)是一种先进的动态卷积设计,旨在通过引入多维注意力机制来提…...
【环境搭建】远程服务器搭建ElasticSearch
参考: 非常详细的阿里云服务器安装ElasticSearch过程..._阿里云服务器使用elasticsearch-CSDN博客 服务器平台:AutoDL 注意: 1、切换为非root用户,su 新用户名,否则ES无法启动 2、安装过程中没有出现设置账号密码…...
机器学习与神经网络:诺贝尔物理学奖的新篇章
机器学习与神经网络:诺贝尔物理学奖的新篇章 引言 近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上的首次。诺贝尔物理学奖通常授予在自然现象和物理物质研究方面做出重大贡献的科学家。然而,今年…...
倍福TwinCAT程序中遇到的bug
文章目录 问题描述:TwinCAT嵌入式控制器CX5140在上电启动后,X001网口接网线通讯灯不亮,软件扫描不到硬件网口 解决方法:硬件断电重启后,X001网口恢复正常 问题描述:TwinCAT软件点击激活配置后,…...
R语言实现logistic回归曲线绘制
方式一:编制函数 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码快 f <- function(x){y 1/(1 exp(-x))plot(x,y)}#sigmoid函数 f(x) 方式二:Sigmoid函数代码 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码块 #y<-1/(1exp(-x)) y&…...
零宽字符(ZWSP)
前言 一个“所见非所得”的问题,示例如下: 查看原始DOM发现存在特殊字符: zero-width-space(ZWSP) 零宽空格是一种不可打印的Unicode字符,用于可能需要换行处。 在HTML中,零宽空格可以替代标…...
作业 定时发送邮件
[rootlocalhost zyc]# date -s 12:28 2024年 10月 15日 星期二 12:28:00 CST [rootlocalhost zyc]# vim /etc/chrony.conf [rootlocalhost zyc]# systemctl restart chronyd [rootlocalhost zyc]# date 2024年 10月 15日 星期二 12:36:00 CST [rootlocalhost zyc]# chronyc s…...
【排序】——2.快速排序法(含优化)
快速排序法 递归法 霍尔版本(左右指针法) 1.思路 1、选出一个key,一般是最左边或是最右边的。 2、定义一个begin和一个end,begin从左向右走,end从右向左走。(需要注意的是:若选择最左边的数据作为key,则…...
AnaTraf | 网络分析系统:高效IT运维工具
目录 什么是网络分析系统? 网络分析系统的核心功能 二、网络分析系统在IT运维中的重要性 案例分析:如何快速应对网络拥塞 技巧分享:如何使用网络分析系统优化带宽 网络分析系统的部署与最佳实践 确定监控范围与关键设备 分析结果的可…...
踩坑日记:线上接口超时问题排查
1.背景: 上线后,功能测试. 进入小程序页面发现很慢,耗时超过5秒,打开skywalking发现大量接口耗时都很高. 2.top命令 服务器top命令查看cpu资源发现占用并不高 3.mysql查看sql运行情况 # 当前运行的所有事务 select * from information_schema.innodb_trx; 1 | …...
C语言中的段错误(Segmentation Fault):底层原理及解决方法
引言 在C语言编程中,“段错误”(通常由操作系统信号 SIGSEGV 触发)是一种常见的异常情况,它表明程序试图访问不受保护的内存区域。本文将深入探讨段错误的原因、底层原理、常见情况以及如何调试和解决这类错误。 段错误的定义 …...
1.两数之和 暴力枚举和暴力搜索法
1. 两数之和 已解答 简单 相关标签 相关企业 提示 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相…...
你的收入达到了缴纳个人所得税的标准了吗?
在现代社会,个人所得税作为一种重要的税收形式,已经渗透到了我们每个人的日常生活中。它不仅关乎国家的财政收入,更与每个纳税人的切身利益息息相关。那么,你是否真正了解个人所得税的缴纳标准、计算方法以及相关的税收优惠政策呢…...
【C++贪心】2086. 喂食仓鼠的最小食物桶数|1622
本文涉及知识点 C贪心 LeetCode2086. 喂食仓鼠的最小食物桶数 给你一个下标从 0 开始的字符串 hamsters ,其中 hamsters[i] 要么是: ‘H’ 表示有一个仓鼠在下标 i ,或者’.’ 表示下标 i 是空的。 你将要在空的位置上添加一定数量的食物桶…...
notepad++中实现代码整体缩进和退格
我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 🎓擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号:乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…...
如何调整配置请款单上的立账条件
顾问配置的立账条件取的是供应商档案里面的参数。与实际需求是不相匹配的。采购员商谈的立账条件经常是变化的。 措施:修改模板中立几账条件的OQL语句。 如下: select UFIDA::U9::AP::APBill::APBillHead.APBillLines.AccrueTerm.Name as 立账条件_名…...
骨传导耳机精选:2024最佳骨传导耳机有哪些?分享骨传导耳机top5
随着健康意识的普及,越来越多的人开始注重运动健身,并将音乐作为运动时的重要伴侣。然而,传统耳机在运动时易脱落且不易清洁的问题,给健身爱好者们带来了不少困扰。幸运的是,骨传导耳机的出现为这一问题提供了解决方案…...
for循环与webAPI练习题
爱太容易了,让爱维持才是最困难的部分 文章目录 for循环练习题webAPI练习题 for循环练习题 练习1:计算1-100的和 let sum 0for (let i 1; i < 100; i) {sum i}console.log(sum)练习2:将1-100之间所有是6的倍数的数字输出到控制台 for …...
FLUX | 轻松掌握FLUX.1 LoRA本地训练秘籍!
在数字艺术和创意领域,FLUX以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,FLUX推出了一款全新的FLUX.1版本,它将LoRA本地训练技术完美融合,为用户提供了更加便捷和高效…...
微信小程序onLaunch异步问题实战:如何确保Page的onLoad在onLaunch完成后执行?
微信小程序异步初始化难题:5种方案确保onLaunch与onLoad的执行顺序 微信小程序的启动流程看似简单,却隐藏着一个让不少开发者踩坑的异步陷阱。当你在app.js的onLaunch中进行网络请求或异步操作时,页面层级的onLoad可能已经迫不及待地开始执行…...
如何高效管理《神界:原罪2》模组?Divinity Mod Manager终极指南
如何高效管理《神界:原罪2》模组?Divinity Mod Manager终极指南 【免费下载链接】DivinityModManager A mod manager for Divinity: Original Sin - Definitive Edition. 项目地址: https://gitcode.com/gh_mirrors/di/DivinityModManager Divini…...
新手必看!Cesium的NearFarScalar属性详解:从参数配置到常见问题排查
Cesium视觉控制进阶:NearFarScalar属性深度解析与实战技巧 第一次接触Cesium的开发者往往会被其强大的三维可视化能力所震撼,但当真正开始动手实现一个简单的广告牌效果时,却可能被各种参数配置搞得晕头转向。其中,控制广告牌随距…...
OpenClaw飞书机器人实战:QwQ-32B驱动自动化问答系统
OpenClaw飞书机器人实战:QwQ-32B驱动自动化问答系统 1. 为什么选择OpenClaw飞书QwQ-32B组合? 去年冬天,我被一个重复性工作折磨得够呛——每天要处理几十条飞书消息,提取会议要点、整理待办事项、回复常见问题。直到发现OpenCla…...
告别手动输入!SQLPlus非交互模式执行SQL脚本的3种高效方法(附实例)
告别手动输入!SQLPlus非交互模式执行SQL脚本的3种高效方法(附实例) 在数据库管理和开发工作中,频繁执行SQL脚本是家常便饭。想象一下这样的场景:每天凌晨需要生成报表、定期执行数据清洗任务、或者批量更新生产环境数据…...
突破原厂限制:用开源相机工具解锁Sony相机7大隐藏功能
突破原厂限制:用开源相机工具解锁Sony相机7大隐藏功能 【免费下载链接】Sony-PMCA-RE Reverse Engineering Sony Digital Cameras 项目地址: https://gitcode.com/gh_mirrors/so/Sony-PMCA-RE 作为一名摄影爱好者,我一直梦想能充分掌控我的Sony相…...
Cinema 4D 2026液体模拟实战:如何用新功能打造逼真水流效果(附参数设置)
Cinema 4D 2026液体模拟实战:如何用新功能打造逼真水流效果(附参数设置) 在三维动画和特效设计领域,液体模拟一直是技术难度最高、计算资源消耗最大的环节之一。Cinema 4D 2026针对这一核心功能进行了重大升级,特别是改…...
VTK.js终极指南:7个步骤掌握Web端3D可视化开发
VTK.js终极指南:7个步骤掌握Web端3D可视化开发 【免费下载链接】vtk-js Visualization Toolkit for the Web 项目地址: https://gitcode.com/gh_mirrors/vt/vtk-js 你是否曾想过在浏览器中实现专业的医学影像三维重建?或是让复杂的科学数据在网页…...
深入解析acts-as-taggable-on:Rails标签系统的终极实现指南
深入解析acts-as-taggable-on:Rails标签系统的终极实现指南 【免费下载链接】acts-as-taggable-on A tagging plugin for Rails applications that allows for custom tagging along dynamic contexts. 项目地址: https://gitcode.com/gh_mirrors/ac/acts-as-tagg…...
AI图像放大神器Upscayl:告别模糊时代的终极解决方案
AI图像放大神器Upscayl:告别模糊时代的终极解决方案 【免费下载链接】upscayl 🆙 Upscayl - Free and Open Source AI Image Upscaler for Linux, MacOS and Windows built with Linux-First philosophy. 项目地址: https://gitcode.com/GitHub_Trendi…...
