Freemarker是java的免费模板引擎,主要用于MVC中的view层,生成html展示数据给客户端,可以完全代替jsp。FreeMarker是一个模板引擎,一个机遇模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中,然后输出页面。它能够生成各种文本:Html,XML,RTF源代码等,而且不需要Servlet环境,并且可以从任何源载入模板,如程序生成,本地文件,数据库等等。
主要应用场景:用来生成HTML今天化页面进行缓冲,静态化页面,降低服务器计算压力,用于生成各种文本数据。
本案例是新手案例,基本生成静态化页面:
freemarker基本概念:
模板:
用于定义生成格式文件,在其中包含一些动态改变的命令,用于接受数据模型,生成对应的格式文件。
数据模型:
用于给模板提供数据,定义了一个树型结构用于存储数据。
注:数据模型不是文本文件,对于java语言来说,root就像有getUser()和getLatestProduct()方法的java对象。
freemarker常用语法:
${…}:FreeMarker将会输出真实的值来替换大括号内的表达式。(jsp的类似EL表达式)
FTL标签:属于FerrMarker的指令模式不会在输出文本中打印的,这些标签以#开头
注释:使用<#--…-->
其他任何不是FTL标签,插值或注释的内容将被视为静态文本, 这些东西不会被FreeMarker所解析;会被按照原样输出出来。
指令:
if指令:<#if 表达式>显示的内容</#if>
使用if指令可以跳过一些不想显示的内容。
如:
Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
如果表达式为true,则显示后面的内容,否则不显示。
else指令:<#if condition>…<#else>….<#if>
list指令:
用于显示列表数据
<#list users as user>
<H1>User.getName()</H1>
<#list>
如果Users中没有人,它仍然会输出<h1></h1>,为了避免这种情况:
则:
<#list misc.fruits>
<ul>
<#items as fruit>
<li>${fruit}
</#items>
</ul>
</#list>
此时list会被视为一个整体,如果Users为空则不会输出<ul>
分隔符:
要求获取人名后需要分割符,则:
<#list users as user>
<H1>User.getName()<#sep>,</#sep></H1>
<#list>
list指令还可以与else搭配进行使用:
<#list misc.fruits>
<p>Fruits:
<ul>
<#items as fruit>
<li>${fruit}<#sep> and</#sep>
</#items>
</ul>
<#else>
<p>We have no fruits
. </#list>
Include指令:
使用include指令,我们可以在模板中插入其他文件内容:
<#include "/copyright_footer.html">
处理不存在的变量!:
可以使用!来标记不存在的变量,给与默认值:
<h1>Welcome ${user!"visitor"}!</h1>
可以通过??来访问一个变量是否存在。
<#if user??><h1>Welcome ${user}!</h1></#if>
使用案例:
public class Demo01 {
public static void main(String[] args) throws Exception {
//1.创建cfg
Configuration cfg=new Configuration(Configuration.VERSION_2_3_22);
cfg.setDirectoryForTemplateLoading(new File("temp"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
//2.创建数据模型
Map<String, Object> root=new HashMap<String, Object>();
root.put("user", "nan");
Map<String,Object> latest=new HashMap<String, Object>();
latest.put("url", "prodects.html");
latest.put("name", "green mouse");
root.put("product", latest);
//3.加载模板
Template temp=cfg.getTemplate("test.ftl");
//4.合并模板和数据模型
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
}
}
Test.ftl:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${product.url}">${product.name}</a>!
</body>
</html>
输出:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome nan!</h1>
<p>Our latest product:
<a href="prodects.html">green mouse</a>!
</body>
</html>
官方汉化文档:http://freemarker.foofun.cn/dgui_quickstart_template.htm