Freemarker宏和函数的用法和区别

1.宏(macro)

写法:
<#macro page url page maskSize=5>
    <#if (number == pages)>

<li><a href="javascript:void(0);">下一页</a></li>

<li><a href="javascript:void(0);">尾页</a></li>

<#else>

<li><a href="${buildPageUrl(url2,page.pageNum+1,page)}">(注:这个地方可以直接调用宏所在的FTL中的函数)下一页</a></li>

<li><a href="${buildPageUrl(url2,page.pages,page)}">尾页</a></li>

</#if>

</#macro>

引入方式: <#import  "/user/common/macro/page.ftl" as pg >
调用方式:<@pg.page url="${queryUrl}" page=page  maskSize=10 />   
  
 
2.函数(function)
写法:
 <#function buildPageUrl url pageNum data>

<#assign pageUrl = "${url}?pageNum=${pageNum}&pageSize=${data.pageSize}">

<#return pageUrl/>

</#function>
引入方式:<#include "/user/common/macro/date.ftl"/>
调用方式: ${buildPageUrl(url2,page.pageNum+1,page)}

3.不同的地方
   
  <#return/> 的用途、引入方式、 调用方式 都不同。
 
   宏:可以提前返回,比如<#return/> 
   但是不能<#return 1>, A macro cannot return a value

宏,主要作用是,拼接内容,把宏内部的字符串展示出来,return返回值没有意义。

函数:与宏的调用方式不同,直接 ${buildPageUrl(url2,page.pageNum+1,page)}执行函数。
  返回值才是最关键的结果,不是为了显示函数内部的字符串内容。

---------------

补充一点,在宏所在的ftl中,同时定义了函数,宏中可以直接使用这个函数。

时间: 2024-10-27 11:15:50

Freemarker宏和函数的用法和区别的相关文章

clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别

1. clock_gettime( ) 提供了纳秒的精确度 int clock_gettime(clockid_t clk_id, struct timespect *tp); clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下三种比较常用: CLOCK_REALTIME, 系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变 CCLOCK_MONOTONIC:从系统启

JavaScript中的bind,call和apply函数的用法和区别

一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式,总结下来,有以下4种 1. 方法调用 2. 正常函数调用 3. 构造器函数调用 4. apply/call 调用 要明白的第2个概念, JavaScript 中的函数,无论是上面哪种函数调用方式,除了你函数声明时定义的形参外,还会自动给函数添加两个形参,分别是this 和 arguments 要明白

宏和函数的区别

先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传

oracle中delete drop truncate的用法和区别

数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢? 比如当数据库空间爆满,已经增长到存储空间单个存储文件的最大值32G.你需要通过一些办法释放掉表空间或者扩容表空间来解决问题. 一般当系统中大量使用分区表,而针对分区表清除数据,是不会释放表空间的,必须把分区drop掉,才会释放空间. 下面我们具体了解一下这三个命令: 一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在r

ref和out的用法和区别。

关于ref和out的用法和区别在网上已经有很多的解释,这里只不过是写下对于我而说比较容易理解的解释. ref和out都可以用来在函数中返回数据,类似于c++中指针. 参数 Ref Out 是否一定需要初始化 是 否 机制 传递参数的地址,例如声明了int i=0; i是存储在内存堆的一个地址0x000001那么传递的便是这个地址0x000001 不需要初始化,也就是没有为定义的变量开辟存储空间.在函数体中定义,故只是返回值.(如果之前有定义,则在函数体中清空后再赋值) 一般用途 调用的方法修改传

宏、函数和内联

先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的. 3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间. 4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的

Java中super和this的用法和区别

许多同学在学习Java时分不清楚this和super的用法和区别,今天偶然发现一片加精的博文,看完内容准备自己也写下来积累一下 1.如果想在子类的构造方法中调用父类的构造方法,必须在子类的构造方法中使用super();且必须将其放在首句 public class L1106Demo06 { public static void main(String[] args) { lake M=new lake(); } } /*super方法的用法1. * 在子类的构造方法中若果要想要调用父类的构造方法

oninput,onpropertychange,onchange的用法和区别

1.前言 由于工作需要,需实现一个类似于微博输入框的功能,在用户动态输入文字的时候,修改提示"您还可以输入XX字".如下图所示: 因此,稍微研究了一下oninput,onpropertychange,onchange的区别和用法,以及onpropertychange在ie浏览器下的一个bug. 2.oninput,onpropertychange,onchange的用法 l          onchange触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标事件激发的

freemarker宏的使用有默认值的参数必须排在后面

<#--注意参数1必须放在参数2前面--> <#macro 函数名 参数1 参数2="某值"> ssss</#macro> freemarker宏的使用有默认值的参数必须排在后面,布布扣,bubuko.com