第一章 简介
1 什么是FreeMaker
FreeMaker是一款模板引擎,即基于模板,用来生成文本的工具。可以用来实现MVC模式。FreeMaker基于BSD协议。是ISO认证的开源软件。
2. 简介
如果你的在线商店需要这样的页面如:
<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome tntxia!</h1> <p>Our latest product: <a href="products/greenmouse.html">green mouse</a>! </body> </html>
这里tntxia是用户名。应该使用动态。
FreeMaker是这样实现的。
<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Our latest product: <a href="${latestProduct.url}">${latestProduct.name}</a>! </body> </html>
FreeMaker可以使用Map、List对象,也可以自定义的数据模型。
${…}:FreeMaker会使用动态的数据改成$里面的内容。
FTL tags 标签(FreeMarker 模板的语言标签) :与HTML标签相似,一般以#开关,但也可以自定义。
Comments 注释:<#-- -->
可以增加一个Servlet:
package com.tntxia.freemaker.test; import java.io.IOException; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class HelloFreeMarker extends HttpServlet { /** * */ private static final long serialVersionUID = 6255189103129788283L; public HelloFreeMarker() { super(); } // 负责管理FreeMarker模板的Configuration实例 private Configuration cfg = null; public void init() throws ServletException { // 创建一个FreeMarker实例 cfg = new Configuration(); // 指定FreeMarker模板文件的位置 cfg.setServletContextForTemplateLoading(getServletContext(), "/WEB-INF/templates"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 建立数据模型 Map root = new HashMap(); root.put("message", "hello world"); root.put("name", "聂靖宇"); root.put("num", 5); DataModel data = new DataModel(); root.put("data", data); // root.put("personList", list); // 获取模板文件 Template t = cfg.getTemplate("test1.ftl"); // 开始准备生成输出 // - 使用模板文件的Charset作为本页面的charset // - 使用text/html MIME-type response.setContentType("text/html; charset=" + t.getEncoding()); Writer out = response.getWriter(); // 合并数据模型和模板,并将结果输出到out中 try { t.process(root, out); // 往模板里写数据 } catch (TemplateException e) { e.printStackTrace(); } } public void destroy() { super.destroy(); } }
在WEB-INF里面增加一个template的文件,增加一个FTL文件:
test1.ftl
<html> <head> <title>Hello Word</title> </head> <body> <#-- 测试注释 --> <h3>${message},${name} ${data.test}</h3> <#if num > 5 >num is 5</#if> </body> </html>
1.1 指令
1.1.1 if指令
<#if user == "Big Joe">, our beloved leader</#if>!
通过if指令,可以让符合条件的内容显示。
当condition 的判断结果为 false(布尔值)时,在<#if condition>和</#if>标签之间的内容将会被略过。
使用<#else>标签可以指定当条件为假时程序执行的内容。例如:
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#else> Pythons are not cheaper than elephants today. </#if>
1.1.2 list指令
用List指令可以实现循环输出
如:
<p>We have these animals: <table border=1> <tr><th>Name<th>Price <#list animals as being> <tr><td>${being.name}<td>${being.price} Euros </#list> </table>
list 指令的一般格式为:
<#list sequence as loopVariable>repeatThis</#list>
repeatThis 部分将会在给定的sequence 遍历时在每项中重复,从第一项开始,
一个接着一个。在所有的重复中,loopVariable 将持有当前项的值。这个循环变量仅
存在于<#list …>和</#list>标签之间。
1.1.3 include指令
引入一个模板:
<#include "test.ftl">