官方链接: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内建函数转义 ' 为 ',而不是 &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方法时, 这是非常有用的。这个转换不是自动进行的。

  • c for strings, for 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 dates, for strings

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

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

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

  • datetime:日期和时间都在

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

  • date_if_unknown

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

  • datetime for dates, for 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

  • is_first

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

  • is_infinite

  • 辨别数字是否是无限浮点数(根据IEEE 754)。比如, 基于 someNumber 的值是否是无限, someNumber?is_infinite 结果是 true 或 false,当然, 如果该数不是浮点类型,那么将会返回 false

  • is_last

  • is_nan

  • 辨别数字是否是浮点数NaN(根据IEEE 754)。比如, 基于 someNumber 的值是否是 NaN, someNumber?is_nan 结果是 true 或 false,当然, 如果该数不是浮点类型,那么将会返回 false

  • is_odd_item

  • is_type

  • 内建函数 如果值是 … 时返回 true
    is_string 字符串
    is_number 数字
    is_boolean 布尔值
    is_date 不要使用它!使用 is_date_like 来代替, 它们是相同的。往后也许会修改它的含义为 date_only
    is_date_like 日期,也就似乎日期,时间或者日期-时间, 亦或者是未知精确类型的日期(从 FreeMarker 2.3.21 版本开始)
    is_date_only 日期 (没有时间部分) (从 FreeMarker 2.3.21 版本开始)
    is_time 时间 (没有年-月-日部分) (从 FreeMarker 2.3.21 版本开始)
    is_datetime 日期-时间 (包含年-月-日和时间两者)
    is_unknown_date_like 不清楚是日期或时间或日期-时间的日期
    is_method 方法
    is_transform 变换
    is_macro 宏或函数(当然,由于历史问题,也对函数有效)
    is_hash 哈希表 (包含扩展的哈希表)
    is_hash_ex 扩展的哈希表 (支持 ?keys 和 ?values)
    is_sequence 序列
    is_collection 集合 (包含扩展的集合)
    is_collection_ex 扩展的集合 (支持 ?size)
    is_enumerable 序列或集合
    is_indexable 序列
    is_directive 指令类型 (例如宏 或 TemplateDirectiveModel, TemplateTransformModel, 等...), 或者函数 (由于历史问题)
    is_node 结点
  • iso, iso_...

  • 这些内建函数转换日期,时间或日期-时间值为字符串,遵循 ISO 8601:2004 "扩展" 格式。

  • 该内建函数有很多表现形式: iso_utc, iso_local, iso_utc_nz, iso_local_nz, iso_utc_m, iso_utc_m_nz,等。 名称的构成由下列单词顺序组成,每部分由一个 _ 分隔开:

    • iso (必须的)

  • j_string

  • 根据Java语言字符串转义规则来转义字符串, 所以它很安全的将值插入到字符串类型中。要注意它 不会 在被插入的值的两侧添加引号; 你需要在字符串值 内部 来使用。

  • join

  • 使用给定的分隔符来连接序列中的项为一个独立的字符串,例如:

  • js_string

  • keep_after

  • 移除字符串中的一部分内容,该部分是给定子串第一次出现之前的部分。 比如:

  • keep_after_last

  • keep_before

  • keep_before_last

  • keys

  • 一个包含哈希表中查找到的键的序列。 请注意,并不是所有的哈希表都支持这个 (询问程序员一个指定的哈希表是否允许这么操作)。

  • last

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

  • last_index_of

  • left_pad

  • length

  • 字符串中字符的数量。

  • long

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

  • lower_abc

  • 将 1, 2, 3,等...,转换为字符串 "a", "b", "c",等... 当到达 "z"时,那么会继续转换成如 "aa", "ab",等... 这和电子表格应用程序(比如Excel或Calc) 的列标签有着相同的逻辑。数字的最小值是 1。 没有上限值。如果数字是 0 或更小或它不是整数, 那么模板处理将会中止并发生错误。

  • lower_case

  • 字符串的小写形式。比如 "GrEeN MoUsE"?lower_case 将会是 "green mouse"

  • matches

  • 该内建函数决定了字符串是否精确匹配模式。而且,它会返回匹配子串的列表。 返回值是多类型值:

  • 布尔值:如果字符串整体匹配了模式,就是 true, 否则就是 false。比如:"fooo"?matches('fo*') 就是 true,但是 "fooo bar"?matches('fo*') 是 false

  • 序列:字符串匹配的子串的列表。很有可能是长度为0的序列。

  • namespace

  • 该内建函数返回和宏变量或函数变量关联的命名空间 (也就是命名空间的"入口"哈希表)。你只能和宏和函数一起来用它。

  • new

  • 这是用来创建一个确定的 TemplateModel 实现变量的内建函数。

  • 在 ? 的左边你可以指定一个字符串, 是 TemplateModel 实现类的完全限定名。 结果是调用构造方法生成一个方法变量,然后将新变量返回。

  • node_namespace

  • 返回结点命名空间的字符串。FreeMarker 没有为结点命名空间定义准确的含义; 它依赖于变量是怎么建模的。也可能结点没有定义任何结点命名空间。 这种情形下,该函数应该返回未定义的变量 (也就是 node?node_namespace?? 的值是 false),所以不能使用这个返回值。

  • XML:这种情况下的XML,就是XML命名空间的URI (比如 "http://www.w3.org/1999/xhtml")。 如果一个元素或属性结点没有使用XML命名空间,那么这个函数就返回一个空字符串。 对于其他XML结点这个函数返回未定义的变量。

  • node_name

  • 当被"访问"时,返回用来决定哪个自定义指令来调用控制这个结点的字符串。 可以参见 visit 和 recurse 指令。

  • XML:如果结点是元素或属性,那么字符串就会是元素或属性的本地 (没有前缀)名字。否则,名称通常在结点类型之后以 @ 开始。 可以参见 该表格。 要注意这个结点名称与在DOM API中返回的结点名称不同; FreeMarker 结点名称的目标是给要处理结点的用户自定义指令命名。

  • node_type

  • 描述结点类型的字符串。FreeMarker 没有对结点类型定义准确的含义; 它依赖于变量是怎么建模的。也可能结点并不支持结点类型。 在这种情形下,该函数就返回未定义值,所以就不能使用返回值。 (可以用 node?node_type?? 继续检查一个结点是否是支持类型属性。)

  • XML:可能的值是: "attribute", "text", "comment", "document_fragment", "document", "document_type", "element", "entity", "entity_reference", "notation", "pi"。 请注意,没有 "cdata" 类型,因为CDATA被认为是普通文本元素。

  • number

  • 字符串转化为数字格式。这个数字必须是 "计算机语言" 格式。也就是说, 它必须是本地化独立的形式,小数的分隔符就是一个点,没有分组。

  • 该内建函数识别FreeMarker模板语言使用的数字格式。此外, 它也识别科学记数法(比如 "1.23E6""1.5e-8") 从 FreeMarker 2.3.21 版本开始,它也识别所有XML Schema数字格式,比如 NaNINF-INF, 还有Java本地格式Infinity 和 -Infinity

  • 如果字符串不是适当的格式,当尝试访问该内建函数时就会发生错误, 并中止模板执行。

  • number_to_date, number_to_datetime, number_to_time

  • parent

  • 在结点树中,返回该结点的直接父结点。根结点没有父结点, 所以对于根结点,表达式 node?parent?? 的值就是 false

  • XML:注意通过这个函数返回的值也是一个序列 (当编写 someNode[".."] 时,和XPath表达式 .. 的结果是一样的)。也要注意属性结点, 它返回属性所属的元素结点,尽管属性结点不被算作是元素的子结点。

  • replace

  • 在源字符串中,用另外一个字符串来替换原字符串中出现它的部分。 它不处理词的边界。比如:

  • remove_beginning

  • 从字符串的开头移除参数中的子串,如果它不以参数中的子串开头, 那么就或者返回原字符串。比如:

  • remove_ending

  • reverse

  • 序列的反序形式。

  • right_pad

  • 它和 left_pad 相同, 但是它从末尾开始插入字符而不是从开头。

  • round

  • 使用确定的舍入法则,转换一个数字到整数:

  • root

  • 该结点所属结点树的根结点。

  • XML:根据W3C,XML文档的根结点不是最顶层的元素结点, 而是文档本身,是最高元素的父结点。例如, 如果想得到被称为是 foo 的XML (所谓的"文档元素",不要和"文档"搞混了)的最高 元素, 那么不得不编写 someNode?root.foo。如果仅仅写了 someNode?root,那么得到的是文档本身,而不是文档元素。

  • rtf

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

  • \ 替换为 \\

  • { 替换为 \{

  • } 替换为 \}

  • short

  • size

  • 序列中子变量的数量(作为数字值)。假设序列中至少有一个子变量, 那么序列 s 中最大的索引是 s?size - 1 (因为第一个子变量的序列是0)。

  • sort

  • 以升序方式返回序列。(要使用降序排列时,使用它之后使用 reverse 内建函数。) 这仅在子变量都是字符串时有效,或者子变量都是数字,或者子变量都是日期值 (日期,时间,或日期+时间),或者所有子变量都是布尔值时(从2.3.17版本开始)。 如果子变量是字符串,它使用本地化(语言)的具体单词排序(通常是大小写不敏感的)。比如:

  • seq_contains

  • 辨别序列中是否包含指定值。它包含一个参数,就是来查找的值。比如:

  • seq_index_of

  • 返回序列中第一次出现该值时的索引位置, 如果序列不包含指定的值时返回 -1。 要查找的值作为第一个参数。比如这个模板:

  • seq_last_index_of

  • sort_by

  • 返回由给定的哈希表子变量来升序排序的哈希表序列。 (要降序排列使用该内建函数后还要使用 reverse 内建函数。) 这个规则和 sort 内建函数 是一样的, 除了序列中的子变量必须是哈希表类型,而且你不得不给哈希变量的命名, 那会用来决定排序顺序。比如:

  • split

  • 它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。 比如:

  • starts_with

  • 如果字符串以指定的子字符串开头,那么返回true。 比如 "redirect"?starts_with("red") 返回布尔值 true,而且 "red"?starts_with("red") 也返回 true

  • 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

  • 和 cap_first 相反。 字符串中所有单词的首字母小写。

  • upper_abc

  • 和 lower_abc 相同, 但是它转换成大写字母,比如 "A", "B", "C",… , "AA", "AB", 等...

  • upper_case

  • 字符串的大写形式。比如 "GrEeN MoUsE" 将会是 "GREEN MOUSE".

  • url

  • 在URL之后的字符串进行转义。这意味着, 所有非US-ASCII的字符和保留的URL字符将会被 %XX 形式转义。例如:

  • values

  • 一个包含哈希表中子变量的序列。 注意并不是所有的哈希表都支持这个 (询问程序员一个指定的哈希表是否允许这么操作)。

  • 至于返回的值的顺序,和内建函数 keys 的应用是一样的;看看上面的叙述就行了。

  • word_list

  • 包含字符串中所有单词的序列,顺序为出现在字符串中的顺序。 单词是不间断的字符序列,包含了任意字符,但是没有 空白。例如:

  • xhtml

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

  • < 替换为 &lt;
  • > 替换为 &gt;
  • & 替换为 &amp;
  • " 替换为 &quot;
  • ' 替换为 '
  • xml

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

  • < 替换为 &lt;
  • > 替换为 &gt;
  • & 替换为 &amp;
  • " 替换为 &quot;
  • ' 替换为 &apos;

1.2 字符串内建函数

  • boolean

  • cap_first

  • capitalize

  • chop_linebreak

  • contains

  • date, time, datetime

  • ends_with

  • ensure_ends_with

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

  • 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

  • 它和 url 内建函数 相同,只是它不转义斜杠 (/)字符。这就是意味着用来转义使用了斜杠(不是反斜杠!)的路径 (比如操作系统或一些内容仓库的路径),转义之后它们可以插入到URL中。 需要该转义的常用原因是文件夹名称或文件名称可能含有非US-ASCII字母 ("国家" 标准符号)。

  • 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

  • 基于 FreeMarker 2.3.23,对指令名可以使用驼峰形式来代替全小写形式, 比如 noParse 来代替 noparse。 但是要知道在相同的模板中,FreeMarker 对所有标识符会强制使用驼峰形式, 这是模板语言的一部分(用户自定义名称不受影响)。

  • assign

  • 概要

  • 描述

  • 使用该指令你可以创建一个新的变量, 或者替换一个已经存在的变量。注意仅仅顶级变量可以被创建/替换 (也就是说你不能创建/替换 some_hash.subvar, 除了 some_hash)。

  • attempt

  • 概要
  • 描述
  • 如果你想让页面成功输出内容,尽管它在页面特定位置发生错误也这样, 那么这些指令就是有用的。如果一个错误在 attempt block 执行期间发生, 那么模板执行就会中止,但是 recover block 会代替 attempt block 执行。 如果在 attempt block 执行期间没有发生错误, 那么 recover block 就会忽略。 一个简单的示例如下:

  • 在 recover block 块中,错误的信息存在 特殊变量 error 中。 不要忘了以点开始引用特殊变量(比如:${.error})。

    在模板执行期间发生的错误通常被 日志记录,不管是否发生在 attempt block块中。

  • compress

  • 概要
  • 描述
  • flush

  • 概要
  • 描述
  • ftl

  • 概要
  • 描述
  • 告诉 FreeMarker 和其他工具关于模板的信息, 而且帮助程序员来自动检测一个文本文件是否是 FTL 文件。该指令, 如果存在,必须是模板的第一句代码。该指令前的任何 空白 将被忽略。 该指令的老式语法(#-less)格式是不支持的。

  • 一些设置(编码方式,空白剥离等)在这里给定的话就有最高的优先级, 也就是说,它们直接作用于模板而不管其他任何 FreeMarker 的配置设置。

  • function, return

  • 概要
  • 描述
  • 创建一个方法变量(在当前命名空间中,如果你知道命名空间的特性)。 这个指令和 macro 指令 的工作方式一样,除了 return 指令必须有一个参数来指定方法的返回值,而且视图写入输出的将会被忽略。 如果到达 </#function> (也就是说没有 return returnValue), 那么方法的返回值就是未定义变量。

  • global

  • 概要
  • 描述
  • if, else, elseif

  • 概要
  • 描述
  • 你可以使用 if, elseif 和 else 指令来条件判断是否越过模板的一个部分。 condition 必须计算成布尔值, 否则错误将会中止模板处理。elseif 和 else 必须出现在 if 内部 (也就是,在 if 的开始标签和结束标签之间)。 if 中可以包含任意数量的 elseif(包括0个) 而且结束时 else 是可选的。比如:

  • import

  • 概要
  • 描述
  • 引入一个库。也就是说,它创建一个新的空命名空间, 然后在那个命名空间中执行给定 path 参数中的模板, 所以模板用变量(宏,函数等)填充命名空间。 然后使得新创建的命名空间对哈希表的调用者可用。 这个哈希表变量将会在命名空间中,由 import (就像你可以用 assign 指令来创建一样。) 的调用者被创建成一个普通变量,名字就是 hash 参数给定的。

  • include

  • 概要
  • 描述
  • 你可以使用它在你的模板中插入另外一个 FreeMarker 模板文件 (由 path 参数指定)。 被包含模板的输出格式是在 include 标签出现的位置插入的。 被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。 include 指令不能由被包含文件的内容所替代, 它只是当 FreeMarker 每次在模板处理期间到达 include 指令时处理被包含的文件。所以对于如果 include 在 list 循环之中的例子, 你可以为每个循环周期内指定不同的文件名。
  • path 参数可以是如 "foo.ftl" 和 "../foo.ftl" 一样的相对路径,或者是如 "/foo.ftl" 这样的绝对路径。 相对路径是相对于使用 import 指令的模板文件夹。 绝对路径是相对于程序员在配置 FreeMarker 时定义的基路径 (通常指代"模板的根路径")。
  • 通常使用 /(斜杠)来分隔路径成分, 而不是 \(反斜杠)。如果你从你本地的文件系统加载模板, 而它使用反斜杠(像Windows操作系统),也要使用 /
    • 使用获得机制
    • 有一个特殊的路径组成,是用一个星号(*)来代表的。 它被解释为"当前目录或其他任意它的父目录"。因此, 如果模板在 /foo/bar/template.ftl 位置上,有下面这行

    • <#include "*/footer.ftl">

    • 那么引擎就会在下面的位置上寻找模板,并按这个顺序:

    • /foo/bar/footer.ftl
    • /foo/footer.ftl
    • /footer.ftl
    • 该机制被称为 acquisition 并允许设计者在父目录中放置通用的被包含的文件, 而且当需要时在每个子路径基础上重新定义它们。 我们说包含它们的模板获得了从包含它的第一个父目录中的模板。请注意, 你不但可以在星号的右面指定一个模板的名字,也可以指定一个子路径。 也就是说,如果前面的模板由下面这个所替代:
    • <#include "*/commons/footer.ftl">
    • 那么引擎将会从下面的路径开始寻找模板,并按这个顺序:

    • /foo/bar/commons/footer.ftl
    • /foo/commons/footer.ftl
    • /commons/footer.ftl
    • 最终,星号不再是路径的第一个元素:
    • <#include "commons/*/footer.ftl">
    • 会让引擎将会从下面的路径开始寻找模板,并按这个顺序:

    • /foo/bar/commons/footer.ftl
    • /foo/bar/footer.ftl
    • /foo/footer.ftl
    • /footer.ftl
    • 然而,在路径中最多只能有一个星号。 指定多余一个星号会导致模板不能被发现。
    • 本地化查找
    • 本地化是语言和可选的国家或方言标识符 (加上可能的更多变体标识符,比如 "MAC")。 无论何时模板被请求,期望的本地化都会被指定(明确或含蓄), FreeMarker 会试图找到变化的模板来匹配本地化环境。当模板包含或引入其它模板时, 在内部也会被请求一个本地化环境,也就是 locale 配置的本地化, 通常它是顶级模板的本地化设置。

    • 假设模板使用本地化 en_US 来加载, 就是美国英语。当包含其它模板时:

    • <#include "footer.ftl">
    • 引擎实际上就会寻找一些模板,并按照这个顺序:

    • footer_en_US.ftl,
    • footer_en.ftl
    • footer.ftl
    • 它会使用第一个存在的。
    • 请注意,如果 FreeMarker 查找的本地化变化是由程序员配置的, 那么这里我们只能描述默认的行为。 可以使用 localized_lookup 设置来禁用本地化查找 (Configuration.setLocalizedLookup(boolean))。 而且,可以使用 template_lookup_strategy 设置来自行定义推导出的模板名称序列 (Configuration.setTemplateLookupStrategy(TemplateLookupStrategy))。
    • 当你同时使用获得机制(也就是路径中的 * 步骤) 和本地化查找时,在父目录中有指定本地化的模板优先于在子目录中有很少本地化的模板。 假设你使用下面的代码来包含 /foo/bar/template.ftl
    • 引擎将会查找这些模板,并按照这个顺序:

    • /foo/bar/footer_en_US.ftl
    • /foo/footer_en_US.ftl
    • /footer_en_US.ftl
    • /foo/bar/footer_en.ftl
    • /foo/footer_en.ftl
    • /footer_en.ftl
    • /foo/bar/footer.ftl
    • /foo/footer.ftl
    • /footer.ftl
  • list, else, items, sep, break

  • 概要
  • 描述
    • 最简形式
    • else 指令
    • items 指令
    • sep 指令
    • break 指令
    • 访问迭代状态
    • 从 2.3.23 版本开始, 循环变量内建函数 就是访问当前迭代状态的最佳方式。例如,这里我们使用 counter 和 item_parity 循环变量内建函数(在 循环变量内建函数参考 中查看它们全部):

    • 相互嵌套循环
    • 很自然地,list 或 items 可以包含更多 list

    • Java程序员请注意
    • 如果经典兼容模式下 list 接受标量,并将它视为单元素序列。

    • 如果传递包装了 java.util.Iterator 的集合到 list 中,那么只能迭代其中的元素一次,因为 Iterator 是它们天然的一次性对象。 当视图再次去迭代这样的集合变量时,会发生错误并中止模板处理。

  • local

  • 概要
  • 描述
  • macro, nested, return

  • 概要
  • 描述
  • 创建一个宏变量(在当前命名空间中,如果你知道命名空间的特性)。 如果你对宏和自定义指令不了解,你应该阅读 自定义指令指南。
  • 宏变量存储模板片段(称为宏定义体)可以被用作 自定义指令。 这个变量也存储自定义指令的被允许的参数名。当你将这个变量作为指令时, 你必须给所有参数赋值,除了有默认值的参数。 默认值当且仅当你调用宏而不给参数赋值时起作用。
  • 变量会在模板开始时被创建;而不管 macro 指令放置在模板的什么位置。因此,这样也可以:
  • nested
  • nested 指令执行自定义指令开始和结束标签中间的模板片段。 嵌套的片段可以包含模板中任意合法的内容:插值,指令等...它在上下文环境中被执行, 也就是宏被调用的地方,而不是宏定义体的上下文中。因此,比如, 你不能看到嵌套部分的宏的局部变量。如果你没有调用 nested 指令, 自定义指令开始和结束标记中的部分将会被忽略。
  • return
  • noparse

  • 概要
  • 描述
  • nt

  • setting

  • 概要
  • 描述
  • 为进一步的处理而设置。设置是影响 FreeMarker 行为的值。 新值仅仅在被设置的模板处理时出现,而且不触碰模板本身。 设置的初始值是由程序员设定的 (参考: 程序开发指南/配置(Configuration)/配置设置)。

  • stop

  • switch, case, default, break

  • 概要
  • 描述
  • 这个指令的用法是不推荐的,因为向下通过的行为容易出错。使用 elseif来代替, 除非你想利用向下通过这种行为。

  • Switch 被用来选择模板中的一个片段,如何选择依赖于表达式的值:

  • 在 switch 中间必须有一个或多个 <#case value>, 在所有 case 标签之后,有一个可选的 <#default>。 当FreeMarker到达 switch 指令时,它会选择一个 case 指令,这里的 refValue 等于 value 并且继续模板处理。 如果没有和合适的值匹配的 case 指令,那么就继续处理 default 指令,如果它存在,否则就继续处理 switch 结束标签之后的内容。现在有一个混乱的事情: 当它选择一个 case 指令后,它就会继续处理其中的内容, 直到遇到 break 指令。也就是它遇到另外一个 case 指令或 <#default> 标记时也不会自动离开 switch 指令。比如:

  • t, lt, rt

  • 概要
  • 描述
  • User-defined directive (<@...>)

  • 概要
  • 描述
  • 这将调用用户自定义指令,比如宏。参数的含义, 支持和需要的参数的设置依赖于具体的自定义指令。
  • 结束标签
  • 你可以在 结束标签 中忽略 user_def_dir_exp。 也就是说,你可以写 </@> 来替代 </@anything>。 这个规则当表达式 user_def_dir_exp 太复杂时非常有用,因为你不需要在结束标签中重复表达式。 此外,如果表达式包含比简单变量名和点还多的表达式,你就不能再重复它们了。比如, <@a_hash[a_method()]>...</@a_hash[a_method()]> 就是错的,你必须写为 <@a_hash[a_method()]>...</@>。 但是 <@a_hash.foo>...</@a_hash.foo> 是可以的。

    • 循环变量
    • 位置参数传递
    • 位置参数传递(如<@heading "Preface", 1/>) 是正常命名参数传递(如<@heading title="Preface" level=1/>) 的速记形式,这里忽略了参数的名称。如果自定义指令只有一个参数, 或者对于经常使用的自定义指令它参数的顺序很好记忆,速记形式应该被应用。 为了应用这种形式,你不得不了解声明的命名参数的顺序(如果指令只有一个参数这是很琐碎的)。 也就是,如果 heading 被创建为 <#macro heading title level>..., 那么 <@heading "Preface", 1/> 和 <@heading title="Preface" level=1/> (或 <@heading level=1 title="Preface"/>; 如果你使用参数名称,那顺序就不重要了)是相等的。 要注意位置参数传递现在仅仅支持宏定义。

  • visit, recurse, fallback

  • 概要
  • 描述
  • visit 和 recurse 指令是用来递归处理树的。在实践中,这通常被用来 处理XML。

    • Visit
    • Recurse
    • <#recurse> 指令是真正纯语义上的指令。 它访问结点的所有子结点(而没有结点本身)。所以来写:

    • Fallback

3.特殊变量参考

特殊变量是由FreeMarker引擎自己定义的变量。要访问它们, 你可以使用 .variable_name 语法。 比如,你不能仅仅写 version,而必须写.version

4.FTL 中的保留名称

下面的这些名称不能在非方括号语法中被用作顶层变量 (比如 .vars["in"]),因为这是FTL中的关键字:

  • true:布尔值"true"
  • false:布尔值"false"
  • gt:比较运算符"大于"
  • gte:比较运算符"大于或等于"
  • lt:比较运算符"小于"
  • lte:比较运算符"小于或等于"
  • as:由少数指令使用
  • in:由少数指令使用
  • using:由少数指令使用

5.废弃的 FTL 结构

下面这些指令不再可以运行:

  • 废弃的指令列表
  • 下面这些指令是废弃的,但是仍然可以运行:

  • call:使用 自定义指令调用 来代替。

  • comment:这是 <#--...--> 的老格式。 在 <#comment> 和 </#comment> 之间的任何东西都会被忽略。

  • foreach: 它是 list 指令的代名词,有着略微不同的参数语法。它的语法结构是 <#foreach item in sequence>,和 <#list sequence as item>是相同的。

  • transform: 使用 自定义指令调用 来代替

  • 遗留的 function:起初 function 是被用作定义宏,现在由 macro 指令完成,它就被废弃了。 对于 FreeMarker 2.3 版本来说,这个指令由于不同的意义而再次引入: 它被用来定义方法。

  • 废弃的内建函数列表
  • 下面这些内建函数是被废弃的,但是仍可以运行:

  • default:由于 默认值操作符 的引入,它被废弃了。exp1?default(exp2) 和 exp1!exp2 是相同的, (exp1)?default(exp2) 和 (exp1)!exp2 是相同的。 唯一的不同是在 FreeMarker 2.4 版本之前,内建函数 default 通常算作是 exp2,而默认值操作符仅仅当默认值真的需要时才算。 从 FreeMarker 2.4 版本之后,内建函数 default 被改进了, 和默认值运算符的行为非常像了。

  • exists:由于 空值测试操作符 的引入,它被废弃了。 exp1?exists 和 exp1?? 是一样的, (exp1)?exists 和 (exp1)?? 也是一样的。

  • if_exists:由于 默认值操作符 的引入,它被废弃了。 exp1?if_exists 和 exp1! 相似, (exp1)?if_exists 和 (exp1)! 相似。不同之处在于, 用 if_exists 的默认值不仅仅同时是空字符串,空序列和空哈希表, 而且布尔值 false 和不做任何事情的变换,还有忽略所有参数。

  • web_safe:和 html 相同。

  • 老式的 macro 和 call 指令
  • 概要
  • 描述
  • 宏是关联名称的模板段。你可以在你的模板中的很多位置使用命名的代码段, 所以它可以在重复的任务中帮助你。宏可以有参数,这会在你调用它的时候影响生成的输出。

  • 你可以使用 macro 指令来定义宏,之后你可以在整个模板中定义宏。 macro 指令本身不往输出中写任何东西,它只是用来定义宏。 例如这会定义一个名为 warning 的宏:

  • 转换指令
  • 概要
  • 描述

捕捉生成在它体内(也就是开始标签和结束标签之间)的输出, 之后让给定的转换物在写入最终的输出之前改变。

  • 老式 FTL 语法
  • 在FTL标签中使用 # 形式的FTL语法已经是不要求 (在 2.1 版本之前是不允许的)的了。比如,你可以这样写代码:

    <html>
    <head><title>Welcome!</title>
    </head>
    <body><h1>Welcome ${user}!</h1><p>We have there animals:<ul><list animals as animal><li>${animal.name} for ${animal.price} Euros</list></ul><include "common_footer.html">
    </body>
    </html>

    而没有 # 样式语法的代码对于HTML作者来说更加自然, 它有很多的缺点,所以最终我们决定废弃它。使用新式语法(又称为"严格的语法"), # 是严格要求的。也就是说,像 <include "common_footer.html"> 这样的东西将会原样出现在输出中,因为它们不被认为是FTL标签。 注意用户自定义指令使用 @ 代替 #

    然而,为了给用户时间来准备这种改变,在 FreeMarker 2.1 和 2.2 版本中, # 的用法是可选的,除非程序员调用 Configuration 的 setStrictSyntaxMode(true) 在 FreeMarker 配置中开启严格语法模式。 事实上,我们把这个强烈建议给程序员。从后续释出版本开始,这个设置将会初始设置为 true。而且,如果你在模板文件中想使用严格语法或老式语法,你可以用 ftl 指令来指定。

    "严格语法"比遗留的FTL语法的好处是:

  • 对于FTL来说,所有 <#...> 和 </#...> 都是保留的:

    • 我们可以引入新的指令而不破坏向后兼容。

    • 我们可以检测你是否创留了一个打字错误,也就是 <#inculde ...> 被视为解析时的错误, 而不是被静默地视为简单文本。

    • 对于第三方工具来处理模板(比如高亮语法显示)来说是简单的, 特别是因为它们不需要知道新释出版本中被引入的新指令。

    • 模板更易于阅读,因为很容易辨认嵌入在HTML或其他标记中的 <#...> 标签。

  • <# 和 </# 是合法的XML (除了在CDATA段中),而且其他大多数SGML应用中也是合法的, 所以它们不能妨碍用在静态文本部分(比如你在生成的XML中有 include 元素)的标签。

  • #{...}: 数字插值
  • 已经被废弃了:使用 number_format 设置项 和 the string 内建函数 来代替。对于计算机使用 (也就非本地的格式化)的格式化,使用 c 内建函数 (比如 number?c)。

  • 概要
  • 描述

20200427 FTL 模板语言参考 梳理 (常用)相关推荐

  1. freemarker常用标签 ftl模板文件常用标签

    freemarker常用标签 ftl模板文件常用标签 1.注释 <#–-–>格式不会输出 2 list循环 <#list datalist as entity>     ${e ...

  2. Jinja2常用模板语言(条件判断if,循环遍历for,过滤器)

    python开发前后端不分离web项目的时候,前端通常使用jinja2模板语言.现在介绍一下jinja2模板语言的基本语法. 普通变量 变量表示 格式:{{ 变量名 }} @app.route('/s ...

  3. freeMarker(十)——模板语言之内建函数

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.字符串内建函数 这些内建函数作用于表达式左侧的字符串值. 如果左侧 ...

  4. FreeMarker模板语言开发(整理版)

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web ...

  5. Django模板语言(译)

    原文地址:https://docs.djangoproject.com/zh-hans/2.1/ref/templates/language/ 翻译日期:2019年3月8日-2019年3月9日 by: ...

  6. thymeleaf 模板语言简介

    参考网址: https://blog.csdn.net/mlin_123/article/details/51816533 1.1 Thymeleaf 在有网络和无网络的环境下皆可运行,而且完全不需启 ...

  7. 小白必看!Django 模板语言基础来啦

    作者 | 单雨 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 前言 为了实现模板封装和复用,提高HTML界面调试便捷性以及前后端解耦等目标,Django定义了自己的网络模板语言. 当 ...

  8. freeMarker(十二)——模板语言补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.特殊变量参考 特殊变量是由FreeMarker引擎自己定义的变量. ...

  9. symfony框架Twig模板语言的使用

    php的Twig模板语言:类似python的jinja2,语法什么的都是类似python 文档 https://twig.symfony.com/doc/3.x/intro.html 模板继承 模板路 ...

  10. Python轻量级Web框架Flask(4)——Flask会话技术和Flask模板语言

    1.客户端会话技术: 会话:服务器端和客户端之间的交互 一个服务器可以被多个浏览器访问,他们之间是通过http协议来完成访问的(1.先请求,后响应:2.响应后会断开连接:3.一次请求就结束了),coo ...

最新文章

  1. react中js文件中写html,javascript – 使用静态HTML与React
  2. 工欲善其事必先利其器系列之:在VS里面折叠js代码
  3. 数据分割-并查集+set
  4. Vue 框架-05-动态绑定 css 样式
  5. android之修改gradle源
  6. 哈希值之逆序数与变进制
  7. Running Hero.
  8. 盲盒商城源码|盲盒商城app开发的模式玩法、功能以及开发流程介绍,多套盲盒源码现成案例。让您在了解盲盒项目开发中少走弯路,少踩坑。
  9. 科学计算机imissyou,imissyou是什么意?imissyou – 手机爱问
  10. 南山驿站机器人_fc机器人大战钢铁之魂攻略
  11. 关于图像处理中的矩阵卷积运算
  12. 三级等保测评,如何通过验收
  13. Mac 禁止插上手机自动启动iTunes
  14. ISCW实验11:使用SDM配置Site-to-Site IPSec ×××
  15. java未来三年的工作计划_个人未来三年工作计划
  16. 2021前端智能化发展现状与未来展望
  17. 移动UI设计学习总结
  18. 腾讯云服务器基础使用方法
  19. Prometheus监控模板
  20. python turtle怎么画海绵宝宝_画师绘制海绵宝宝性转拟人,派大星变小帅哥,又脑补一出甜蜜大戏...

热门文章

  1. Photoshop 2021(Ps)下载安装及详细安装教程
  2. PCB Layout
  3. 《植物大战僵尸》网页版!火热试玩当中
  4. SHFileOperation 文件拷贝、移动、删除等操作
  5. 数据不落地、移动新应用、安全更可靠
  6. jpg格式如何转eps路径_jpg/png格式图片转eps格式的方法总结
  7. attrib批量显示文件夹_BAT遍历目录并去掉文件夹隐藏属性
  8. Selenium + C# 实现模拟百度贴吧签到 2
  9. adobe flash java_Adobe 发布最后的 Flash 更新:官方强烈建议立即卸载
  10. 自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第四节