FreeMarker-2

来源:互联网 发布:格罗玛什地狱咆哮知乎 编辑:程序博客网 时间:2024/05/22 00:18

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首字母大写   字符串的所有单词都大写

0 0
原创粉丝点击