FreeMarker

(一)

http://blog.sina.com.cn/s/blog_64c505480100sw4j.html

FreeMarker (一)

(2011-08-16 16:28:53)
标签:

杂谈

分类: 学习

1、 模板+ 数据模型= 输出

2、 MVC模式:Model-View-Controller的缩写,中文翻译为"模型-视图-控制器"。

3、 哈希表通过可查找的名称来访问存储的其他空间

4、 用数组的方括号方式来访问一个序列的子变量:animals[0].name;whatnot.fruits[1],索引通常从零开始。

5、 标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。

6、 ${…}:FreeMarker将会输出真实的值来替换花括号内的表达式。

FTL tags标签(FreeMarker 模板的语言标签):这些标签的使用一般以符号#开头。(用户自定义的FTL标签使用@符号来代替#)。

Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#--和-->来分隔。

directives指令就是所指的FTL标签。这指令在HTML的标签(如<table>和</table>)元素(如table元素)中的关系是相同的

7、 使用if指令可以有条件地跳过模板的一部分,

 

我们尊敬的领导是if条件中那唯一的user变量值,当它和“Big Joe”相同时才显示出来。当condition的判断结果为false(布尔值)时,在<#ifcondition>和</#if>标签之间的内容将会被略过。

8、 使用<#else>标签可以指定当条件为假时程序可以执行的内容。  

9、 list指令的一般格式为:<#list sequence asloopVariable>repeatThis</#list>

            sequence:序列;repeatThis:在给定的sequence遍历时的每项中重复,从第一项开始,一个接着一个。

10、include指令:插入其他文件的内容到当前的模板中。 

   Include里面包含的是一个网址,显示的是网址里面的全部内容!

11、处理不存在变量

 

通过放置??在变量名后面来询问FreeMarker一个变量是否存在。将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段

12、数值

不需要存储的数值也可以称之为数值,例如:100 

当模板被执行时,计算的临时结果也称为数值,比如20,120(它会打印120)

 

14、支持的类型有:标量:字符串;数字;布尔值;日期

容器: 哈希表;序列;集

子程序:方法和函数;用户自定义指令

其它/很少使用:节点

15、方法和函数:

数据模型中放置了一个方法变量avg,求平均值:

16、用户自定义指令:

      假设现在有一个变量,box,它的值是用户自定义的指令,用来打印一些特定的HTML信息,这个指令定义了一个标题和其中的信息。    

17、如果能够实现,请用自定义指令而不用函数/方法

①、输出(返回值)的是标记(HTML,XML等)。主要原因是函数的返回结果可以自动进行XML转义(这是因为${…}的特性),而用户自定义指令的输出则不是(这是因为<@...>的特性所致,它的输出假定为是标记,因此就不再转义)。

②、副作用是重要的,而不是返回值。例如一个指令的目的是往服务器日志中添加一个条目。(事实上你不能得到自定义指令的返回值,但有些反馈的类型是有可能设置非本地变量的)

③、会进行流程的控制(就像listif指令那样),但是不能在函数/方法上这么做。

18、节点

   节点的主要作用是拓扑信息,还可以存储节点名称,类型(字符串),命名空间(字符串)。

19、模板的总体结构(FTL是区分大小写的)

    ①、Text文本:文本会照着原样来输出。

②、Interpolation插值:这部分的输出会被计算的值来替换。插值由${}所分隔

③、FTLtags标签:与HTML标签很相似,但它们却是给FreeMarker的指示且不会打印在输出内容中。

④、Comments注释:注释和HTML的注释很相似,但是由<#---->来隔的。

  注:FTL是区分大小写的,插值仅仅可以在文本中间使用(也可以在字符串表达式中)。FTL标签不可以在其他FTL标签和插值中使用。注释可以放在FTL标签和插值中间。

20、指令的调用:

     如调用list指令:在语法上使用了两个标签:<#list animals asbeing>和</#list>。

对于用户自定义的指令使用@来代替#。例如:<@mydirectiveparameters>...</@mydirective>

21、备忘单

㈠、直接指定值

①字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 r"C:\raw\string"

②数字:123.45

③布尔值:true, false

④序列:["foo", "bar",123.45], 1..100

⑤哈希表:{"name":"green mouse","price":150}

㈡、检索变量

①顶层变量:user

②从哈希表中检索数据:user.name, user[“name”]

③从序列中检索:products[5]

④特殊变量:.main

㈢、字符串操作

①插值(或连接):"Hello ${user}!"(或"Free" + "Marker"

②获取一个字符:name[0]

㈣、序列操作

①连接:users + ["guest"]

②序列切分:products[10..19] products[5..]

③哈希表操作

④连接:passwords +{"joe":"secret42"}

㈤、算数计算: (x * 1.5 + 10) / 2 - y % 100

㈥、比较:x == y, x != y, x < y, x > y, x >= y, x <= y, x &lt; y, 等等

㈦、逻辑操作:!registered&& (firstVisit ||fromEurope)

㈧、内建函数:name?upper_case

㈨、方法调用:repeat("What", 3)

㈩、处理不存在的值

①默认值:name!"unknown" 或者(user.name)!"unknown"或者name! 或者 (user.name)!

②检测不存在的值:name?? 或者(user.name)??  

22、字符串

    如果文本本身包含用于字符引用的引号(双引号”或单引号’)或反斜杠时,应该在它们的前面再加一个反斜杠,这就是转义。   

23、FreeMarker所支持的所有的转义符序列  

一种特殊的字符串就是原生字符串。在原生字符串中,反斜杠和${没有特殊的含义,它们被视为普通的字符。为了表明字符串是原生字符串,在开始的引号或单引号之前放置字母r。

24、序列

   指定一个文字的序列,使用逗号来遍历子变量,然后把整个列表放到方括号内。

 输出:

25、哈希表

   在模板中指定一个哈希表,就可以遍历用逗号来分隔的“键/值”对,把列表放到花括号内。

   例如:{"name":"green mouse","price":150}。

FreeMarker (二)

(2011-08-18 17:20:47)
标签:

杂谈

 

26、顶层变量

   变量名不能以数字开头。表达式中变量名可以包含字母(也可以是非拉丁文),数字,下划线(_),美元符号($),at符号(@)和哈希表(#)。

27、从哈希表中检索数据

同含义:book.author.name;book["author"].name;book.author.["name"];book["author"]["name"]。

28、从序列中检索数据

只能用方括号语法形式,方括号内的表达式必须是一个数字而不是字符串。animals[0].name。

29、特殊变量

按照如下语法形式来进行:.variable_name

30、插值

①、${“Hello ${user}!”

②、${“Hello “+user+”!”}

31、获取一个字符

内建函数string 。例如:user?string[0]。

32、序列操作,连接

    <#list ["Joe", "Fred"] + ["Julia", "Kate"] asuser>

- ${user}

</#list>

33、序列的切分

   如seq存储列"a","b", "c", "d", "e", "f",表达式seq[1..4]是"b", "c", "d", "e"的序列

34、算数计算

+号的一端是字符串,另外一端是数字,那么数字就会自动转换为字符串类型。

        例如:${3 + "5"}将会输出35

只想获取计算结果的整数部分,这可以使用内建函数int来解决。${(5/2)?int}输出:2。

35、比较

表达式放括号内:<#if (x >y)>,或在比较处使用&gt;&lt;:<#ifx &gt;y>。可用lt代<,lte代<=,gt代>,gte代>=,FTL也支持\lt,\lte,\gt和\gte,和不带反斜杠的一样。

36、内建函数

内建函数以?形式提供变量的不同形式或者其他信息。例如:user?upper_case

①、字符串使用的内建函数:

html:字符串中所有的特殊HTML字符都需要用实体引用来代替(比如<代替&lt;)

cap_first:字符串的第一个字母变为大写形式

lower_case:字符串的小写形式

upper_case:字符串的大写形式

trim:去掉字符串首尾的空格

②、序列使用的内建函数:

size:序列中元素的个数

③、数字使用的内建函数:

int:数字的整数部分(比如-1.9?int就是-1)

37、方法的调用

    ${repeat("What",3)}   输出为:WhatWhatWhat

38、默认值:

     ${mouse!"No mouse."}

<#assignmouse="Jerry">

${mouse!"No mouse."}

输出为:No mouse.

Jerry

39、检测不存在的值

       unsafe_expr??或(unsafe_expr)??

40、操作符的优先级

41、插值仅仅在2种位置使用:文本区(如<h1>Hello${name}!</h1>)和字符串表达式(如<#include"/footer/${company}.html">)

   插值表达式的结果必须是字符串,数字或日期类型的。

42、自定义指令

可以使用macro指令来定义,也可用扩展:freemarker.template..TemplateDirectiveModel类来扩展。

一般使用<@...>称为宏调用。

43、内容嵌套

       <#if ...>nestedcontent</#if>

44、模板中定义变量

    ①、简单变量:它能从模板中的任何位置来访问,或者从使用include指令引入的模板访问。可以使用assign或macro指令来创建或替换这些变量。

②、局部变量:它们只能被设置在宏定义体内,而且只在宏内可见。一个局部变量的生存周期只是  宏的调用过程。可以使用local指令在宏定义体内来创建或替换局部变量。

③、循环变量:循环变量是由指令(如list)自动创建的,而且它们只在指令的开始和结束标记内有效。宏的参数是局部变量而不是循环变量。

45、命名空间的生命周期

      

    输出为:

 

46、加在下面这些指令之间的空白会被忽略:macro,function,assign,global,local,ftl,import,但也是仅仅指令之间只有一个空白或FTL注释。

   使用compress指令,和剥离空白相反,这个工作是直接基于生成的输出内容的。

47、替换语法

    在FreeMarker指令和注释中用[和]来代替和。

     例如:①、调用预定义指令:[#listanimals as being]...[/#list]

②、调用用户自定义指令:[@myMacro /]

③、注释:[#-- the comment --]

48、创建配置实例

   首先创建一个freemarker.template.Configuration实例,然后调整位置。

49、创建数据模型

可以使用java.lang和java.util下的类,用户自定义的JavaBeans来构建数据对象。

n 使用java.lang.String来构建字符串。

n 使用java.lang.Number来派生数字。

n 使用java.lang.Boolean来构建布尔值。

n 使用java.util.List或Java数组来构建序列。

n 使用java.util.Map来构建哈希表。

n 使用你自己定义的bean类来构建哈希表,bean中的项和bean的属性对应。

50、标准的输出      

51、数据模型

想从模板访问的任何对象,早晚都要转换为实现了TemplateModel接口的对象。

有一个freemarker.template.TemplateModel粗略的子接口对应每种基本变量类型:

TemplateHashModel对哈希表,TemplateSequenceModel对序列,TemplateNumberModel对数字

52、4种标量

    布尔值,字符串,数字,日期

字符串标量的接口是TemplateScalarModel不是TemplateStringModel。

TemplateDateModel接口有两个方法:是java.util.Date getAsDate()和intgetDateType()。这个接口典型的实现是存储一个java.util.Date对象,加上一个整数来辨别“数据库存储的类型”。这个整数的值必须是TemplateDateModel接口中的常量:DATE,TIME,DATETIME和UNKNOWN。

对要格式化参数使用了内建函数string,比如foo?string("MM/dd/yyyy")

53、哈希表

    ①、TemplateModel get(Stringkey),这个方法根据给定的名称返回子变量,boolean isEmpty()这个方法表明哈希表是否含有子变量。

②、get方法当在给定的名称没有找到子变量时返回null。

54、序列

    实现TemplateSequenceModel。两法:TemplateModelget(int index)和int size()。

55、集合

实现TemplateCollectionModel。一法:TemplateModelIteratoriterator()。和java.util.Iterator相似,返回TemplateModels,抛出TemplateModelExceptions。

56、方法

实现TemplateMethodModel的模板内。一法:TemplateModel exec(java.util.Listarguments)。

57、指令

Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。

58、提示

    TemplateDirectiveModel对象通常是有状态的。

59、节点变量

节点变量有下列属性,这些都由TemplateNodeModel接口的方法提供。

基本属性:

TemplateSequenceModelgetChildNodes():一个节点有子节点序列。

TemplateNodeModelgetParentNode():一个节点只有一个父节点。

可选属性。如果一个属性在具体的使用中没有意义,那对应的方法应该返回null:

StringgetNodeName():节点名称也是宏的名称,当使用recurse和visit指令时,它用来控制节点。 

StringgetNodeType():在XML中:"element","text","comment"等。如果这些信息可用,就是通过recurse和visit指令来查找节点的默认处理宏。而且,它对其他有具体用途的应用程序也是有用的。

StringgetNamespaceURI():这个节点所属的命名空间。例如,在XML中,这就是元素和属性所属的XML命名空间的URI。信息这个如果可用,就是通过recurse和visit指令来查找存储控制宏的FTL命名空间。

在FTL这里,节点属性的直接使用可以通过内建函数node完成,还有visit和recurse宏。

60、配置

   配置对象是freemarker.template.Configuration的实例,可以通过构造方法来创建它。一个应用程序通常只使用一个共享的Configuration实例

61、共享变量

用setSharedVariable方法向配置实例中添加共享变量。

       它包含下列用户自定义指令(用户自定义指令使用时需要用@来代替#):

 

62、配置信息

   有3层:configuration ; Template ;Environment 。分别是配置,模板,环境。

63、内建模板加载器

在Configuration中可以使用下面方便的方法来建立三种模板加载方法。

64、bean的包装

      freemarker.ext.beans.BeansWrapper是一个对象包装器

65、哈希表键 

66、特殊哈希表键的含义:

"elementName","prefix:elementName":返回元素名为elementName的子节点的序列。

"*":返回所有子元素(直接后继)节点的序列。

"**":返回所有后继节点的序列。这个序列按文档顺序包含元素。

"@attName","@prefix:attrName":作为一个大小为1,包含属性节点的序列的形式,返回元素的属性名attName,如果属性不存在时,作为一个空序列返回(所以来检查属性是否存在,可以使用foo.@attName[0]??,而不是foo.@attName??)。

"@@"或"@*":返回属于父节点的节点的属性序列,这和XPath中的@*是相同。

"@@qname":返回元素的完全限定名(如e:book,和由?node_name返回本地名book形成对比)。

"@@markup":这会以字符串形式返回一个节点的完整XML标记。

"@@nested_markup":这个和"@@markup"相似,但是它返回不包括开放和封闭标记元素的XML标记。对于文档节点,它返回和"@@markup"相同的内容。

"@@text":它返回文本节(所有后继文本节点,而不是直接子节点)点的值,连接成一个单独的字符串。如果节点没有子文本节点,那么返回的是空字符串。

"@@start_tag":返回元素节点开始标记的标记。

"@@end_tag":返回元素节点结束标记的标记

@@attributes_markup:返回元素节点属性的标记,

67、substring取子串  exp?substring(from, toExclusive),

68、cap_first 首字母大写  ${"green mouse"?cap_first}

69、uncap_first 首字母小写

70、capitalize首字母大写   字符串的所有单词都大写


FreeMarker (三)

(2011-08-18 17:23:28)
标签:

杂谈

 

71、chop_linebreak切断换行符 

72、datetimedatetime日期,时间,时间日期

 

73、ends_with结尾 

74、html HTML格式的转义文本

<用&lt替换;

>用&gt替换;

&用&amp替换;

"用&quot替换;

xhtml XHTML格式

字符串作为XHTML格式文本输出,下面这些:

<替换为&lt;

>替换为&gt;

&替换为&amp;

"替换为&quot;

'替换为&#39;  

xml XML格式

字符串作为XML格式文本输出,下面这些:

<替换为&lt;

>替换为&gt;

&替换为&amp;

"替换为&quot;

'替换为&apos;  

75、group 分组

76、index_of索引所在位置   "abcabc"?index_of("bc",2)会返回4。

77、last_index_of最后的索引所在位置  "abcabc"?last_index_of("ab", 2),将会返回0

78、length 字符串长度

79、lower_case 小写形式

80、left_pad 距左边。如果字符串的长度达到指定数值或者比指定的长度还长,那就什么都不做了。

81、right_pad距右边   但是它从末尾开始插入字符而不是从开头

82、contains 包含<#if"piceous"?contains("ice")>Itcontains "ice"</#if>输出It contains"ice"

83、matches 匹配 决定字符串是否精确匹配上模式。返匹配的子串列表。返回值是一个多类型的值

84、number 数字格式   字符串转化为数字格式。

85、replace 替换 在源字符串中,用另一个字符穿来替换原字符串中出现它的部分。它不处理词的边界。

86、rtf 富文本  字符串作为富文本(RTF文本),也就是说,下列字符串: 

87、url URL转义  <#assign x= 'a/b c'>  ${x?url} 输出:a/b c

88、split 分割 它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。

<#list"someMOOtestMOOtext"?split("MOO") as x>

- ${x}

</#list>

输出:- some

- test

- text

89、starts_with开头

字符串以指定的子字符串开头,返回true。如"redhead"?starts_with("red")返回布尔值true

90、string(当被用作是字符串值时) 什也不做,仅仅返回和其内容一致的字符串。

91、trim 修整字符串  掉字符串首尾的空格。

     (${" green mouse "?trim})  输出:(green mouse)

92、upper_case 大写形式  字符串的大写形式。如"GrEeNMoUsE"将会是"GREEN MOUSE"。

93、word_list 词列表

包含字符串词的列表,并按它们在字符串中的顺序出现。词是连续的字符序列,包含任意字符,但是不包括空格<#assignwords = " a bcd, . 1-2-3"?word_list>

<#list words asword>[${word}]</#list>输出:[a][bcd,][.][1-2-3]

94、下面是标记字母的完整列表:

  i:大小写不敏感:不区分同一个字母大小写之间的差异。

  f:仅仅是第一。也就是说,替换/查找等,只是第一次出现的东西。

  r:查找的子串是正则表达式。FreeMarker使用变化的正则表达式,只有你使用Java2平台的1.4版本以后,标记才会起作用。

  m:正则表达式多行模式。在多行模式下,表达式^和$仅仅匹配前后,分别是一行结尾或者是字符串的结束。默认这些表达式仅仅匹配整个字符串的开头和结尾。

  s:启用正则表达式的dotall模式(和Perl的单行模式一样)。在dotall模式下,表达式.匹配任意字符串,包括行结束符。默认这个表达式不匹配行结束符。

  c:在正则表达式中许可空白和注释。

95、c 数字转字符

96、string(当用作是数值类型时)数字转字符串:将一个数字转换成字符串。

97、round,floor,ceiling 数字的舍入处理

   round:返回最近的整数。如果数字以.5结尾,那么它将进位(也就是说向正无穷方向进位)

   floor:返回数字的舍掉小数后的整数(也就是说向服务穷舍弃)

   ceiling:返回数字小数进位后的整数(也就是说向正无穷进位)

98、sort 排序:  以升序方式存储序列并返回。

99、sort_by来排序  返回由给定的哈希表子变量来升序排序的哈希表序列,

100、eval 求值  求一个作为FTL表达式的字符串的值。比如"1+2"?eval返回数字3。

101、has_content 是否有内容

102、interpret 将字符串解释为FTL模板

103、s_... 判断函数族  这些内建函数用来检查变量的类型,然后根据类型返回或

 

104、namespace 命名空间  这个函数返回和宏变量关联的命名空间

105、new 创建TemplateModel实现

106、支持的特殊变量有:

data_model:你可以使用来直接访问数据模型的哈希表。使用global指令定义在这里不可见的的变量。

error(从FM2.3.1版开):这个变量在recover指令体中可以访问,它存储了我们恢复错的错误信息。

globals:你可以使用来访问全局可访问的变量的哈希表:数据模型和由global指令创建的变量。language:返回当前本地设置的语言部分的值。比如.locale是en_US,那么.lang是en。

locale:返回当前本地设置的值。这是一个字符串,比如en_US。

locales:你可以访问本地化变量的哈希表(由local指令创建的变量,还有宏的参数)。

main:你可用来访问主命名空间的哈希表。注意像数据模型中的全局变量通过这个哈希表是不可见的。

namespace:你可用来访问当前命名空间的哈希表。后面的话同上。

node: 用访问者模式处理的当前节点。当你使用FreeMarker XML的Ant任务时,它初始存储根节点。

output_encoding(FM2.3.1版始用):返回当前输出字符集的名称。

template_name:当前模板的名称(从FreeMarker2.3.14版本开始可用)。

url_escaping_charset(从FreeMarker2.3.1版本开始可用):如果存在,它存储了应该用于URL转义的字符集的名称。如果这个变量不存在就意味着没有人指定URL编码应该使用什么样的字符集。

vars:表达式.vars.foo返回和表达式foo相同的变量。出于某些原因你不得不使用方括号语法时这是有用的,因为它只对哈希表子变量有用,所以你需要一个人工的父哈希表。可写.vars["Astrange name!"]。使用和变量varName给定的动态名称访问顶层变量可写.vars[varName]。

version:返回FreeMarker版本号的字符串形式,比如2.2.8。

107、if,else,elseif指令

switch,case,default,break指令

list,break 指令

include指令

import 指令

noparse指令

compress指令

escape,noescape指令

assign 指令

global 指令

local 指令

setting 指令

用户自定义指令(<@...>)

macro,nested,return 指令

function,return 指令

flush 指令

stop 指令

ftl 指令

t,lt,rt 指令

nt 指令

attempt,recover 指令

visit,recurse,fallback 指令



(二)

http://www.blogjava.net/kxbin/articles/366505.html


FreeMarker标签使用 
一、FreeMarker模板文件主要有4个部分组成
  1、文本,直接输出的部分
  2、注释,即<#--...-->格式不会输出
  3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
  4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
  
  FTL指令规则
    FreeMarker有三种FTL标签,这和HTML的标签是完全类似的
     开始标签:<#directivename parameters>
     结束标签:</#directivename>
     空标签: <#directivename parameters />
     实际上,使用标签时前面的#符号也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改为@符号
  
   插值规则
     FreeMarker的插值有如下两种类型
     1、通用插值:${expr}
     2、数字格式化插值:#{expr}或者#{expr;format}
    
    通用插值,有可以分为四种情况
    a、插值结果为字符串值:直接输出表达式结果
    b、插值结果为数字值:根据默认格式(#setting 指令设置)将表达式结果转换成文本输出。可以使用内建的字符串函数格式单个插值,例如
       <#setting number_format = "currency" />
       <#assign price = 42 />
       ${price}
       ${price?string}
       ${price?string.number}
       ${price?string.currency}
       ${price?string.percent}
    
   c、输出值为日期值:根据默认格式(由 #setting 指令设置)将表达式结果转换成文本输出,可以使用内建的字符串函数格式化单个插值,例如
      <#assign lastUpdated = "2009-01-07 15:05"?datetime("yyyy-MM-dd HH:mm") />
      ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")};
      ${lastUpdated?string("EEE,MMM d,yy")};
      ${lastUpdated?string("EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'")};
      ${lastUpdated?string.short};
      ${lastUpdated?string.long};
      ${lastUpdated?String.full};
   d、插值结果为布尔值
      <#assign foo=true />
      ${foo?string("是foo","非foo")}
      
   数字格式化插值
     数字格式化插值可采用#{expr;format}的形式来格式化数字,其中format可以是:
     mX:小数部分最小X位
     MX:小数部分最大X位
     例如:
        <#assign x = 2.582 />
        <#assign y =4 />
        #{x;M2};
        #{y;M2};
        #{x;m1};
        #{y;m1};
        #{x;m1M2};
        #{y:m1M2};
       

二、表达式
    表达式是FreeMarker的核心功能。表达式放置在插值语法(${...})之中时,表面需要输出表达式的值,表达式语法也可以与FreeMarker标签结合,用于控制输出
    
    1、直接指定值
      例如:
      a、字符串
         ${'我的名字是\"yeek\"'};
         ${"我的文件保存在d:\\盘"};
      b、数值
      c、布尔值
      d、日期型
         FreeMarker支持date、time、datetime三种类型,这三种类型的值无法直接指定,通常需要借助字符串的date、time、datetime三个内建函数进行转换才可以
           <#assign test1 = "2009-01-22"?date("yyyy-MM-dd") />;
           <#assign test2 ="16:34:43"?time("HH:mm:ss") />
           <#assign test2 = "2009-01-22 17:23:45"?datetime("yyyy-MM-dd HH:mm:ss") />
           ${test1?string.full}
      e、集合
        集合以方括号包括,各集合元素之间以英文逗号(,)分隔,看如下的示例:
      <#list["星期一",,["星期二",["星期三",["星期四",["星期五"] as x>
         ${s};
        </#list>
      f、Map集合
         Map对象使用花括号包括,Map中的key-value对之间以英文冒号(:)隔开,多组key-value对之间以英文逗号(,) 隔开
           例如
           <#assign score = {"语文":78,"数学":83,"Java":89} >
             <#list score?key as x>
              ${x}--->${score[x]};
             </#list>
             
             
      2、输出变量值
          FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性
          a、顶层变量
             Map root = new HashMap();
             root.put("name","wenchao");
             对应顶层变量,直接使用${variableName}来输出变量值,变量名只能是数字、字母、下划线、$、@和#的组合,并不能以数字开头
          b、输出集合元素
             如果需要输出集合元素,则可以根据集合元素的索引来输出元素。集合元素的索引以方括号指定。
             假设有集合对象为:["星期一","星期二","星期三","星期四","星期五","星期六"],该集合对象名为week, 如果需要输出星期三,则可以使用如下语法:
                ${week[2]}
             集合里的第一个元素的索引是0
          c、输出Map元素
              这里的Map对象可以是直接HashMap的实例,甚至包括 JavaBean实例,对应JavaBean实例,我们一样可以把其当成属性为key,属性为value的Map实例
              
              
      3、字符串操作
         a、字符串链接
           字符串连接有两种语法
           A、使用${..}(或#{..})在字符串常量部分插入表达式的值,从而完成字符串连接
           B、直接使用连接运算符(+)来连接字符串
             使用第一种语法来连接字符串
             ${"Hello,${user}!"}
              第二种使用连接符号来连接字符串
             ${"Hello,"+user+"!"};
               值的注意的是,${..}只能用于文本部分,因此,下面的代码是错误的:
                 <#if ${isBig}>Wow!</#if>
                 <#if "${isBig}">Wow!</#if>
                 应该写成:
                 <#if isBig>Wow!</#if>
         
         b、截取字符串
            Map root = new HashMap();
            root.put("book","疯狂Ajax讲义");
            
            ${book[0]}
            ${book[4]}
            ${book[1..4]}
            
      4、集合连接运算符
        这里所说的集合连接运算时将两个集合连接成一个新的集合,连接集合的运算符是+,例如
        <#list ["星期一"," 星期二","星期三"]+["星期四","星期五"] as x>
           ${x}
        </#list>
        
      5、Map连接运算符
             Map对象的连接运算也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+。如果两个Map对象具有相同的 key,则后加入Map里的key所
         对应的value替代原来key所对应的value
         
      6、算术运算符
         FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括: +,-,*,/,%
         看如下代码示范
           <#assign x = 5 />
           ${x* -100}
           ${x/2}
           ${12%10}
         在表达式中使用算术运算时要注意以下几点。
         A、运算符两边的运算数必须是数字,因此下面的代码是错误的:
           ${3*"5"}
         B、使用+(既可以作为加号,也可以作为字符串连接运算符)运算时,如果一边是数字,一边是字符串,就会自动将数字转化为字符串。例如
            ${3+"5"}
            输出结果:35
         C、使用内建的int函数可对数值取整。例如
            <#assign x = 5>
            ${(x/2)?int}
            ${1.1?int}
            ${1.999?int}
            ${-1.9999?int}
            ${-1.1?int}
       
       7、比较运算符
           表达式中支持的比较运算符有如下几个
           a、=(或者==):判断两个值是否相等.
           b、!=:判断两个值是否不相等
           c、 >(或者gt):判断坐标值是否大于右边值
           d、 >=(或者gte):判断坐标值是否大于等于右边值
           e、 <(或者lt):判断左边值是否小于右边值
           f、 <=(或者lte):判断左边值是否小于等于右边值          
                
            
       8、逻辑运算符
          逻辑运算符有如下几个
          a、逻辑与:&&
          b、逻辑或:||
          c、逻辑非:!
          逻辑运算符只能作用于布尔值,否则将产生错误。
          
       9、内建函数
          FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可通过内建函数来转换输出变量
          下面是常用的内建的字符串函数
          a、html:对字符串进行HTML编码
          b、cap_first:将字符串第一个字母成大写
          c、lower_case:将字符串转换成小写
          d、upper_case:将字符串转换成大写
          e、trim: 去掉字符串前后的空白字符
          下面是集合的常用的内建函数
          a、size: 获得序列中元素的数目
          
          下面是数字值的常用的内建函数
          a、int 取得数字的整数部分
          例如
          <#assign test="Tom & Jerry" />
          ${test?html}
          ${test?upper_case?html}
          
       10、空值处理运算符
          FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常。
          
          
       11、运算符优先级
          
  三、FreeMarker 的常用指令
     1、if指令
        分支控制语句
        语法格式如下
       <#if condition>
            ....
       <#elseif condition2>
          ...
       <#elseif condition3>      
          ...
       <#else>
          ...
       </#if>
     
     2、switch、case、default、break指令
        <#switch value>
           <#case refValue>
              ...
              <#bread>
           <#case refValue>
              ...
              <#bread>
           <#default>
              ...
        </#switch>
        虽然FreeMarker提供了switch指令,但它并不推荐使用switch指令来控制也输出,而是推荐使用FreeMarker的if..elseif..else 指令来替代它。
        
    3、list、break指令
    list指令时一个典型的迭代输出指令,用于迭代输出数据模型中的集合。list指令的语法格式如下:
     <#list sequence as item>
       ...
     </#list>
      除此之外,迭代集合对象时,还包括两个特殊的循环变量:
      a、item_index:当前变量的索引值。
      b、item_has_next:是否存在下一个对象
      也可以使用<#break>指令跳出迭代
      <#list ["星期一","星期二","星期三","星期四","星期五"] as x>
          ${x_index +1}.${x} <#if x_has_next>,</#if>
          <#if x = "星期四"><#break></#if>
      </#list>
      
      4、include 指令
        include指令的作用类似于JSP的包含指令,用于包含指定页,include指令的语法格式如下
         <#include filename [options]
          在上面的语法格式中,两个参数的解释如下
          a、filename:该参数指定被包含的模板文件
          b、options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,encoding指定包含页面时所使用的解码集,而parse指定被
             包含是否作为FTL文件来解析。如果省略了parse选项值,则该选项值默认是true
     5、 import指令
        该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import 指令的语法格式如下
        <#import path as mapObject>
        在上面的语法格式中,path指定要被导入的模板文件,而mapObject是一个Map对象名,通过这行代码,将导致path模板中的所有变量都被放置
        在mapObject中
        <#import "/lib/common.ftl" as com>
     
     6、noparse指令
         noparse指令指定FreeMarker不处理该指令里包含的内容,该指令的语法格式如下:
         <#noparse>
            ...
         </#noparse>
         
     7、escape、noescape指令
       
       
     8、assign指令
        它用于为该模板页面创建或替换一个顶层变量
        
     9、setting指令
        该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:
        <#setting name = value>
        name 的取值范围包括如下几个
         locale :该选项指定该模板所用的国家/语言选项
         number_format:该选项指定格式化输出数字的格式
         boolean_format:该选项指定两个布尔值的语法格式,默认值是"true、false"
         date_format,time_format,datetime_format:该选项指定格式化输出日期的格式
         time_zone:  设置格式化输出日期时所使用的时区
     10、macro、nested、return指令

posted on 2011-12-16 11:17

JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: ... ... ... ... 例子如下: 60)>老年人 40)>中年人 20)>青年人 少年人 输出结果是:青年人 上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. <#if animals.python.price Pythons are cheaper than elephants today. Pythons are not cheaper than elephants today. 2、 switch , case , default , break指令 这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: ... ... ... 3、 list, break指令 list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下: ... 上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:当前变量的索引值 item_has_next:是否存在下一个对象 也可以使用指令跳出迭代 例子如下: ${x_index + 1}.${x}, We have these animals: NamePrice ${being.name}${being.price} Euros 输出为: We have these animals: NamePrice mouse50 Euros elephant5000 Euros python4999 Euros 4、include指令 include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: 在上面的语法格式中,两个参数的解释如下: filename:该参数指定被包含的模板文件 options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. Test page Test page Blah blah... 5、 import指令 该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下: 上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中. 创建库 ? 下面是一个创建库的例子(假设保存在lib/my_test.ftl中): Copyright (C) ${date} Julia Smith. All rights reserved. Email: ${mail} ? 使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量: ${my.mail} ${mail} 输出结果: Copyright (C) 1999-2002 Julia Smith. All rights reserved. Email: jsmith@acme.com jsmith@acme.com fred@acme.com 可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: ${my.mail} ${my.mail} l 输出结果: jsmith@acme.com jsmith@other.com l 数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: Copyright (C) ${date} ${user}. All rights reserved. l 假设数据模型中的user变量的值是Fred,则下面的代码: ${my.mail} l 输出结果: Copyright (C) 1999-2002 Fred. All rights reserved. 1.6 算术运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码: ${ x * x - 100 } ${ x /2 } ${ 12 } 输出结果是: -75 2.5 2 在表达式中使用算术运算符时要注意以下几点: 1,运算符两边的运算数字必须是数字 2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35 使用内建的int函数可对数值取整,如: ${ (x/2)?int } ${ 1.1?int } ${ 1.999?int } ${ -1.1?int } ${ -1.999?int } 结果是:2 1 1 -1 -1 1.7 比较运算符 表达式中支持的比较运算符有如下几个: 1. =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. >或者gt:判断左边值是否大于右边值 4. >=或者gte:判断左边值是否大于等于右边值 5. <或者lt:判断左边值是否小于右边值 6. 会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:y)> 1.8 逻辑运算符 逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误 1.9 内建函数 FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数: html:对字符串进行HTML编码 cap_first:使字符串第一个字母大写 lower_case:将字符串转换成小写 upper_case:将字符串转换成大写 trim:去掉字符串前后的空白字符 下面是集合的常用内建函数 size:获取序列中元素的个数 下面是数字值的常用内建函数 int:取得数字的整数部分,结果带符号 例如: ${test?html} ${test?upper_case?html} 结果是:Tom & Jerry TOM & JERRY 1.10 空值处理运算符 FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值 的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变 量完全相同. 为了处理缺失变量,FreeMarker提供了两个运算符: !: 指定缺失变量的默认值 ??: 判断某个变量是否存在 其中,!运算符的用法有如下两种: variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象. 使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false ########################### 最常用的概念 1、 scalars:存储单值 字符串:简单文本由单或双引号括起来。 数字:直接使用数值。 日期:通常从数据模型获得 布尔值:true或false,通常在标记中使用 2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字 具有一个唯一的查询名字和他包含的每个变量相关联。 3、 sequences:充当其它对象的容器,按次序访问 使用数字和他包含的每个变量相关联。索引值从0开始。 4、 集合变量: 除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由指令使用的受限sequences。 5、 方法:通过传递的参数进行计算,以新对象返回结果 方法变量通常是基于给出的参数计算值在数据模型中定义。 6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构中的一个节点,通常在XML处理中使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”} 注释标志 旧版本的freemarker采用的是 注释 方法 sequences内置方法 sequence?first 返回sequence的第一个值;前提条件sequence不能是null sequence?last 返回sequence最后一个值 sequence?reverse 反转sequence的值 sequence?size 返回sequence的大小 sequence?sort 对sequence按里面的对象toString()的结果进行排序 sequence?sort_by(value) 对sequence 按里面的对象的属性value进行排序 如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性 sequence?sort_by(name) 表示所有的user按user.name进行排序 hashes内置方法 hash?keys 返回hash里的所有keys, 返回结果类型sequence hash?values 返回hash里的所有value, 返回结果类型sequence 模板 使用FTL(freeMarker模板语言)编写 组成部分 一、整体结构 1、注释:,不会输出。 2、文本:直接输出。 3、interpolation:由 ${var} 或 #{var} 限定,由计算值代替输出。 4、FTL标记 二.表达式 1、直接指定值: 1-1、字符串: 由双引号或单引号括起来的字符串,其中的特殊字符(如' " \等)需要转义。 1-2、raw字符串: 有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"/${data}"year""}屏幕输出结果为:/${data}"year" 转义 含义 序列 \" 双引号(u0022) \' 单引号(u0027) \\ 反斜杠(u005C) \n 换行(u000A) \r Return (u000D) \t Tab (u0009) \b Backspace (u0008) \f Form feed (u000C) \l \a & \{ { \xCode 4位16进制Unicode代码 1-3、数字:直接输入,不需要引号 1)、精度数字使用“.”分隔,不能使用分组符号 2)、目前版本不支持科学计数法,所以“1E3”是错误的 3)、不能省略小数点前面的0,所以“.5”是错误的 4)、数字8、+8、08和8.00都是相同的 1-4、布尔值:true和false,不使用引号 1-5、序列:由逗号分隔的子变量列表,由[]方括号限定。 1)、子变量列表可以是表达式 2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。 1-6、散列(hash) 1)、由逗号分隔的键/值列表,由{}大括号限定,键和值之间用冒号分隔,如:{"key1":valu1,"key2":"character string"....} 2)、键和值都是表达式,但是键必须是字符串。 2、获取变量: 2-1、顶层变量:${变量名} 变量名只能是字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。 2-2、散列:有两种方法 1)、点语法:变量名字和顶层变量的名字受同样的限制 2)、方括号语法:变量名字无限制,可以是任意的表达式的结果 book.author.name book.author.["name"] book["author"].name book["author"]["name"] 以上是等价的。 2-3、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用 [startindex..endindex]语法获取序列片段。 2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。 3、字符串操作 3-1、interpolation:使用${}或#{}在文本部分插入表达式的值,例如: ${"hello${username}!"} ${"${username}${username}${username}"} 也可以使用+来获得同样的结果: ${"hello"+username+"!"} ${username+username+username} 注意:${}只能用于文本部分而不能出现于标记内。 或都是错误的; 是正确的。 本例中user.login的值必须是布尔类型。 3-2、子串: 举例说明:假如user的值为"Big Joe" ${user[0]}${user[4]}结果是:BJ ${user[1..4]}结果是:ig J 4、序列操作 4-1、连接操作:可以使用+来操作,例如: ["title","author"]+["month","day"] 5、散列操作 5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如: {"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。 6、算术运算 6-1、操作符:+、-、*、/、% 除+号以外的其他操作符两边的数据,必须都是数字类型。 如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。 6-2、比较操作符: 1}、= 2}、== 3}、!= 4}、< 5}、 7}、>= 1-3的操作符,两边的数据类型必须相同,否则会产生错误 4-7的操作符,对于日期和数字可以使用,字符串不可以使用。 注意: 1}、FreeMarker是精确比较,所以"x" "x " "X"是不等的。 2}、因为对FTL来说是开始和结束标记,所以,可以用两种方法来避免这种情况: 一种是使用括号<#if (a 另一是使用替代输出,对应如下: < lt gt >= gte 6-3、逻辑操作符:只能用于布尔值,否则会出现错误。 &&(and)与运算 ||(or)或运算 !(not)非运算 6-4、内建函数:使用方法类似于访问散列的子变量,只是使用?代替.例如:${test?upper_case?html} 常用的内建函数列举如下: 1}、字符串使用: html:对字符串进行HTML编码 cap_first:字符串第一个字母大写 lower_first:字符串第一个字母小写 upper_case:将字符串转换成大写 trim:去掉字符前后的空白字符 2)、序列使用: size:获得序列中元素的数目 3)、数字使用: int:取得数字的整数部分 7、操作符的优先顺序: 后缀:[subbarName][subStringRange].(mathodParams) 一元:+expr、-expr、! (not) 内建:? 乘法:*、/、% 加法:+、- 关系:<、、>= (lt、lte、gt、gte) 相等:=、==、!= 逻辑与:&& (and) 逻辑或:|| (or) 数字范围:.. 四、interpolation inperpolation只能用于文本,有两种类型:通用interpolation及数字interpolation 1、通用interpolation 如${expr} 1-1、插入字符串值:直接输出表达式结果。 1-2、插入数字值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: ${answer} ${answer?string} ${answer?string.number} ${answer?string.currency} ${answer?string.percent} 1-3、插入日期值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: ${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastupdata?string("EEE,MMM d, ''yy")} ${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")} 1-4、插入布尔值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: ${foo?string("yes","no")} 2、数字interpolation: 有两种形式: 1)、#{expr} 2)、#{expr;format}:format可以用来格式化数字,format可以是如下: mX:小数部分最小X位 MX:小数部分最大X位 例如: #{x;M2} #{y;M2} #{x;m1} #{y;m1} #{x;m1M2} #{y;m1M2} 宏 宏和变换器变量是两种不同类型的用户自定义指令,他们的区别是: 宏可以在模板中用macro指令来定义 变换器是在模板外由程序定义 1、宏:和某个变量关联的模板片段,以便在模板中通过用户自定义指令使用该变量 1-1、基本用法: 例如: Hello JOE! 使用时: 如果没有体内容也可以用 1-2、变量: 1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如: Hello ${person}! 使用时: and 输出为: Hello emma! Hello LEO! 注意:宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。 宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏中定义的参数,并且对所有参数赋值。如: Hello ${person}! 使用时: 正确 错误,color没有赋值,此时,如果在定义宏时为color定义缺省值这样的话,这个使用方法就是正确的。 错误,宏greet定义中未指定bgcolor这个参数 2、嵌套内容: 2-1、自定义指令可以有嵌套内容,使用指令,执行自定义指令开始和结束标记之间的模板片段。例如: hello Emma! 输出为 hello Emma! 2-2、指令可以被多次调用,例如 hello Emma! 输出为 hello Emma! hello Emma! hello Emma! hello Emma! 2-3、嵌套的内容可以是有效的FTL,例如: Hello ${person}! 输出为: Hello Emma! Hello Andrew! Hello Peter! 2-4、宏定义中的局部变量对嵌套内容是不可见的,例如: ${y}${count}/${x}: ${y?default("?")} ${x?default("?")} ${count?default("?")} 输出结果为 test 3/1:??? test 3/2:??? test 3/3:??? 2-5、在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。 例如: ${c}. ${halfc} last! 输出结果是 1. 0.5 2. 1 3. 1.5 4. 2last! 注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时,少指定循环变量,多指定的值会不见 调用时,多指定循环变量,多余的循环变量不会被创建 二、在模板中定义变量 1、在模板中定义的变量有三种类型 1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 1-2、局部变量:在宏定义体中有效,使用local指令创建和替换。 1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。 注意: 1)、宏的参数是局部变量,不是循环变量。 2)、局部变量隐藏同名的plain变量 3)、循环变量隐藏同名的plain变量和局部变量。 例如: 1. ${x} 6. ${x} 7. ${x} 8. ${x} 9. ${x} 2. ${x} 3. ${x} 4. ${x} 5. ${x} 4)、内部循环变量隐藏同名的外部循环变量 ${x} ${x} ${x} ${x} ${x} 5)、模板中的变量会隐藏数据模型中的同名变量,如果需访问数据模型中的变量,使用特殊变量global。 例如: 假设数据模型中的user值为Emma ${user} ${.global.user} macro, nested, return 语法 ... ... ... 用例 Test text, and the params: ${foo}, ${bar}, ${baaz} 输出 Test text, and the params: a, b, 23 Test text, and the params: a, b, -1 Test text, and the params: a, Bar, 23 Test text, and the params: a, Bar, -1 定义循环输出的宏 ${title?cap_first}: ${x?cap_first} 输出结果 Animals: 包含body的宏 ${c}. ${halfc} Last! 输出 1. 0.5 2. 1 3. 1.5 4. 2 Last! t, lt, rt 语法 去掉左右空白和回车换行 去掉左边空白和回车换行 去掉右边空白和回车换行 取消上面的效果 B指令 freemarker指令有两种: 1、预定义指令:引用方式为 2、用户定义指令:引用方式为,引用用户定义指令时须将#换为@。 注意:如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。 freemarker指令由FTL标记来引用,FTL标记和HTML标记类似,名字前加#来加以区分。如HTML标记的形式为则FTL标记的形式是(此处h1标记和list指令没有任何功能上的对应关系,只是做为说明使用一下)。 有三种FTL标记: 1)、开始标记: 2)、结束标记: 3)、空标记: 注意: 1) FTL会忽略标记之中的空格,但是,<#和指令 与 </#和指令 之间不能有空格。 2) FTL标记不能够交叉,必须合理嵌套。每个开始标记对应一个结束标记,层层嵌套。 如: ${数据} game over! 注意事项: 1)、FTL对大小写敏感。所以使用的标记及interpolation要注意大小写。name与NAME就是不同的对象。是正确的标记,而则不是。 2)、interpolation只能在文本部分使用,不能位于FTL标记内。如是错误的,正确的方法是:,而且此处var必须为布尔值。 3)、FTL标记不能位于另一个FTL标记内部,注释例外。注释可以位于标记及interpolation内部。 if, else, elseif 语法 ... ... ... ... ... 用例 x is 1 x is 1 x is not 1 We have these animals: NamePrice ${being.name} ${being.price} Euros It is Big Joe It is not Big Joe switch, case, default, break 语法 ... ... ... ... 用例 字符串 This will be processed if it is small This will be processed if it is medium This will be processed if it is large This will be processed if it is neither 数字 1 2 d 如果x=1 输出 1 2, x=2输出 2, x=3 输出d list, break 语法 ... ... 关键字 item_index:是list当前值的下标 item_has_next:判断list是否还有值 用例 ${x_index + 1}. ${x}, 输出 1. winter, 2. spring, 3. summer, 4. autumn include 语法 or options包含两个属性 encoding=”GBK” 编码格式 parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true” 用例 /common/copyright.ftl包含内容 Copyright 2001-2002 ${me} All rights reserved. 模板文件 Some test Yeah. 输出结果 Some test Yeah. Test page Test page Blah blah... Import 语法 类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件 用例 假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用 "my"在freemarker里被称作namespace compress 语法 ... 用来压缩空白空间和空白的行 用例 ( 1 2 3 4 5 ${moo} test only I said, test only ) 输出 (1 2 3 4 5 moo test only I said, test only) escape, noescape 语法 ... ... ... 用例 主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式 First name: ${firstName} Last name: ${lastName} Maiden name: ${maidenName} 相同表达式 First name: ${firstName?html} Last name: ${lastName } Maiden name: ${maidenName?html} assign 语法 or or or capture this or capture this 用例 生成变量,并且给变量赋值 给seasons赋予序列值 给变量test加1 给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量 将一段输出的文本作为变量保存在x里 下面的阴影部分输出的文本将被赋值给x ${n} Number of words: ${x?word_list?size} ${x} Hello ${user}! error true 同时也支持中文赋值,如: java ${语法} 打印输出: java global 语法 or or capture this 全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖如 在当前页面里x=2将被隐藏,或者通过${.global.x}来访问[A2] setting 语法 用来设置整个系统的一个环境 locale number_format boolean_format date_format, time_format, datetime_format time_zone classic_compatible 用例 假如当前是匈牙利的设置,然后修改成美国 ${1.2} ${1.2} 输出 1,2 1.2 因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.” C一些常用方法或注意事项 表达式转换类 ${expression}计算expression并输出 #{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m2M2}输出121.23 数字循环 1..5 表示从1到5,原型number..number 对浮点取整数 ${123.23?int} 输出123 给变量默认值 ${var?default(“hello world”)?html}如果var is null那么将会被hello world替代 判断对象是不是null Mouse found 也可以直接${mouse?if_exists})输出布尔形 常用格式化日期 openingTime必须是Date型,详细查看freemarker文档 Reference->build-in referece->build-in for date ${openingTime?date} ${openingTime?date_time} ${openingTime?time} 添加全局共享变量数据模型 在代码里的实现 cfg = Configuration.getDefaultConfiguration(); cfg.setSharedVariable("global", "you good"); 页面实现可以通过global指令,具体查看指令里的global部分 直接调用java对象的方法 ${object.methed(args)} 字符串处理(内置方法) html安全输出 “abcsdfsf”?html 返回安全的html输出,替换掉html代码 xml安全输出 var?xml substring的用法 ${user[0]}${user[4]} ${user[1..4]} 输出 : ho ello 类似String.split的用法 “abc;def;ghi”?split(“;”)返回sequence 将字符串按空格转化成sequence,然后取sequence的长度 var?word_list 效果同 var?split(“ ”) var?word_list?size 取得字符串长度 var?length 大写输出字符 var?upper_case 小写输出字符 var?lower_case 首字符大写 var?cap_first 首字符小写 var?uncap_first 去掉字符串前后空格 var?trim 每个单词的首字符大写 var?capitalize 类似String.indexof: “babcdabcd”?index_of(“abc”) 返回1 “babcdabcd”?index_of(“abc”,2) 返回5 类似String.lastIndexOf last_index_of和String.lastIndexOf类似,同上 下面两个可能在代码生成的时候使用(在引号前加”\”) j_string: 在字符串引号前加”\” String BEAN_NAME = "${beanName?j_string}"; 打印输出: String BEAN_NAME = "The \"foo\" bean."; js_string: alert("Welcome ${user}!"); 打印输出: alert("Welcome Big Joe\'s \"right hand\"!"); 替换字符串 replace${s?replace(‘ba’, ‘XY’ )} ${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含:i r m s c f具体含义如下: ·i: 大小写不区分. ·f: 只替换第一个出现被替换字符串的字符串 ·r: XY是正则表达式 ·m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string. ·s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators. ·c: Permits whitespace and comments in regular expressions. D freemarker在web开发中注意事项 freemarker与webwork整合 web中常用的几个对象 Freemarker的ftl文件中直接使用内部对象: ${Request ["a"]} ${RequestParameters["a"]} ${Session ["a"]} ${Application ["a"]} ${JspTaglibs ["a"]} 与webwork整合之后 通过配置的servlet 已经把request,session等对象置入了数据模型中 在view中存在下面的对象 我们可以在ftl中${req}来打印req对象 req - the current HttpServletRequest res - the current HttpServletResponse stack - the current OgnlValueStack ognl - the OgnlTool instance webwork - an instance of FreemarkerWebWorkUtil action - the current WebWork action exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view view中值的搜索顺序 ${name}将会以下面的顺序查找name值 freemarker variables value stack request attributes session attributes servlet context attributes 在模板里ftl里使用标签 注意,如果标签的属性值是数字,那么必须采用nubmer=123方式给属性赋值 JSP页面 Keyword: Exclude: 模板ftl页面 Keyword: Exclude: 如何初始化共享变量 1. 初始化全局共享数据模型 freemark在web上使用的时候对共享数据的初始化支持的不够,不能在配置初始化的时候实现,而必须通过ftl文件来初始化全局变量。这是不能满主需求的,我们需要在servlet init的时候留出一个接口来初始化系统的共享数据 具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量,可以通过修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个servlet初始化的时候来初始化全局共享变量 与webwork整合配置 配置web.xml freemarker com.opensymphony.webwork.views.freemarker.FreemarkerServlet TemplatePath / NoCache true ContentType text/html template_update_delay 0 default_encoding GBK number_format 0.########## 1 freemarker *.ftl E高级方法 自定义方法 ${timer("yyyy-MM-dd H:mm:ss", x)} ${timer("yyyy-MM-dd ", x)} 在模板中除了可以通过对象来调用方法外(${object.methed(args)})也可以直接调用java实现的方法,java类必须实现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子 public class LongToDate implements TemplateMethodModel { public TemplateModel exec(List args) throws TemplateModelException { SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0))); return mydate.format(new Date(Long.parseLong((String)args.get(1))); } } 将LongToDate对象放入到数据模型中 root.put("timer", new IndexOfMethod()); ftl模板里使用 ${timer("yyyy-MM-dd H:mm:ss", x)} ${timer("yyyy-MM-dd ", x)} 输出 2001-10-12 5:21:12 2001-10-12 自定义 Transforms 实现自定义的文本或表达式的功能,允许对中间的最终文本进行解析转换 例子:实现str 将str转换成STR 的功能 代码如下: import java.io.*; import java.util.*; import freemarker.template.TemplateTransformModel; class UpperCaseTransform implements TemplateTransformModel { public Writer getWriter(Writer out, Map args) { return new UpperCaseWriter(out); } private class UpperCaseWriter extends Writer { private Writer out; UpperCaseWriter (Writer out) { this.out = out; } public void write(char[] cbuf, int off, int len) throws IOException { out.write(new String(cbuf, off, len).toUpperCase()); } public void flush() throws IOException { out.flush(); } public void close() { } } } 然后将此对象put到数据模型中 root.put("upcase", new UpperCaseTransform()); 在view(ftl)页面中可以如下方式使用 hello world 打印输出: HELLO WORLD F.Built-ins ${x?upper_case} – 小写变大写 ${test?html} - 转换为HTML编码格式 ${repeat("A", B)} – 复制B次A Example: ${test?html} ${test?upper_case?html} Assuming that test stores the string ``Tom & Jerry'', the output will be: Tom & Jerry TOM & JERRY --------- ${repeat("What", 3)} will print: :WhatWhatWhat 1. String内置的JavaScript转换: js_string 用途:用于JavaScript转义,转换',",换行等特殊字符 模板: alert("${errorMessage?js_string}"); 输出: alert("Readonly\'s pet name is \"Cross Bone\""); 2.内置的默认值处理:default 用途: 用于处理默认值 模本: User: ${userLogin.name?default("Anonymous")} ${(employee.department.manager.name)?default(" ")} 输出: User: Anonymous 注,可以对整个对象树加上(),再用内置处理器这种方便的做法,偶也是最近刚学会的,以前一直用很傻的方法做..... 3. Sequence内置的计数器: xxx_index 用途:显示序号 模板: ${e_index}. ${e.name} 输出: 1. Readonly 2. Robbin 4. Sequence内置的分段器: chunk 用途:某些比较BT的排版需求 模板: ${cell} ${cell} 输出: a b c d e f g h i j a b c d e f g h i j - - String ${"It's \"quoted\" and this is a backslash: \\"} ${'It\'s "quoted" and this is a backslash: } ${r"${foo}"} raw字符串,原封不动地现实引号中的内容 ps:前一种是用双引号来引用字符串,后一种是用单引号来引用字符串。 分别需要对双引号和单引号进行转义 ${"${user}${user}${user}${user}"} ${user + user + user + user} 效果相同 ★substring ${user[0]}${user[4]} ${user[1..4]} ${user[4..]} ★number 不支持科学计数法 小数点前面的零不能省略 ★sequences ${x} ${x} ${x} 数组的拼接 - ${user} ★hash - Joe is ${ages.Joe} - Fred is ${ages.Fred} - Julia is ${ages.Julia} 注意重复的键对应的值取最后的一个 ★运算 ${5/2?int} 显示2 cap_first : 首字母大写 capitalize: 所有单词首刺目大写 html : 转换为HTML格式 < replaced with replaced with > & replaced with & " replaced with " index_of : 显示元素所在的位置 "abcabc"?index_of("bc") 返回值为1(下标从0开始) Contains:判断是否存在字符 It contains "ice" 输出: It contains "ice" Replace :替换 split(“XX”):截取XX之后的字符 - ${x} 输出: - some - test - text starts_with :字符串由什么开始返回布尔型 trim :去掉空格 seq_index_of 数组中元素的位置 ${colors?seq_index_of("blue")} 输出: 2 Default : 设置变量的默认值 Exists:放在if句 如果没有….. Mouse found No mouse found Creating mouse... Mouse found No mouse found 输出 : No mouse found Creating mouse... Mouse found if_exists 放在一般语句 (${mouse?if_exists}) Creating mouse... (${mouse?if_exists}) 输出: () Creating mouse... (Jerry) 删除空白行和空格 ... 让此标记内的代码都执行<#escape 后的?参数 From: ${mailMessage.From} Subject: ${mailMessage.Subject} Message: ${mailMessage.htmlFormattedBody} ... 输出: From: ${mailMessage.From?html} Subject: ${mailMessage.Subject?html} Message: ${mailMessage.htmlFormattedBody} ... [A1]默认值 [A2]这里的abc叫做namespace chunk, is_date, last, root, j_string, contains, is_hash, long, float, ends_with, namespace, matches, time, values, seq_last_index_of, uncap_first, byte, substring, is_transform, web_safe, groups, seq_contains, is_macro, index_of, word_list, int, is_method, eval, parent, xml, number, capitalize, if_exists, rtf, node_type, double, is_directive, url, size, default, is_boolean, split, node_name, is_enumerable, seq_index_of, is_sequence, sort, is_node, sort_by, left_pad, cap_first, interpret, children, node_namespace, chop_linebreak, date, short, last_index_of, is_collection, ancestors, length, trim, datetime, is_string, reverse, c, keys, upper_case, js_string, has_content, right_pad, replace, is_hash_ex, new, is_number, is_indexable, lower_case, string, exists, html, first, starts_with ##############2222222222222222############### struts2.0 标签+ftl标签 FreeMarker中文API手册(完整) http://blog.csdn.net/junjun16818/article/details/6990068 三目: ${true?string('5','7')} ${line.class.simpleName} 你好 list里面是object数组 ${line[1]}:${line[0]} 取得list的长度: 0)> 截取字符串:${news.title.substring(0,14)}...${news.title?if_exists} 拆分字符数组 10)> 1.注释: 包含在 2.注意: 由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如 y)> 3. 定义局部变量 4. 导入模板文件 指定名字空间 my 5. if指令 <#if animals.python.price Pythons are cheaper than elephants today. Pythons are not cheaper than elephants today. 6. list指令以及列表序号 第${being_index+1}个 ${being.name}${being.price} Euros ${x} - ${user} 输出结果是: - Joe - Fred - Julia - Kate include指令 7.判断是否为空 ${userInfo.userName?if_exists} 男女 checked 统计条件保证金返款数量 按年统计按月统计按日统计默认按日统计 8.截取字符串 ${carInfo.carNum.substring(0,1)} 9.freemarker的replace功能 替换字符串 replace 线路标签:${lineInfo.lineLableDescribe?replace('#','、')} ${s?replace(‘ba’, ‘XY’ )} ${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下: · i: 大小写不区分. · f: 只替换第一个出现被替换字符串的字符串 · r: XY是正则表达式 · m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string. · s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators. · c: Permits whitespace and comments in regular expressions. 10.三目运算 ${true?string('5','7')} 11.string格式化单个Interpolation,下面是一个例子: ${answer} ${answer?string} ${answer?string.number} ${answer?string.currency} ${answer?string.percent} 输出结果是: $42.00 $42.00 42 $42.00 4,200% 12.插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个使用格式模式的例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 输出的结果类似下面的格式: 2003-04-08 21:24:44 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 09:24:44 PM (PDT) 13.插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子: ${foo?string("yes", "no")} 输出结果是: yes 车型: 三厢轿车 Freemarker 内置函数 数字、字符串、日期格式化 一、 Sequence的内置函数 1. sequence?first 返回sequence的第一个值。 2. sequence?last 返回sequence的最后一个值。 3. sequence?reverse 将sequence的现有顺序反转,即倒序排序 4. sequence?size 返回sequence的大小 5. sequence?sort 将sequence中的对象转化为字符串后顺序排序 6. sequence?sort_by(value) 按sequence中对象的属性value进行排序 二、 Hash的内置函数 1. hash?keys 返回hash里的所有key,返回结果为sequence 2. hash?values 返回hash里的所有value,返回结果为sequence 例如: ${key}=${user[key]} 三、 操作字符串函数 1. substring(start,end)从一个字符串中截取子串 start:截取子串开始的索引,start必须大于等于0,小于等于end end: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。 例子: ${‘str’?substring(0)}à结果为str ${‘str’?substring(1)}à结果为tr ${‘str’?substring(2)}à结果为r ${‘str’?substring(3)}à结果为 ${‘str’?substring(0,0)}à结果为 ${‘str’?substring(0,1)}à结果为s ${‘str’?substring(0,2)}à结果为st ${‘str’?substring(0,3)}à结果为str 2. cap_first 将字符串中的第一个单词的首字母变为大写。 ${‘str’?cap_first}à结果为Str 3. uncap_first将字符串中的第一个单词的首字母变为小写。 ${‘Str’?cap_first}à结果为str 4. capitalize将字符串中的所有单词的首字母变为大写 ${‘str’? capitalize}à结果为STR 5. date,time,datetime将字符串转换为日期 例如: ${date1}à结果为2009-10-12 ${date2}à结果为9:28:20 ${date3}à结果为2009-10-12 9:28:20 注意:如果指定的字符串格式不正确将引发错误。 6. ends_with 判断某个字符串是否由某个子串结尾,返回布尔值。 ${“string”?ends_with(“ing”)?string} 返回结果为true 注意:布尔值必须转换为字符串才能输出 7. html 用于将字符串中的、&和“替换为对应得":& 8. index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。 Start参数用于指定从字符串的那个索引处开始搜索,start为数字值。 如果start大于字符串长度,则start取值等于字符串长度,如果start小于0, 则start取值为0。 ${“string”?index_of(“in”) à结果为3 ${“string”?index_of(“ab”) à结果为-1 9.length返回字符串的长度 ${“string”?length}à结果为6 10. lower_case将字符串转为小写 ${“STRING”?lower_case}à结果为string 11.upper_case将字符串转为大写 ${“string”?upper_case}à结果为STRING 12. contains 判断字符中是否包含某个子串。返回布尔值 ${“string”?contains(“ing”)?string} à结果为true 注意:布尔值必须转换为字符串才能输出 13. number将字符串转换为数字 ${“111.11”?number}à结果为111.11 14.replace用于将字符串中的一部分从左到右替换为另外的字符串。 ${“strabg”?replace(“ab”,”in”)} à结果为string 15.split使用指定的分隔符将一个字符串拆分为一组字符串 ${s} 结果为: This is split 16. trim 删除字符串首尾空格 ${“ String ”?trim} à结果为String 四、 操作数字 1. c 用于将数字转换为字符串 ${123?c} à结果为123 2. string用于将数字转换为字符串 Freemarker中预订义了三种数字格式:number,currency(货币)和percent(百分比)其中number为默认的数字格式转换 例如: ${tempNum} ${tempNum?string.number}或${tempNum?string(“number”)} à结果为20 ${tempNum?string.currency}或${tempNum?string(“currency”)} à结果为¥20.00 ${tempNum?string. percent}或${tempNum?string(“percent”)} à结果为2,000% 五、 操作布尔值 string 用于将布尔值转换为字符串输出 true转为“true”,false转换为“false” foo?string(“yes”,”no”)如果布尔值是true,那么返回“yes”,否则返回no <tr class="sealistra""sealistrb" align="center"> ${index} ${p.userName?if_exists} 司机乘客 单程往返 ${(p.ver)!""} 默认 匹配成功 ${p.createTime?string("yyyy-MM-dd HH:mm:ss")} if, else, elseif 语法: ... ... ... ... ... 备注:condition、condition2···必须为boolean 类型,、可有0或多个。 实例: x is 1 x is 2 x is 3 4> x is 4 x is not 1 nor 2 nor 3 nor 4 备注: 号 必须转义,否则出错。。转义请参考其他文档。 switch, case, default, break 语法 ... ... ... ... ... 备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。 list, break 语法 ... 备注: sequence 为一个sequence 或者 collection 类型。item 为 循环的变量。该指令中包含有两个特殊的循环变量, item_index:该值为当前循环的值。 item_has_next:该值为一个boolean类型,表明该循环是否含有下一个(是否为循环到了最后一个) 实例: ${x_index + 1}. ${x}, 输出: 1. winter, 2. spring, 3. summer, 4. autumn 实例: ${i} 备注:当x 为一个数值序列时,可以使用该list 列出两个数值之间的值。(适合于表格的序号填写) 实例: ${x} 备注:可以用 来终止该循环。 freemarker常见语法大全 FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断如果存在,就输出这个值 ${book.name?default(‘xxx’)}//默认值xxx ${book.name!"xxx"}//默认值xxx ${book.date?string('yyyy-MM-dd')} //日期格式 ${book?string.number} 20 //三种不同的数字格式 ${book?string.currency}-- ${book?string.percent}— //声明变量,插入布尔值进行显示 ${foo?string("yes","no")} <等大小比较符号使用需要注意:(xml的原因),可以用于比较数字和日期 使用lt、lte、gt和gte来替代<、和>= 也可以使用括号y)> 内置函数: 调用区别于属性的访问,使用?代替. 常见的一些内置函数 对于字符串 html-对字符串进行HTML编码 cap_first-使字符串第一个字母大写 lower_case-将字符串转换成小写 trim-去掉字符串前后的空白字符 对于Sequences(序列) size-获得序列中元素的数目 对于数字 int-取得数字的整数部分(如-1.9?int的结果是-1) 对于集合,可以使用数组的方式,使用下标索引进行访问 逻辑判断: if................ ... ... ...... ... Boolean类型的空值判断 空值判断可以写成 //注意${}为变量的渲染显示,而为定义等操作符的定义 switch............ ... ... ... ... ... 快速定义int区间的集合 //注意不需要[] 3:循环读取集合: 注意/的使用 ${stu} 与jstl循环类似,也可以访问循环的状态 item_index:当前变量的索引值 item_has_next:是否存在下一个对象 其中item名称为as后的变量名,如stu 集合长度判断 判断=的时候,注意只要一个=符号,而不是== 宏/模板 初步了解: 使用更像一个闭包closure,可以定义后,在脚本中任意地方引用,并原地起作用 Hello Joe! 使用的方式为: //同xml可以简写成 宏的参数定义,类似js,在宏名后 带参数进行传递定义 ${person} 调用带参数时,注意使用类似XML的属性格式进行传递,不需要关心顺序问题 参数默认值定义,如果没有,就必须要求传递完整的参数列表 Hello ${person}! 使用xml的嵌套内容进行传递宏调用,关键标签 调用时: The bordered text 标签可以在宏中多次调用,也可以将多个宏组合进行嵌套 for循环的精简版: 宏的循环变量,配合嵌套标签进行参数传递, //这里的三个参数,将会传递到嵌套内容中 ${c}. ${halfc} Last! //这里的内容由macro中的进行参数的传递,传递的数量任意,当注意需要宏接受这些 上述还需要注意;的使用 参数的数量是可变的,并不要求全部都有,但是效果不同 在模板中定义变量 在模板中定义的变量有三种类型: plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 局部变量:在宏定义体中有效,使用local指令创建和替换。 循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量 //全局的plain变量 内部循环变量将会隐藏同名的外部循环变量 外部导入的使用,可以用于模块化,并且提供公用性 如:lib/my_lib.ftl文件 Copyright (C) ${date} Julia Smith. All rights reserved. Email: ${mail} lib/my_inc.ftl文件 ${my.mail} ${mail} 输出结果将不会出现冲突 对于库中的变量修改,使用in关键字 函数定义:区别于宏对象,带返回值 函数,有返回参数 stringA[M .. N] 取子字符串,类似substring(stringA, M, N) 导入其他页面元素 options包含两个属性 encoding=”GBK” 编码格式 parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是 parse=”true” hash与list的定义 ${c.a} List片段可以采用: products[10..19] or products[5..] 的格式进行定义,当只局限于数字 ${v} 对变量的缺省处理 product.color!"red" 用compress directive或者transform来处理输出。 ...:消除空白行。 ...将输出压缩为一行。都需要包裹所需文档 freemarker可用"["代替"<".在模板的文件开头加上[#ftl]. 数字输出的另外一种方式 #{c.a;m0} 区别于${},这个例子是用于输出数字的格式化,保留小数的位数,详细如下 数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: mX:小数部分最小X位 MX:小数部分最大X位 在定义字符串的时候,可以使用''或者"",对特殊字符,需要使用\进行转义 如果存在大量特殊字符,可以使用${r"..."}进行过滤 ${r"${foo}"} ${r"C:\foo\bar"} Map对象的key和value都是表达式,但是key必须是字符串 可以混合使用.和[""]访问 book.author["name"] //混合使用点语法和方括号语法 为了处理缺失变量,FreeMarker提供了两个运算符: 用于防止对象不存在而导致的异常 !:指定缺失变量的默认值 ??:判断某个变量是否存在,返回boolean值 noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下: ... ${firstName?html} 使用html对字符进行格式化处理,对于<等的过滤 escape , noescape指令,对body内的内容实用统一的表达式 看如下的代码: First name:${firstName} Last name:${lastName} Maiden name:${maidenName} 上面的代码等同于: First name:${firstName?html} Last name:${lastName?html} Maiden name:${maidenName?html} 定义全局变量的方式 // 可以同时定义多个变量,也可以使用循环来给变量赋值 ${n} ${x} setting指令,用于动态设置freeMarker的运行环境: 该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:,在这个格式中,name的取值范围包含如下几个: locale:该选项指定该模板所用的国家/语言选项 number_format:指定格式化输出数字的格式 boolean_format:指定两个布尔值的语法格式,默认值是true,false date_format,time_format,datetime_format:指定格式化输出日期的格式 time_zone:设置格式化输出日期时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值