FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包或者说是类库。 它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。
FreeMarker 不是 Web 应用框架。它是 Web 应用框架中的一个适用的组件,但是FreeMarker 引擎本身并不知道 HTTP 协议或 Servlet。它仅仅来生成文本。即便这样,它也非常适用于非 Web 应用环境的开发。要注意的是,我们使用 FreeMarker 作为视图层组件,是为给如 Struts 这样的 Model 2 框架提供现成的解决方案。
【例】入门例子
FreemarkerExample
package freemarker; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerExample { /** * @param args * @throws IOException * @throws TemplateException */ public static void main(String[] args) throws IOException, TemplateException { /* 在整个应用的生命周期中,这个工作你应该只做一次。 */ /* 创建和调整配置。 */ Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File("src/freemarker")); cfg.setObjectWrapper(new DefaultObjectWrapper()); /* 在整个应用的生命周期中,这个工作你可以执行多次 */ /* 获取或创建模板*/ Template temp = cfg.getTemplate("test.ftl"); /* 创建数据模型 */ Map<String ,Object> root = new HashMap<String ,Object>(); root.put("user", "Big Joe"); Map<String ,Object> latest = new HashMap<String ,Object>(); root.put("latestProduct", latest); latest.put("url", "products/greenmouse.html"); latest.put("name", "green mouse"); /* 将模板和数据模型合并 */ Writer out = new OutputStreamWriter(System.out); //输出到文件 //Writer out = new OutputStreamWriter(new FileOutputStream("D:/temp/helloword.html"),"GBK"); temp.process(root, out); out.flush(); } }
test.ftl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Welcome!</title> </head> <body> <h1>欢迎 ${user}!</h1> <p>Our latest product: <a href="${latestProduct.url}">${latestProduct.name}</a>! </body> </html>
数据模型的创建是通过已经存在的程序计算得到的。至于模板开发者,数据模型像是树状结构(比如硬盘上的文
件夹和文件),正如本例中的数据模型,就可以如下形式来描述:
(root)
|
+- user = "Big Joe"
|
+- latestProduct
|
+- url = "products/greenmouse.html"
|
+- name = "green mouse"
比较之前你在模板中看到的${user}和${latestProduct.name}。作为一种比喻:数据模型就像计算机文件系统上的内容:根 root 和 latestProduct 对应目录(文件夹),user,url和 name 对应文件。url和 name 在 latestProduct 目录中,所以 latestProduct.name 就像是说latestProduct 目录的 name 一样。但是我所说的,这仅仅是个比喻,这里并没有真实的文件和目录。
概括地讲,模板和数据模型是 FreeMarker 所需,并用来生成输出内容的(比如之前展示的 HTML) :模板+数据模型=输出