freemarker
Freemarker的基本语法及使用大全
freemarker的基本语法及入门基础
- 文本:直接输出的内容部分
- 注释:不会输出的内容,格式为<#-- 注释内容 -->
- 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}
- ftl指令:Freemarker指令,类似于HTML标记。
- 内建指令:开始标签:
<#directivename parameter>
结束标签:</#directivename>
空标签:<#directivename parameter/>
- 自定义指令:开始标签:
<@directivename parameter>
结束标签:</@directivename>
空标签:<@directivename parameter/>
- 内建指令:开始标签:
字符串
字符串输出 ${param}
字符串输出-首字母大写 ${param?uncap_first}
list
循环遍历
可以使用Freemarker提供的<#list>指令来遍历对象集合。具体实现方式如下:
freemarker
<#list objectList as item>
${item.property1}, ${item.property2}
</#list>
其中,objectList
表示你要遍历的对象集合名称,item
则是集合中的每一个对象,你可以通过${item.property}
来获取每个对象的属性值。循环体内的内容则是你需要对每个对象执行的操作。
例如,对一个用户列表进行遍历,代码实现如下:
freemarker
<#list userList as user>
<li>${user.name}(${user.age}岁)</li>
</#list>
这段代码可以将用户列表中每个用户的姓名和年龄输出到一个无序列表中。
处理最后一次循环遍历
在 FreeMarker 中,可以使用 list
指令结合内置变量 index
和内置变量 size
来判断当前循环是否为最后一次循环。下面是一个示例程序,演示如何在 FreeMarker 中使用 list
指令和 if
指令判断是否为最后一次循环:
ftl
<#list items as item>
<#if item_index + 1 == items?size>
The last item is: ${item}
</#if>
</#list>
在上述示例程序中,item_index
表示当前循环的迭代次数。items?size
表示列表的元素个数。我们使用 item_index + 1
判断当前循环是否为列表的最后一次循环,如果是,则输出 "The last item is: item"。
除了使用 if
指令来判断最后一次循环,还可以使用 if
和 else
指令来分别处理最后一次和非最后一次的情况。下面是一个使用 if
和 else
指令的示例程序:
ftl
<#list items as item>
<#if item_index + 1 == items?size>
The last item is: ${item}
<#else>
${item},
</#if>
</#list>
在上述示例程序中,如果当前循环不是最后一次,输出当前元素和逗号;否则输出最后一个元素,不输出逗号。这样可以使输出的结果更加符合语言的语法规范。
总之,在 FreeMarker 中,使用 list
指令结合内置变量 index
和内置变量 size
来判断当前循环是否为最后一次循环是非常常见的操作。可以根据实际情况使用相应的语法。
判断包含x值
可以使用Freemarker的内建函数来判断一个List是否包含某个值。以下是一个示例:
xml
<#assign myList = ["apple", "banana", "orange"]>
<#if myList?seq_contains("banana")>
List contains "banana"
<#else>
List does not contain "banana"
</#if>
在上面的示例中,我们首先声明了一个List myList,包含了三个元素。然后使用内建函数?seq_contains来判断List是否包含了值"banana"。如果包含,则输出"List contains 'banana'",否则输出"List does not contain 'banana'"。
if
在 FreeMarker 中,可以使用 if 指令来实现条件判断。if 指令的语法格式如下所示:
ftl
<#if condition>
<!-- 如果 condition 为 true 执行此部分代码 -->
<#elseif condition2>
<!-- 如果 condition2 为 true 执行此部分代码 -->
<#else>
<!-- 如果所有条件都不为 true 执行此部分代码 -->
</#if>
在 FreeMarker 中,可以使用一系列运算符来组合条件表达式,例如:==、!=、<、>、<=、>=、&&、|| 等等。下面是一个示例程序,演示如何在 FreeMarker 中使用 if 指令实现条件判断。
ftl
<#if amount > 500>
<h1>You are a VIP customer!</h1>
<#elseif amount > 100>
<p>You are a premium customer.</p>
<#else>
<p>You are a regular customer.</p>
</#if>
在上述示例程序中,如果 amount 大于 500,将会显示 "You are a VIP customer!";如果 amount 大于 100 小于等于 500,将会显示 "You are a premium customer.";否则将会显示 "You are a regular customer."。
除了简单的数值比较,我们也可以使用变量、表达式和函数等来构建更加复杂的条件表达式。例如,下面的示例程序演示了如何在 FreeMarker 中使用 if 指令结合函数和变量实现更加灵活的条件判断:
ftl
<#if user ? has_content && user.getAge() > 18>
<h1>Welcome, ${user.getName()}!</h1>
<#else>
<p>Sorry, you are not eligible to access this page.</p>
</#if>
在上述示例程序中,判断是否有 user 变量,并且该变量的年龄大于 18 岁,如果条件成立,则输出欢迎信息,否则输出提示信息。
总之,在 FreeMarker 中,if 指令是非常常用且灵活的指令,可以帮助我们方便地实现不同的条件判断。
if 字符串判断
在 FreeMarker 中,字符串的相等判断可以使用 ==
或 equals
方法进行比较。下面是一个示例程序,演示如何在 FreeMarker 中使用 if
指令实现字符串的相等判断。
ftl
<#if name == "John">
<p>Hello John!</p>
<#else>
<p>Hello stranger!</p>
</#if>
在上述示例程序中,如果 name
的值等于 John
,将会显示 "Hello John!";否则将会显示 "Hello stranger!"。
除了 ==
,我们也可以使用 equals
方法进行字符串的相等比较。下面是一个示例程序,演示如何使用 if
指令结合 equals
方法实现字符串的相等判断:
ftl
<#if name?has_content && name.equals("John")>
<p>Hello John!</p>
<#else>
<p>Hello stranger!</p>
</#if>
在上述示例程序中,name.equals("John")
表示 name
的值是否等于 John
。如果成立,则输出 "Hello John!",否则输出 "Hello stranger!"。
总之,在 FreeMarker 中,使用 if
指令进行字符串的相等比较非常常见,可以帮助我们方便地根据不同的条件来展示内容或执行操作。
在 FreeMarker 中,可以使用
==
操作符或equals()
内置函数进行等值判断。但是在使用equals()
函数时,需要注意调用方法的对象是否存在或是否为 null,否则会出现null pointer exception
异常。使用
==
操作符进行等值判断不会引起空指针异常,因此可以避免上述异常信息的出现。
if 非空判断
在 FreeMarker 中,可以使用 if
指令结合 FreeMarker 内置函数来进行非空判断。下面是一些常见的方法:
- 使用 if 指令和 exists 内置函数进行非空判断
ftl
<#if str?exists>
<!-- 处理非空逻辑 -->
</#if>
在上述代码中,我们使用 str?exists
表达式来判断 str
变量是否存在且非空。只有当该条件为真时,才会执行处理非空逻辑。
- 使用 if 指令和 has_content 内置函数进行非空判断
ftl
<#if str?has_content>
<!-- 处理非空逻辑 -->
</#if>
在上述代码中,我们使用 str?has_content
表达式来判断 str
变量是否存在且非空。如果该变量存在,且其值不是空字符串、空列表、空 Map 或空序列,则该表达式为真,只有当该条件为真时,才会执行处理非空逻辑。
总之,以上提及的两种方法是 FreeMarker 中比较常用的非空判断方法。可以根据具体情况选择使用哪种方式。在使用时,应根据实际情况进行优化,避免不必要的空值判断。
空格标签
在 FreeMarker 中,可以使用空格标签来忽略空格和换行符之间的产生的空格。这样可以让模板代码更加美观易读,或者避免在输出 HTML 标签时产生不必要的空格和换行符,从而影响到页面的显示效果。
下面是一些常用的空格标签:
<#t>
空格标签
<#t>
空格标签是一个简单的标签,它会将前一个标签的输出的文本和后一个标签的输出的文本之间产生的空格忽略掉。它的语法格式如下:
<前一个标签><#t><后一个标签>
例如,可以使用 <#t>
标签来避免在输出 HTML 标签时产生不必要的空格和换行符。下面是一个示例代码,演示如何在 FreeMarker 中使用 <#t>
空格标签:
ftl
<div>
<span><#t></span>
<span>Some text</span>
<span><#t></span>
</div>
在上述示例代码中,我们使用了 <#t>
空格标签来忽略 span
标签之间产生的空格,从而输出更加美观的 HTML 代码。
<@noparse>
空格标签
<@noparse>
空格标签是一个高级的标签,它可以将标签之间的文本全部作为字符串处理,从而避免 FreeMarker 渲染引擎对它进行处理。它的语法格式如下:
<@noparse><标签></@noparse>
例如,可以使用 <@noparse>
标签来输出 Raw HTML,防止 FreeMarker 引擎将 HTML 代码进行解析。下面是一个示例代码,演示如何在 FreeMarker 中使用 <@noparse>
空格标签:
ftl
<@noparse><input type="text" placeholder="Type something"><@/noparse>
在上述示例代码中,我们使用了 <@noparse>
空格标签来输出 Raw HTML,保证输入框的 HTML 代码不会被 FreeMarker 渲染引擎进行解析。
总之,以上提及的两种空格标签在 FreeMarker 中都有广泛的应用。它们可以帮助模板代码更加美观易读,或避免在输出 HTML 标签时产生不必要的空格和换行符,从而影响到页面的显示效果。
demo
java
public class FreeMarkerConsoleEx {
public static void main(String[] args) throws IOException,
TemplateException {
Configuration cfg = new Configuration(new Version("2.3.23"));
cfg.setClassForTemplateLoading(FreeMarkerConsoleEx.class, "/");
cfg.setDefaultEncoding("UTF-8");
Template template = cfg.getTemplate("test.ftl");
Map<String, Object> templateData = new HashMap<>();
templateData.put("msg", "Today is a beautiful day");
try (StringWriter out = new StringWriter()) {
template.process(templateData, out);
System.out.println(out.getBuffer().toString());
out.flush();
}
}
}