FreeMarker基础教程 联系客服

发布时间 : 星期日 文章FreeMarker基础教程更新完毕开始阅读530b659bd4d8d15abe234e20

上面的代码将导入/lib/common.ftl模板文件中的所有变量,交将这些变量放置在一个名为com的Map对象中.

4.6 noparse指令

noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下:

<#noparse>...

看如下的例子: <#noparse>

<#list books as book>

${book.name}作者:${book.author} 输出如下:

<#list books as book>

${book.name}作者:${book.author}

4.7 escape , noescape指令

escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下: <#escape identifier as expression>... <#noescape>...

看如下的代码:

<#escape x as x?html> First name:${firstName} Last name:${lastName} Maiden name:${maidenName}

上面的代码等同于:

First name:${firstName?html} Last name:${lastName?html}

Maiden name:${maidenName?html}

escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子: <#escape x as x?html>

Customer Name:${customerName} Items to ship;

<#escape x as itemCodeToNameMap[x]> ${itemCode1} ${itemCode2} ${itemCode3} ${itemCode4}

上面的代码类似于:

Customer Name:${customerName?html} Items to ship;

${itemCodeToNameMap[itemCode1]?html} ${itemCodeToNameMap[itemCode2]?html} ${itemCodeToNameMap[itemCode3]?html} ${itemCodeToNameMap[itemCode4]?html}

对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式.

4.8 assign指令

assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,assign指令的用法有多种,包含创建或替换一个顶层变量, 或者创建或替换多个变量等,它的最简单的语法如下:<#assign name=value [in

namespacehash]>,这个用法用于指定一个名为name的变量,该变量的值为value,此外,FreeMarker允许在使用 assign指令里增加in子句,in子句用于将创建的name变量放入namespacehash命名空间中.

assign指令还有如下用法:<#assign name1=value1 name2=value2 ...

nameN=valueN [in namespacehash]>,这个语法可以同时创建或替换多个顶层变量,此外,还有一种复杂的用法,如果需要创建或替换的变量值是一个复杂的表达式,则可以使用如下语法格式:<#assign name [in namespacehash]>capture this,在这个语法中,是指将assign指令的内容赋值给name变量.如下例子:

<#assign x>

<#list [\星期一\星期二\星期三\星期四\星期五\星期六\星期天\${n}

${x}

上面的代码将产生如下输出:星期一 星期二 星期三 星期四 星期五 星期六 星期天

虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,如下例子:<#assign x>Hello ${user}!,以上代码改为如下写法更合适:<#assign x=\

4.9 setting指令

该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个: locale:该选项指定该模板所用的国家/语言选项 number_format:指定格式化输出数字的格式

boolean_format:指定两个布尔值的语法格式,默认值是true,false

date_format,time_format,datetime_format:指定格式化输出日期的格式 time_zone:设置格式化输出日期时所使用的时区

4.10 macro , nested , return指令

macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下: <#macro name param1 param2 ... paramN> ...

<#nested loopvar1, loopvar2, ..., loopvarN> ...

<#return> ...

在上面的格式片段中,包含了如下几个部分:

name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数

paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值

nested指令:nested标签输出使用自定义指令时的中间部分

nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板

return指令:该指令可用于随时结束该自定义指令.

看如下的例子:

<#macro book> //定义一个自定义指令 j2ee

<@book /> //使用刚才定义的指令 上面的代码输出结果为:j2ee

在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码:

<#macro book booklist> //定义一个自定义指令booklist是参数 <#list booklist as book> ${book}

<@book booklist=[\使用刚刚定义的指令

上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee

不仅如此,还可以在自定义指令时使用nested指令来输出自定义指令的中间部分,看如下例子:

<#macro page title>

FreeMarker示例页面 - ${title?html}

${title?html}

<#nested> //用于引入用户自定义指令的标签体

上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令: <#import \as com> //假设上面的模板页面名为common.ftl,导入页面

<@com.page title=\

  • spring
  • j2ee