FreeMarker 是一款 模板引擎
一、 在springboot项目 pom中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
二、 在application.yml中配置参数
spring:
application:
name: freemarker_demo
freemarker:
suffix: .ftl
template-loader-path: classpath:/templates
三、 新建请求
public class User {
private String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
@Controller
public class HtmlController {
@RequestMapping("/index")
public String index(ModelMap modelMap) {
User user =new User("理想","28");
modelMap.addAttribute("user",user);
return "index";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Index页面
<h1>访问者:${user.name}</h1>
<h1>访问者年龄:${user.age}</h1>
</body>
</html>
在浏览器中输入http://localhost:8081/index,成功获取网页访问者内容
四、 语法 参考 http://freemarker.foofun.cn/
${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值)。
FTL 标签(FreeMarker模板的语言标签)的名字以 # 开头。(用户自定义的FTL标签则需要使用 @ 来代替 #。)
注释: 注释和HTML的注释也很相似, 但是它们使用 <#-- and --> 来标识。不像HTML注释那样,FTL注释不会出现在输出中。
变量声明
变量会在模板开始时被创建,而不管变量声明放置在模板的什么位置
<#assign name=value>或者<#assign name>value</#assign>
:定义变量(非全局),注意在<#assign name>value</#assign>
value中不应插入变量<#macro name><#macro>
:宏变量(非全局),在模板中使用宏自定义指令变量,这样就能进行重复性的工作。通常将使用<@name...>
这称为 宏 调用。<#macro name><#nested><#macro>
:宏变量,嵌套指令执行位于开始和结束标记指令之间的模板代码段,可以嵌套模块。<#function name param1 param2 ... paramN>...<#return returnValue>...</#function>
:方法变量,和 macro指令的工作方式一样<#local name=value>
:局部变量,它和 assign 指令 类似,但是它创建或替换局部变量。 这仅仅在宏和方法的内部定义才会有作用。<#global name=value>
:全局变量,会覆盖同名模型变量,会被命名空间同名变量覆盖,可以通过${.globals.name}
获取变量name。<#import path as hash>
:hash
哈希表变量,在主命名空间中导入依赖库创建相关命名空间,用哈希表变量来访问该命名空间。
####其他指令
<#if [condition]></#if>
:使用 if 指令可以有条件地跳过模板的一些片段。<#if [condition]><#else></#if>
:使用 if else指令可以有条件地跳过模板的一些片段。<#if [condition]><#elseif [condition><#else></#if>
:使用 if elseif指令可以有条件地跳过模板的一些片段。<#list objlist as obj></#list>
:当需要列表显示内容时,objlist为空时依然执行一次。<#list objlist><#items as obj></#items></#list>
:当需要列表显示内容时,objlist为空时items被忽略。<#list objlist as obj>${obj}<#sep>, </#sep></#list>
:使用分隔符<#list objlist as obj>${obj}<#sep>,<#else>None</#list>
:使用分隔符,objlist为空,忽略分隔符<#include path></#include>
:使用 include 指令重用代码片段。- 内建函数
?
(类似Java中的方法)它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。使用 ?(问号)代替 .(点)来访问它们。 - 处理空值
${obj!"default"}
:变量为空或者不存在赋值默认值obj??
:??
判断obj是否为空,返回布尔值。obj.param1.param2!0
:只能判断param2为空的处理(obj.param1.param2)!0
:能判断obj、param1、param2为空的处理(obj.param1.param2)??
:能判断obj、param1、param2是否为空
<#break>
:可以使用 break 指令在迭代的任意点退出。<#return>
:return后面的模板内容将被忽略<#attempt>[module1]<#recover>[module2]</#attempt>
:module1出错将会执行module2,防止模块出错不输出内容<#compress>...</#compress>
:压缩空格指令,缩小所有不间断的空白序列到一个单独的空白字符。<#escape x as x?html>...${a}</#escape>=>${a?html}
:转义指令<#escape x as x?html>... <#noescape></#noescape></#escape>=>${a?html}
:noescape非转义指令和escape嵌套使用,标识非转义模块<#flush>
:冲洗指令<#ftl param1=value1 param2=value2 ... paramN=valueN>
:允许的参数有: encoding, strip_whitespace, strip_text 等。FreeMarker模板的配置信息<#noparse>...</#noparse>
:FreeMarker 不会在这个指令体中间寻找FTL标签 ,插值和其他特殊的字符序列,除了noparse的结束标记。<#nt>
:“不要削减”。该指令禁用行中出现的 剥离空白。 它也关闭其他同一行中出现的削减指令(t, rt,lt的效果)。<#t>
:(整体削减)忽略本行中首和尾的所有空白。<#lt>
:(左侧削减)忽略本行中首部所有的空白。<#rt>
:(右侧削减)忽略本行中尾部所有的空白。<#setting name=value>
:支持的设置有:locale、number_format、boolean_format、 date_format、 time_format、 datetime_format、time_zone、sql_date_and_time_time_zone 、url_escaping_charset、output_encoding、classic_compatible。<#stop>或<#stop reason>
:该指令抛出 StopException,而且 StopException 会持有 reason 参数的值。<#switch value><#case refValue1>...<#break><#default>...</#switch>
:这个指令的用法是不推荐的,因为向下通过的行为容易出错。使用 elseif来代替, 除非你想利用向下通过这种行为。</@>
:结束标签.如果表达式包含比简单变量名和点还多的表达式,你就不能再重复它们了。比如,<@a_hash[a_method()]>...</@a_hash[a_method()]>
就是错的,你必须写为<@a_hash[a_method()]>...</@>
。 但是<@a_hash.foo>...</@a_hash.foo>
是可以的。<#visit node>
:<#visit nodeWithNameX>
和<@x/>
类同<#recurse>
:是真正纯语义上的指令。 它访问结点的所有子结点(而没有结点本身)。<#fallback>
:fallback 指令可以被用在自定义指令中被调用处理结点。 它指挥 FreeMarker 在更多的命名空间 (也就是,在当前调用列表中自定义指令命名空间之后的命名空间) 中来继续搜索自定义指令。如果结点处理器被发现, 那么就被调用,否则 fallback 不会做任何事情。