20200427 FTL 模板语言参考 梳理 (常用)

官方链接:http://freemarker.foofun.cn/ref_deprecated.html

目录

1.内建函数参考

1.1 字母顺序索引(重要)

abs

ancestors

api

boolean

byte

c for strings, for booleans

cap_first

capitalize

ceiling

children

chop_linebreak

chunk

contains

counter

date for dates, for strings

date_if_unknown

datetime for dates, for strings

datetime_if_unknown

double

ends_with

ensure_ends_with

ensure_starts_with

eval

first

floor

groups

float

has_api

has_content

has_next

html

index

index_of

int

interpret

item_cycle

item_parity

item_parity_cap

is_even_item

is_first

is_infinite

is_last

is_nan

is_odd_item

is_type

iso, iso_...

j_string

join

js_string

keep_after

keep_after_last

keep_before

keep_before_last

keys

last

last_index_of

left_pad

length

long

lower_abc

lower_case

matches

namespace

new

node_namespace

node_name

node_type

number

number_to_date, number_to_datetime, number_to_time

parent

replace

remove_beginning

remove_ending

reverse

right_pad

round

root

rtf

short

size

sort

seq_contains

seq_index_of

seq_last_index_of

sort_by

split

starts_with

string: for strings, for numbers, for booleans, for date/time/date-time

substring (deprecated)

switch

then

time for date/time/date-time, for strings

time_if_unknown

trim

uncap_first

upper_abc

upper_case

url

values

word_list

xhtml

xml

1.2 字符串内建函数

boolean

cap_first

capitalize

chop_linebreak

contains

date, time, datetime

ends_with

ensure_ends_with

ensure_starts_with

groups

html

index_of

j_string

js_string

json_string

keep_after

keep_after_last

keep_before

keep_before_last

last_index_of

left_pad

length

lower_case

matches

number

replace

right_pad

remove_beginning

remove_ending

rtf

split

starts_with

string (当被用作是字符串值时)

substring (已废弃)

trim

uncap_first

upper_case

url

url_path

word_list

xhtml

xml

通用标志

1.3 数字内建函数

abs

c (当被用作是数字值时)

is_infinite

is_nan

lower_abc

round, floor, ceiling

string (当用作是数字类型时)

upper_abc

1.4 日期内建函数

date, time, datetime (当用于日期/时间/日期-时间值时)

date_if_unknown, time_if_unknown, datetime_if_unknown

iso_...

string (当用于日期/时间/日期-时间值时)

1.5 布尔值内建函数

c (当用于布尔值时)

string (当用于布尔值时)

then

1.6 序列内建函数

chunk

first

join

last

reverse

seq_contains

seq_index_of

seq_last_index_of

size

sort

sort_by

1.7 哈希表内建函数

keys

values

1.8 结点(对于XML)内建函数

ancestors

children

node_name

node_namespace

node_type

parent

root

1.9 循环变量内建函数

counter

has_next

index

is_even_item

is_first

is_last

is_odd_item

item_cycle

item_parity

item_parity_cap

1.10 独立类型内建函数

switch

1.11 很少使用的和专家级的内建函数

api, has_api

byte, double, float, int, long, short

eval

has_content

interpret

is_...

namespace

new

number_to_date, number_to_time, number_to_datetime

2.指令参考

Alphabetical index

assign

attempt

compress

flush

ftl

function, return

global

if, else, elseif

 

import

include

list, else, items, sep, break

local

macro, nested, return

 

noparse

nt

setting

stop

switch, case, default, break

 

t, lt, rt

 

User-defined directive (<@...>)

visit, recurse, fallback

 

3.特殊变量参考

4.FTL 中的保留名称

5.废弃的 FTL 结构


1.内建函数参考

1.1 字母顺序索引(重要)

在 FreeMarker 2.3.23 中,指令名可以使用驼峰样式来代替蛇形样式, 比如 startsWith 代替 starts_with。 但是要知道,在相同模版内,FreeMarker 会强制对模板语言部分的所有标识符使用驼峰样式 (用户自定义名称不会受影响)。

 

 

该内建函数和 xml 内建函数的唯一不同是 xhtml内建函数转义 ' 为 &#39;,而不是 &apos;, 因为一些老版本的浏览器不能正确解释 &apos;

 

  • abs

  • 给出数字的绝对值。比如 x?abs ,如果 x 是 -5,会得到5。

  • ancestors

  • 一个包含所有结点祖先结点的序列,以直接父结点开始,以根结点结束。 该内建函数的结果也是一个方法,你可以用它和元素的 完全限定名 来过滤结果。 比如以名称 section 用 node?ancestors("section") 来获得所有祖先结点的序列。

  • api

  • 如果value本身支持这个额外的特性, value?api 提供访问 value 的API (通常是 Java API),比如 value?api.someJavaMethod(), 当需要调用对象的Java方法时,这种方式很少使用, 但是 FreeMarker 揭示的value的简化视图的模板隐藏了它,也没有相等的内建函数。 例如,当有一个 Map,并放入数据模型 (使用默认的对象包装器),模板中的 myMap.myMethod() 基本上翻译成Java的 ((Method) myMap.get("myMethod")).invoke(...),因此不能调用 myMethod。如果编写了 myMap?api.myMethod() 来代替,那么就是Java中的 myMap.myMethod()

  • boolean

  • 字符串转为布尔值。字符串必须是 true 或 false (大小写敏感!),或者必须是由 boolean_format 设置的特定格式。

  • byte

  • 返回一个包含原变量中相同值的 SimpleNumber, 但是在内部表示值中使用了 java.lang.Type。 如果方法被重载了,这是有用的,或者一个 TemplateModel 解包器在自动选择适合的 java.lang.* 类型有问题时。 请注意,从2.3.9版本开始,解包器有本质上改进, 所以将基本不会使用到这些内建函数来转换数字类型了, 除非在重载方法调用中来解决一些含糊的东西。

  • 内建函数 long 也可以用于日期, 时间和时间日期类型的值来获取返回为 java.util.Date.getTime() 的值。如果你不得不调用使用 long 类型时间戳的Java方法时, 这是非常有用的。这个转换不是自动进行的。

  • for stringsfor booleans

  • 该内建函数将布尔值转换为字符串,针对 "计算机语言" 而不是用户。不管 boolean_format 的设置是什么, 结果是 "true" 或 "false"。 当生成JavaScript的时候,应该会用到它,否则修改 boolean_format 的话可以打断生成的计算机语言输出。

  • foo?string("yes", "no"): 从 FreeMarker 2.3.23 版本开始废弃:使用 ?then("yes", "no") 来替代。如果布尔值是true, 这会返回第一个参数(此处是:"yes"), 否则返回第二个参数(此处是:"no")。 请注意,返回值总是一个字符串;如果参数是数字,那么首先会转换成字符串。 也请注意,两个参数是评估过的,不管只有一个会被用到; 如果参数不仅仅是文字的话,这也许会有负面影响。

  • foo?string: 从 FreeMarker 2.3.20 版本开始废弃:使用 ?c 来代替,或者设置 boolean_format 设置项,比如像 "yes,no",之后转换会自动发生。 如果仍然需要知道,这会转换布尔值为字符串,使用默认字符串来显示 true 和 false 值。默认情况下,true 被呈现为 "true", 而 false 被呈现为 "false"。 如果使用 FreeMarker 来生成代码,这是很有用的 (但是从 2.3.20 版本开始, 请使用 ?c),因为这些值不是非本地化(语言,国家)敏感的。 要修改这些默认设置,可以使用 boolean_format 设置

  • cap_first

  • 字符串中的首单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。 例如:

  • capitalize

  • 字符串中所有单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。例如:

  • ceiling

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

  • children

  • 一个包含该结点所有子结点(也就是直接后继结点)的序列。

  • XML:这和特殊的哈希表的键 * 几乎是一样的。 除了它返回所有结点,而不但是元素。所以可能的子结点是元素结点, 文本结点,注释结点,处理指令结点等,但 不是 属性结点。属性结点排除在序列之外。

  • chop_linebreak

  • 在末尾没有 换行符 的字符串, 那么可以换行,否则不改变字符串。

  • chunk

  • 该内建函数将序列分隔为多个序列,长度为第一个参数给定的值 (比如 mySeq?chunk(3))。结果是包含这些序列的一个序列。 最后一个序列可能比给定的长度要小,除非第二个参数也给定了 (比如 比如 mySeq?chunk(3, '-')), 这就是用来填充最后一个序列,以达到给定的长度。例如:

  • contains

  • 如果函数中的参数指定的子串出现在源字符串中, 那么返回true。比如:

  • counter

  • 返回当前迭代(由循环变量名称识别)从1开始的索引。

  • date for datesfor strings

  • 这些内建函数用来指定日期变量中的哪些部分被使用:

  • date:仅日期部分,没有一天当中的时间部分。

  • time:仅一天当中的时间部分,没有日期部分。

  • datetime:日期和时间都在

  • 在最佳情况下,你不需要使用这些内建函数。不幸的是, 由于Java平台上的技术限制,FreeMarker 有时不能发现日期中的哪一部分在使用; 询问程序员哪些变量会有这个问题。如果 FreeMarker 不得不执行需要这些信息的操作 --比如用文本显示日期--但是它不知道哪一部分在使用,它会以错误来中止运行。 这就是你不得不使用这些内建函数的时候了。比如,假设 openingTime 是一个有这样问题的变量:

  • date_if_unknown

  • date_if_unknown, time_if_unknown, datetime_if_unknown 内建函数使用一些子类型来标记日期类型的值:日期没有时间,时间,或日期-时间。 如果变量值已经持有这些信息,那么内建函数就不会起作用。也就是说, 它不会转换变量值的子类型,如果它是未知的,则会添加子类型。

  • datetime for datesfor strings

  • datetime_if_unknown

  • date_if_unknown, time_if_unknown, datetime_if_unknown 内建函数使用一些子类型来标记日期类型的值:日期没有时间,时间,或日期-时间。 如果变量值已经持有这些信息,那么内建函数就不会起作用。也就是说, 它不会转换变量值的子类型,如果它是未知的,则会添加子类型。

  • double

  • 返回一个包含原变量中相同值的 SimpleNumber, 但是在内部表示值中使用了 java.lang.Type。 如果方法被重载了,这是有用的,或者一个 TemplateModel 解包器在自动选择适合的 java.lang.* 类型有问题时。 请注意,从2.3.9版本开始,解包器有本质上改进, 所以将基本不会使用到这些内建函数来转换数字类型了, 除非在重载方法调用中来解决一些含糊的东西。

  • 内建函数 long 也可以用于日期, 时间和时间日期类型的值来获取返回为 java.util.Date.getTime() 的值。如果你不得不调用使用 long 类型时间戳的Java方法时, 这是非常有用的。这个转换不是自动进行的。

  • ends_with

  • 返回是否这个字符串以参数中指定的子串结尾。 比如 "ahead"?ends_with("head") 返回布尔值 true"head"?ends_with("head") 也返回 true

  • ensure_ends_with

  • 如果字符串没有以第一个参数指定的子串结尾, 那么就会将它加到字符串后面,否则返回原字符串。比如, "foo"?ensure_ends_with("/") 和 "foo/"?ensure_ends_with("/") 返回 "foo/"

  • ensure_starts_with

  • 如果字符串没有以第一个参数指定的子串开头, 那么就会将它加到字符串开头,否则返回原字符串。比如, "foo"?ensure_starts_with("/") 和 "/foo"?ensure_starts_with("/") 返回 "/foo"

  • 如果指定两个参数,那么第一个参数就被解释成Java正则表达式, 如果它不匹配字符串的开头,那么第二个参数指定的字符串就会添加到字符串开头。 比如 someURL?ensure_starts_with("[a-zA-Z]+://", "http://") 就会检查如果字符串是否以 "[a-zA-Z]+://" 开头 (请注意,不需要 ^),如果不是的话,就添加 "http://"

  • 该方法也接受第三个标志位参数。因为调用两个参数暗指 "r"(也就是正则表达式模式),那么就需要第三个参数了。 值得注意的一点是当不需要第一参数被解释成正则表达式,而只是普通文本, 但是又想让比较是大小写敏感的,那么此时就需要使用 "i" 作为第三个参数。

  • eval

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

  • 在调用 eval 的地方, 已被求值的表达式看到相同的变量(比如本地变量)是可见的。 也就是说,它的行为就像在 s?eval 处, 你有 s 的 。除了,指向在 s 之外创建的循环变量,它不能使用 循环变量内建函数

  • 配置设置项影响来自 Configuration 对象表达式解析(比如语法),而不是来自调用 eval 的的模板。

  • first

  • 序列的第一个子变量。如果序列为空,那么模板处理将会中止。

  • floor

  • floor:返回数字的舍掉小数后的整数 (也就是向负无穷舍弃)

  • groups

  • 这个函数只作用于内建函数 matches 的结果。请参考 这里...

  • float

  • has_api

  • has_content

  • 如果变量(不是Java的 null) 存在而且不是"空"就返回 true,否则返回 false。"空”"含义靠具体的情形来决定。 它是直观的常识性概念。下面这些都是空:长度为0的字符串, 没有子变量的序列或哈希表,一个已经超过最后一项元素的集合。 如果值不是字符串,序列,哈希表或集合,如果它是数字,日期或布尔值 (比如 0 和 false 是非空的), 那么它被认为是非空的,否则就是空的。注意当你的数据模型实现了多个模板模型接口, 你可能会得到不是预期的结果。然而,当你有疑问时你通常可以使用 expr!?size > 0 或 expr!?length > 0 来代替 expr?has_content

  • has_next

  • 辨别循环项是否是当前迭代(由循环变量名称识别)的最后一项。

  • html

  • index

  • index_of

  • 返回第一次字符串中出现子串时的索引位置。 例如 "abcabc"?index_of("bc") 将会返回1 (不要忘了第一个字符的索引是0)。而且,你可以指定开始搜索的索引位置: "abcabc"?index_of("bc", 2) 将会返回4。 这对第二个参数的数值没有限制:如果它是负数,那就和是0是相同效果了, 如果它比字符串的长度还大,那么就和它是字符串长度那个数值是一个效果。 小数会被切成整数。

  • 如果第一个参数作为子串没有在该字符串中出现时 (如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。

  • int

  • interpret

  • item_cycle

  • item_parity

  • item_parity_cap

  • is_even_item

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker是一种基于模板的Java模板引擎,它允许您使用模板来生成任何类型的文本输出。 FreeMarker使用FTLFreeMarker Template Language)作为其模板语言FTL基本上是一个文本文件,其中包含模板指令和占位符,用于生成所需的输出。FTL模板可以包含HTML、XML、JSON或任何其他文本格式。 以下是一个简单的FreeMarker FTL模板示例: ``` <html> <head> <title>Welcome to FreeMarker!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Here are your orders:</p> <ul> <#list orders as order> <li>${order}</li> </#list> </ul> </body> </html> ``` 在此模板中,`${user}`和`${order}`是占位符,它们将被实际值替换。`<#list>`指令用于遍历订单列表。 要使用FreeMarker,您需要创建一个Configuration对象,并将其配置为查找FTL模板的位置。然后,您可以使用Template对象加载模板并将数据模型传递给它。最后,使用Template.process()方法将数据模型与模板合并以生成输出。 以下是一个简单的Java示例: ``` Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setClassForTemplateLoading(this.getClass(), "/templates"); Template template = cfg.getTemplate("welcome.ftl"); Map<String, Object> data = new HashMap<>(); data.put("user", "John"); data.put("orders", Arrays.asList("Order 1", "Order 2", "Order 3")); Writer out = new StringWriter(); template.process(data, out); String output = out.toString(); ``` 在这个例子中,我们将模板放在`/templates`目录下,并将其加载到`Template`对象中。然后,我们创建一个包含用户和订单数据的Map,并将其传递给`Template.process()`方法。最后,我们将生成的输出保存在一个字符串中。 这只是一个简单的例子,FreeMarker还有许多高级功能,例如条件语句、循环、自定义指令等。您可以在FreeMarker官方文档中找到更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值