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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值