freemarker 宏机制

深入理解Freemarker模板继承与接口实现(下) Freemarker是一个用于Java程序中的模板引擎,它允许你将业务逻辑与页面展示分离,从而使得开发者可以更专注于业务逻辑的实现。模板文件通常以.ftl作为文件扩展名,里面包含了嵌入的Freemarker指令,用于控制数据的输出格式和页面布局。是Freemarker中一个抽象类,它封装了模板环境(Environment)的操作接口。Freemarker的模板渲染都是在环境中完成的,因此在整个渲染过程中起着承上启下的作用。// ... 其他方法。 阅读详情
用户定义指令-使用@符合来调用 
有两种不同的类型:Macro(宏)和transform(传递器),Macro是在模板中使用macro指令定义,而transform是在模板外由程序定义(基本上都是基于Java的),这里通过Macro来介绍自定义指令。 
例一: 
<#macro greet> 
<font size="+2">Hello Joe!</font> 
</#macro> 
使用:<@greet></@greet> 或 <@greet/> 
结果:<font size="+2">Hello Joe!</font> 


参数-在macro指令中可以在宏变量之后定义参数 
例二: 
<#macro greet person> 
<font size="+2">Hello ${person}!</font> 
</#macro> 
使用:<@greet person="Fred"/> and <@greet person="Batman"/> 
结果: <font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font> 


macro可以有多个参数,参数的次序是无关的,在macro指令中只能使用定义的参数,并且必须对所有参数赋值,可以在定义参数时指定缺省值: 


<#macro greet person color="black"> 
<font size="+2" color="${color}">Hello ${person}!</font> 
</#macro> 




在自定义指令嵌套内容:模板片断中使用<#nested>指令 


<#macro border> 
<table border=4 cellspacing=0 cellpadding=4><tr><td> 
<#nested> 
</tr></td></table> 
</#macro> 
使用:<@border>The bordered text</@border> 
结果: 


<table border=4 cellspacing=0 cellpadding=4> 
<tr><td>The bordered text 
</tr></td></table> 
<#nested>指令可以被多次调用: 


<#macro do_thrice> 
<#nested> 
<#nested> 
<#nested> 
</#macro> 
使用: 
<@do_thrice>Anything.</@do_thrice> 
结果: 
Anything. 
Anything. 
Anything. 


注意:嵌套内容是无法访问到macro中的局部变量的。 
例如: 


<#macro repeat count> 
<#local y = "test"> 
<#list 1..count as x> 
${y} ${count}/${x}: <#nested> 
</#list> 
</#macro> 
<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> 
结果: 
test 3/1: ? ? ? 
test 3/2: ? ? ? 
test 3/3: ? ? ? 




下面是一个嵌套使用自定义指令的例子: 


<@border> 
<ul> 
<@do_thrice> 
<li><@greet person="Joe"/> 
</@do_thrice> 
</ul> 
</@border> 
结果: 


<table border=4 cellspacing=0 cellpadding=4><tr><td> 
<ul> 
<li><font size="+2">Hello Joe!</font> 
<li><font size="+2">Hello Joe!</font> 
<li><font size="+2">Hello Joe!</font> 
</ul> 
</tr></td></table> 
在macro中使用循环变量-作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字: 


<#macro repeat count> 
<#list 1..count as x> 
<#nested x, x/2, x==count> 
</#list> 
</#macro> 
<@repeat count=4 ; c, halfc, last> 
${c}. ${halfc}<#if last> Last!</#if> 
/@repeat 
结果: 
1. 0.5 
2. 1 
3. 1.5 
4. 2 Last! 


注意:循环变量和用户定义指令开始标记指定的数目可以不同,调用时少指定循环变量,则多指定的值不可见,调用时多指定循环变量,多余的循环变量不会被创建。 


模板中的变量,有三种类型: 
1.) plain(全局)变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换 
2.) 局部变量:在macro中有效,使用local指令创建和替换 
3.) 循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量 


用assign指令创建和替换的例子: 


<#assign x = 1> <#-- create variable x --> 
${x} 
<#assign x = x + 3> <#-- replace variable x --> 
${x} 
结果: 
1 
4 


局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子: 


<#assign x = "plain"> 
1. ${x} <#-- we see the plain var. here --> 
<@test/> 
6. ${x} <#-- the value of plain var. was not changed --> 
<#list ["loop"] as x> 
7. ${x} <#-- now the loop var. hides the plain var. --> 
<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here --> 
8. ${x} <#-- it still hides the plain var. --> 
</#list> 
9. ${x} <#-- the new value of plain var. --> 


<#macro test> 
2. ${x} <#-- we still see the plain var. here --> 
<#local x = "local"> 
3. ${x} <#-- now the local var. hides it --> 
<#list ["loop"] as x> 
4. ${x} <#-- now the loop var. hides the local var. --> 
</#list> 
5. ${x} <#-- now we see the local var. again --> 
</#macro> 
结果: 
1. plain 
2. plain 
3. local 
4. loop 
5. local 
6. plain 
7. loop 
8. loop 
9. plain2 


内部循环变量隐藏同名的外部循环变量,例如: 


<#list ["loop 1"] as x> 
${x} 
<#list ["loop 2"] as x> 
${x} 
<#list ["loop 3"] as x> 
${x} 
</#list> 
${x} 
</#list> 
${x} 
</#list> 
结果: 
loop 1 
loop 2 
loop 3 
loop 2 
loop 1 


模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe: 


<#assign user = "Joe Hider"> 
${user} <#-- prints: Joe Hider --> 
${.globals.user} <#-- prints: Big Joe --> 
命名(namespaces)空间-通常情况,只使用一个命名空间,称为主命名空间(main namespace),但你是不会意识到这些的;为了创建可重用的macro、transforms或其它变量的集合(通常称库),必须使用多命名空间,为了防止同名冲突。 


首先创建一个库(假设保存在lib/my_test.ftl中): 


<#macro copyright date> 
<p>Copyright (C) ${date} Julia Smith. All rights reserved. 
<br>Email: ${mail}</p> 
</#macro> 
<#assign mail = "jsmith@acme.com"> 
使用import指令导入库到模板中,Freemarker会为导入的库创建新的命名空间,并可以通过import指令中指定的hash(散列)变量访问库中的变量: 


<#import "/lib/my_test.ftl" as my> 
<#assign mail="fred@acme.com"> 
<@my.copyright date="1999-2002"/> 
${my.mail} 
${mail} 
结果: 


<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved. 
<br>Email: jsmith@acme.com</p> 
jsmith@acme.com 
fred@acme.com 
上面的例子中使用的两个同名变量并没有冲突,因为它们位于不同的命名空间 


可以使用assign指令在导入的命名空间中创建或替代变量: 


<#import "/lib/my_test.ftl" as my> 
${my.mail} 
<#assign mail="jsmith@other.com" in my> 
${my.mail} 
结果: 
jsmith@acme.com 
jsmith@other.com 


数据模型中的变量任何地方都可见,也包括不同的命名空间,下面修改了刚才创建的库: 


<#macro copyright date> 
<p>Copyright (C) ${date} ${user}. All rights reserved.</p> 
</#macro> 
<#assign mail = "${user}@acme.com"> 
假设数据模型中的user变量的值是Fred: 


<#import "/lib/my_test.ftl" as my> 
<@my.copyright date="1999-2002"/> 
${my.mail} 
结果: 
<p>Copyright (C) 1999-2002 Fred. All rights reserved.</p> 
Fred@acme.com 

FreeMarker模板引擎:创建自定义分页标签宏指南 本文还有配套的精品资源,点击获取 简介:FreeMarker是一个用于生成动态文档的模板引擎,在Java Web开发中常用。本文介绍了如何在FreeMarker中实现自定义分页标签宏,以便更有效地管理和展示大量数据。我们首先定义了一个名为 paging 的宏,接收当前页数、总页数、每页记录数等参数,并在模板中调用。宏内部通过HTML和FreeMarker指令创... 阅读详情

相关推荐

Allegro PCB设计小技巧:如何用Shift键快速平移复制走线和过孔?

本文深入解析了Allegro PCB设计中利用Shift键进行平移复制的核心技巧。通过对比传统复制粘贴流程,详细演示了如何高效、精准地批量复制走线和过孔,尤其适用于创建等间距电源总线、过孔阵列等场景,能显著提升PCB设计效率与准确性。

pz89012345的博客 554

FreeMarker学习(二)

用户定义指令-使用@符合来调用 有两种不同的类型:Macro(宏)和transform(传递器),Macro是在模板中使用macro指令定义,而transform是在模板外由程序定义(基本上都是基于Java的),这里通过Macro来介绍自定义指令。 例一: Hello Joe! 使用: 或 结果:Hello Joe! 参数-在macro指令中可以在宏变量之后定义参...

mht13895099346的专栏 292

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 185

FreeMaker 宏(macro)与自定义指令

宏(macro)是自定义指令(directive)的一种方法,使用宏能实现在模版级别自定义指令,另一种自定义指令的方式是再Java级别实现指令。 宏的概念 宏是对一段模版片段的定义,在定义宏后,可通过用户自定义指令的语法<@ macro_name />引用,宏本身通过<#macro></#macro>预定义指令定义。 <#macro hello> ...

扶摇升的IT博客 681

matlab/simulink saw谐振器仿真,基于Matlab的SAW模态耦合模型的仿真研究

第32卷 第 4 期Vol. 32 No. 4重 庆 理 工 大 学 学 报 (自然科学)Journal of Chongqing University of Technology( Natural Science)2 0 1 8年 4 月Apr. 2018doi : 10.3969/j . issn. 1674-8425(z). 2018.04.002本文引用格式 :李志鹏,马龙祥,孟旭,等•基...

weixin_36192634的博客 1385

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 618

freeMarker 中宏<#macro >解析

用户定义指令-使用@符合来调用          有两种不同的类型:Macro(宏)和transform(传递器),Macro是在模板中使用macro指令定义,而transform是在模板外由程序定义(基本上都是基于Java的),这里通过Macro来介绍自定义指令。

bug_404的博客 3202

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在状态所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,,两方都是一对一的关系。复用功能。

Car12 706

freemarker的<#macro>标签理解

背景 第一次使用macro标签的时候,看官网介绍看了半天,云里雾里的,说一下理解后的意思。 相关链接 官网地址:http://freemarker.foofun.cn/ref_directive_macro.html#autoid_104 原文介绍如下: 通俗理解后 freemarker允许模版嵌套,a模版调用b模版,可以理解为java类,<#macro>标签就是其中的方法,name就是方法名,param就是定义的方法参数。 例子 a模版: common.ftl &lt.

Mint6的博客 2166

在 SAP S/4HANA 的 BP 事务里做保存前校验:BDT 事件、BUPA_FURTHER_CHECKS 与 CVI 扩展 BAdI 一次讲透

SAP BP事务保存前校验机制解析 摘要:本文系统梳理了SAP BP事务保存前的校验机制,揭示了三种关键校验点的差异与适用场景: BDT框架DCHCK事件:最靠近UI层,适合屏幕字段级校验,但API调用时可能失效 Classic BAdI BUPA_FURTHER_CHECKS:全局拦截点,可阻断整个BP保存,适合核心业务规则 CVI扩展校验:仅管控供应商/客户段落,需注意可能产生"BP已保存但段落未保存"的情况 文章通过真实案例(如黑名单校验、付款冻结等)展示了各校验点的最佳实践,并特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab程序)

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab完整程序)

前程算法屋的博客 2180

Freemaker <#macro>(宏)的使用

关键字: 的使用 来源网址:http://jayjunyu.javaeye.com/blog/215727 用户定义指令-使用@符合来调用 有两种不同的类型:Macro(宏)和transform(传递器),Macro是在模板中使用macro指令定义,而transform是在模板外由程序定义(基本上都是基于Java的),这里通过Macro来介绍自定义指令。 例一: Hel

涂作权的博客 3338

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

FreeMarker 进阶:自定义指令与宏全面解析

/ 收参 - 处理 - 输出@Override@Override</#macro>自定义指令:适合复杂逻辑扩展,参数灵活,适合 Java 层处理。宏:模板层复用利器,结构化展示,语法简洁。两者结合:打造高复用、高扩展模板体系。集成主流技术栈:易于与 Spring、微服务等架构融合。底层机制:AST、反射、缓冲等技术兼顾性能与维护性。速记口诀:收参-处理-输出,宏指令巧结合,逻辑模板两分层。

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

FreeMarker 进阶用法:自定义指令与宏全面解析

扩展性:通过 Java 实现复杂逻辑,模板调用指令即可复用。解耦:指令与模板内容分离,业务逻辑集中于 Java 层。灵活参数处理:支持多参数、命名参数、返回值自定义。函数式调用:可在模板中像调用函数一样使用。返回值灵活:支持各种 FreeMarker 类型。</#macro>本篇从自定义指令与宏的设计思想入手,详细剖析了 FreeMarker 的高级扩展机制。自定义指令适合处理复杂业务逻辑,参数与返回值灵活。宏更适合模板层的结构化复用,语法简洁但逻辑能力有限。

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

velocity的宏

    velocity中的宏macro的使用当中,由于velocity会将宏加载到tomcat中去,但是如果修改之后再加载的话velocity发现有了相同的宏名称,则不会加载   所以这时候的问题就是,在页面上不会显示修改的内容。           如果要遇到这样的问题的话,如我要修改宏里面的东西,之后刷新页面却发现页面没有变化   上边的原理已经讲清楚了,所以我们只需要将宏的名称修改...

weixin_34144450的博客 145

模板继承体系设计-超越宏

宏是FreeMarker的亮点,在模板组件化方面起了很重要的作用。 在设计[url=http://www.meteortl.org]MeteorTL[/url]时,也借鉴了其这一点。 但在设计宏时,发现其局限性还是非常大,无法优雅的实现装饰器模式。 如: [code="xml"] ${y} back:${x} [/code] 这里的macro相当于一个函数...

梁飞的博客 112

如何利用DBeaver SQL模板循环功能提升数据库操作效率:从入门到精通

DBeaver作为一款功能强大的通用数据库管理工具,不仅支持多种数据库连接,还提供了丰富的SQL编辑功能。其中,SQL模板循环功能是提升数据库操作效率的秘密武器,尤其适合需要重复执行相似SQL任务的场景。本文将详细介绍如何使用这一功能,帮助新手用户快速掌握自动化SQL操作的技巧。 ## DBeaver SQL模板功能简介 DBeaver的SQL模板系统允许用户预先定义包含变量和逻辑结构的SQL

gitblog_00247的博客 925

023_运行时变量和范围

1. 当调用Template.process方法时, 它会在方法内部创建一个Environment对象, 在process返回之前一直使用。该对象存储模板执行时的运行状态信息。除了这些, 它还存储由模板中指令, 如: assign, macro, local或global创建的变量。它不会尝试修改传递给process的数据模型对象, 也不会创建或替换存储在配置中的共享变量。 2. 当你想要读取一个变量时, FreeMarker将会以这种顺序来查找, 直到发现了完全匹配的的变量名称才会停下来: 2.1.

aihiao的专栏 136

freeMark全解

本文摘自:http://talentkep.iteye.com/blog/510756 (1)模板 + 数据模型 = 输出 FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念他们是分工劳动的: 设计者专注于表示——创建HTML文件、图片、Web页面的其它可视化方面; 程序员创建系统,生成设计页面要显示的数据。 经常会遇到的问题是:在Web页面(或

VS_URL的专栏 2051

在生成静态的时候取文章列表的前几条记录

[code="java"] ${arti.title?default("")} [/code]

角落里的世界 186

利用freemarker 静态化网页

1、介绍-FreeMarker是什么      模板引擎:一种基于模板的、用来生成输出文本的通用工具      基于Java的开发包和类库      2、介绍-FreeMarker能做什么      MVC框架中的View层组件      Html页面静态化     代码生成工具     CMS模板引擎   页面栏目动态定制 3、介绍-为什么要用FreeMa

mrdu_somefun的博客 444

linux查看登录服务器的ip历史记录,查看哪个用户登录过服务器 记录 时间 和 ip...

解决:ERROR&colon; Cannot launch Jack server问题重现: Install: /home/dinphy/sm/out/target/product/ido/system/lib/libdl.so java -Xmx3500m -jar /home/ ...巧用freemarker使用Freemarker宏进行可扩展式模块化编程 该文是转载而来,并非我本人所...

weixin_32567865的博客 747

freemarker常见语法大全

总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。点击这里领取Web前端开发经典面试题如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

2401_83817418的博客 2251

FreeMarker自定义指令、方法与宏:源码解析与实战应用

Override速记口诀:收参 - 处理 - 输出@Override速记口诀:收参 - 类型转换 - 业务处理 - 返回结果</#macro>fill:#333;客户端FreeMarkerJava扩展发起渲染请求(含参数)调用自定义指令/方法返回处理结果输出渲染内容客户端FreeMarkerJava扩展自定义指令/方法/宏是FreeMarker扩展的三大支柱,分别适合不同复杂度的业务场景。强调解耦、扩展、复用,推动模板与业务逻辑分离。

IT技术学习与工作笔记分享 747
上一篇: Nginx配置文件说明
下一篇: Freemarker 实现 继承、覆盖
趙大叔
博客等级 码龄17年 34粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趙大叔

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值