`
zzc1684
  • 浏览: 1223060 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

freemarker之模板开发(其它之自定义指令)

阅读更多

freemarker之模板开发(其它之自定义指令)

----------

自定义指令可以使用macro指令来定义,这是模板设计者所关心的内容。Java程序员若不想在模板中实现自定义指令,而是在java语言中实现指令的定义,这时可以使用:freemarker.template.TemplateDirectiveModel类来扩展。

 

宏是有一个变量名的模板片段。你可以在模板中使用宏作为自定义指令,这样就能进行重复性的工作。

如例:

Html代码  收藏代码
  1. <#macro greet>  
  2.     <font size="+2">Hello Joe!</font>  
  3. </#macro>  

macro指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet的变量,在<#macro greet>和</#macro>之间的内容(称为宏定义体)当使用它作为指令时将会被执行。你可以在FTL标记中通过@代替#来使用自定义指令使用变量名作为指令名。而且,自定义指令的结束标记也是需要的,如:<@greet></@greet>

因为<anything>,/anything>和<anything/>是相同的,你也可以使用:<@greet/>

宏能做的事情还有很多,因为在<#macro...>和</#macro>之间的东西是模板片段,也就是说它可以包含插值(${..})和FTL标签(如:<#if...>...</#if>)。

注意:程序员通常将使用<@...>,这称为宏调用

 

参数

在macro指令中,宏名称的后面位置是用来定义变量的。如例: 

Html代码  收藏代码
  1. <#macro greet person>  
  2.     <font size="+2">Hello ${person}!</font>  
  3. </#macro>  

那么就可以这样来使用这个宏:

Html代码  收藏代码
  1. <@greet person="Fred"/>  

使用预定义指令时,参数的值(=号后边的值)可以是FTL表达式。这样,不像 HTML,"Fred"的引号就可以不用要了。<@greet person=Fred/>也意味着使用变量的值Fred作为person参数,而不是字符串"Fred"。当然参数值并不一定是字符串类型,也可 以是数字,布尔值,哈希表,序列等...也可以在=号左边使用复杂表达式(比如:someParam=(price+50)*1.25)

自定义指令可以有多个参数,如:  

Html代码  收藏代码
  1. <#macro greet person color>  
  2.     <font size="+2" color="${color}">Hello ${persion}!</font>  
  3. </#macro>  

那么,这个宏就可以这样来使用:

Html代码  收藏代码
  1. <@greet person="Fred" color="black"/>  

同时也必须给出在宏中定义所有参数的值。如果你尝试<@greet person="Fred"/>时也会发生错误,因为忘记指定color的值了。 

根据FTL表达式规则,明白下面这一点是至关重要的,someParam=foo和 someParam="${foo}"是不同的。第一种情况,是把变量foo的值作为参数的值来使用。第二种情况则是使用插值形式的字符串,那么参数值就 是字符串了,这个时候,foo的值呈现为文本,而不管foo是什么类型的

宏参数的另外一个重要的方面是它们是局部变量。

 

嵌套内容

自定义指令可以嵌套内容,和预定义指令相似。如: 

Html代码  收藏代码
  1. <#macro border>  
  2.     <table border=4 cellspacing=0 cellpadding=4><tr><td>  
  3.         <#nested>  
  4.     </td></tr></table>  
  5. </#macro>  

注:<#nested>指令执行位于开始和结束标记指令之间的模板代码段。如果这样写:

Html代码  收藏代码
  1. <@border>The bordered text</@border>  

那么就会输出:

Html代码  收藏代码
  1. <table border=4 cellspacing=0 cellpadding=4><tr><td>  
  2.     The bordered text  
  3. </td></tr></table>  

如果不使用nested指令,那么嵌套的内容就不会被执行,前面的例子如果这样写:

Html代码  收藏代码
  1. <@greet person="Joe">  
  2.     Anything.  
  3. </@greet>  

FreeMarker不会把它视为错误,只是打印:

Html代码  收藏代码
  1. <font size="+2">Hello Joe!</font>  

嵌套的内容被忽略了,因为greet宏没有使用nested指令。

 

宏和循环变量

像list这样的预定义指令可以使用循环变量,如例:

Html代码  收藏代码
  1. <#macro do_thrice>  
  2.     <#nested 1>  
  3.     <#nested 2>  
  4.     <#nested 3>  
  5. </#macro>  

用户自定义指令,使用";"代替"as"

Html代码  收藏代码
  1. <@do_thrice ; x>  
  2.     ${x} Anything.  
  3. </@do_thrice>  

将会输出:

1 Anything.

2 Anything.

3 Anything.

nested指令(当然参数可以是任意的表达式)的参数,循环变量的名称是在自定义指令的开始标记(<@...>)的参数后面通过分号确定的。        

分享到:
评论

相关推荐

    freemarker 自定义freeMarker标签

    这通常是通过`Configuration`对象的`setSharedVariable`方法完成的,将你的自定义指令类实例绑定到一个特定的名字,这个名字就是你在模板中使用的标签名。 3. 使用自定义标签:在模板文件中,你可以像使用内置标签...

    Freemarker 自定义标签 简单案例

    在提供的"TestFreemarkerDiy"示例中,可能包含了一个简单的自定义标签实现以及一个演示如何使用该标签的Freemarker模板文件。通过分析这个示例,我们可以学习如何在实际项目中应用自定义标签,以提高模板的可维护性...

    freemarker格式化缩进文本或include指令

    开发者可以通过自定义指令和利用开源社区的工具,来优化FreeMarker模板的使用,提高工作效率。对于`FormatDirective.java`这样的代码,我们可以通过分析源码,了解它是如何实现文本格式化的,也可以将其作为参考,为...

    freemarker java模板技术 很详细的注释

    - **分离视图和逻辑**: Freemarker模板与Java代码分离,使得开发人员可以专注于业务逻辑,而设计师可以专注于页面设计。 - **高性能**: Freemarker编译模板为高效的Java代码,执行效率高。 - **灵活性**: 支持...

    FreeMarker模板开发手册-用于代码生成器.pdf

    在实际使用中,FreeMarker允许开发者定义自定义的指令和宏,以扩展其功能,适应各种复杂的场景。同时,它也支持国际化(i18n)和本地化(l10n),便于创建多语言的应用。通过与Spring、Struts等框架集成,FreeMarker...

    freemarker模板

    通过阅读源码,我们可以学习到FreeMarker如何解析模板,如何处理变量和表达式,以及如何执行自定义指令和方法。 **最佳实践** 1. **模板设计**: 模板应尽可能保持简洁,逻辑处理尽量放在后台代码中,模板只负责...

    myeclipse freemarker编辑器模板插件及配置说明

    - 如何自定义模板:用户可以通过设置模板变量和指令来自定义代码模板,提高开发效率。 - 错误和警告的处理:Freemarker编辑器会实时检查模板语法,提供错误和警告提示,帮助开发者及时定位问题。 在MyEclipse中配置...

    基于Freemarker模板的代码生成器前台页面模板文件

    Freemarker模板中的`&lt;#list&gt;`指令用于遍历数据集合,`&lt;#if&gt;`、`&lt;#else&gt;`则用于条件判断,而`&lt;@include&gt;`可以包含其他公用部分的模板。 2. **EditPage.ftl**:编辑页面模板,用于展示和修改已有数据。通常会包含表单...

    freemarker模板使用

    在实际项目中,开发人员可以根据需求创建定制的Freemarker模板,比如用于生成邮件、报表或动态页面。结合提供的"freemarker"压缩包,你可以进一步学习和实践这些概念,通过创建和测试模板来提升对Freemarker的理解和...

    Struts2与FreeMarker模板

    然后在FreeMarker模板中,可以通过`#assign`指令将模型属性赋值给模板变量,并使用`#foreach`循环和条件判断等指令来渲染页面。例如: ```ftl &lt;title&gt;Struts2 & FreeMarker Demo ${message} ``` #### ...

    FreeMarker导出模板,以及基本代码

    - **数据模型(Data Model)**:数据模型是Java对象集合,它提供给FreeMarker模板用来生成输出。这些对象可以是简单的Java类型,也可以是复杂的业务对象。 - **配置(Configuration)**:配置对象负责管理...

    Java模板引擎之FreeMarker

    开发者可以将这些对象绑定到FreeMarker模板中,通过 `${}` 符号来访问它们。例如,如果你有一个名为`user`的对象,那么`${user.email}`就会在模板中显示用户的电子邮件地址。 **模板配置** 在使用FreeMarker之前,...

    FreeMarker指令学习

    FreeMarker是一个强大的、开源的模板引擎,主要用于生成动态HTML、XML或其他任何文本格式的输出。在Web开发中,它常被用作Java服务器页面(JSP)的替代品,允许开发者将逻辑与呈现分离,提高代码的可读性和可维护性...

    基于FREEMARKER模板的数据采集系统

    标题中的“基于FREEMARKER模板的数据采集系统”是一个涉及到Web开发和数据处理的项目。FreeMarker是一个开源模板引擎,主要用于生成动态HTML或其他类型的文本,如XML、PDF等。在数据采集系统中,它扮演着将数据模型...

    eclipse的freemarker插件

    总的来说,"eclipse的freemarker插件"是Eclipse开发环境中不可或缺的工具之一,它极大地提升了Freemarker模板开发的便捷性和专业性,使得开发者能够更加专注于业务逻辑,而非模板语法的细节。如果你在Eclipse中处理...

    Freemarker模版开发指南

    本指南将深入探讨Freemarker模板的开发,帮助你掌握其主要特性和用法。 1. **模板语法** Freemarker的模板语言基于简单的文本文件,使用特定的指令和表达式。例如,`&lt;#if&gt;`用于条件判断,`&lt;#foreach&gt;`用于循环,`$...

    Freemarker利用模板生成word的使用(java生成word)

    Freemarker模板是由HTML或XML格式的文本组成,其中包含了特殊的指令(如${}和[])来表示变量和控制结构。这些指令会被Freemarker引擎解析并替换为实际的值,生成最终的输出。 要使用Freemarker生成Word文档,你需要...

    eclipse中FreeMarkerIDE插件

    总之,Eclipse中的FreeMarkerIDE插件为FreeMarker模板的开发和维护提供了便利,它通过强大的编辑和调试功能,让开发者能够更专注于业务逻辑,而不是模板语法的细节。对于从事Web开发,尤其是Java Web开发的程序员来...

    FreeMarker

    1. **变量与表达式**:在FreeMarker模板中, `${variable}` 用于表示变量,它会从数据模型中查找对应的值并输出。表达式支持算术运算、比较运算和逻辑运算,例如 `${a + b}`、`${c &gt; d}` 和 `${e && f}`。 2. **...

Global site tag (gtag.js) - Google Analytics