#FreeMarker FreeMarker官网
FreeMarker是模板引擎
##问题 我们希望在html页面当中显示我们的内容,但是所要显示的内容并不是静态的,而是动态的,根据不同显示不同html页面。从程序仅仅只对内容发生变化,html、css等都没有发生变化。
我们可以把这些内容以${key_name}
的形式,而是动态的值,所显示的内容与传递的数据有关系。在根据数据模型填写进入html页面的对应位置中。
##数据模型 模板引擎:指把模板和数据模型整合到一起。
数据模型,并非我们想象的如下内容
实际是更复杂的树状结构
从如下结构我们可以得知,不光是数字,字符串类型,还有可能是对象等内容。我们把animals这样的对象称作hashes,实际上就是hash表。我们把具体的key-value,value是字符、数字等称作scalars。
这样我们可以从root按照路径的方式进行访问。
##模板 浅蓝色部分的我们称作文本,文本不会发生变动,作为常量。在这里写的内容,在模板转换后,并不发生变化,直接传出。
绿色部分的称为注释,与代码中注释是一样的效果,永远不会传出。不发生任何作用,最终不会输出。
黄色内容,我们称作FTL标签:指令,如下的模板标签由两个组成了一条指令
橙色部分称作,插值:表达式。最终表达式进行计算,或者替换。
所以对于模板来说最终要的有两点,指令和表达式。
##指令
- 开始标签:<#directivename parameters>
- 结束标签:</directivename>
常用指令if,list,include指令
###if指令 简单的if指令
<#if user == "Big Joe">
balabala
</#if>
if-else编写
<#if xxxx>
balabala
<#elseif xxxx>
balabala
<#else>
balabala
</#if>
###list指令 我们最终想要的把数据列表使用list指令进行显示
<#list aniamls as animal>
balabala ${animal.name}:${animal.price}
</#list>
###include指令 举例来说,我们页面上由多个相同部分组成,如header,sidebar,footer等。前段页面上,每个页面都是这些内容。显示内容一致。所以我们通过include,直接把模板加载到页面当中。
##表达式
-
直接指定值
-
- 字符串:"Foo"或者'Foo'
-
- 数字:123.56
-
- 布尔值:true,false
-
- 序列:["foo","bar",123.45],值域:0..9,0..<10
-
- 哈希表:{"name":"green mouse","price":150}
-
检索变量 - 检索数据模型
-
- 顶层变量:user
-
- 哈希表数据:user.name、user["name"]
-
- 列表数据:products[5]
-
连接操作
-
- users + ["guest"]
-
- passwords + {"joe":"secret42"}
-
- "Hello" + user + "!"
-
算术运算、比较运算、逻辑操作
##使用FreeMarker 在没有模板的情况下使用FreeMarker
- 创建配置
在Spring中的FreeMarker需要设置模板路径、模板的编码等内容。通过Configuration的类指定路径,修改编码。一般在项目启动的时候,配置示例,而不需要每次启动在执行示例。
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg.setDirectoryForTemplateLoading(
new File("/Users/winpro/Documents/CourseProject/freemarker/src/main/resources"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
-
定义模板
-
数据模型
-
定义数据模型
以Map的形式定义数据模型
以对象的形式定义数据模型
#代码示例
package freemarker;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
/**
* Created by yanfa on 2016/10/29.
*/
public class HavaTestFreeMarker {
public static void main(String [] args) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg.setDirectoryForTemplateLoading(
new File("D:\\ZhanPeng\\Workspace\\J2ee\\SpringStudy\\spring-web-view\\src\\main\\webapp\\WEB-INF\\freemarker"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Template freeMarkerTemplate = cfg.getTemplate("login_user.ftl");
Map<String, Object> root = new HashMap<String, Object>();
root.put("username", "ZhanPeng");
root.put("password", "password");
Writer out = new OutputStreamWriter(System.out);
freeMarkerTemplate.process(root, out);
}
}
在Spring中例子的login_user.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>用户信息</title>
</head>
<body>
<p>FreeMarker通过如下方式引用Model的数据</p>
<p>Username:${username}</p>
<p>Password:${password}</p>
</body>
</html>
输出结果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>用户信息</title>
</head>
<body>
<p>FreeMarker通过如下方式引用Model的数据</p>
<p>Username:ZhanPeng</p>
<p>Password:password</p>
</body>
</html>