FreeMarker是一个用Java编写的模板引擎,主要用来生成HTML Web页面,特别是基于MVC模式的应用程序。FreeMarker基本可以取代JSP作为表现层技术。
FreeMarker官网http://freemarker.org/
FreeMarker输出=模板+数据模型
- 简单示例
新建模板文件test.ftl
<root name="${root}"> <id>${elements.id}</id> <name>${elements.name}</name> <age>${elements.age}</age> <city>${elements.city}</city> </root>
新建测试类
// 创建一个合适的configuration
Configuration cfg = new Configuration();
// 获取或创建一个模版
Template template = cfg.getTemplate("src/test.ftl");
// 创建一个数据模型
Map<String, Object> root = new HashMap<String, Object>();
root.put("root", "root");
Map<String, Object> elements = new HashMap<String, Object>();
root.put("elements", elements);
elements.put("id", "1");
elements.put("name", "yel");
elements.put("age", "30");
elements.put("city", "WH");
//打印到控制台
Writer out = new OutputStreamWriter(System.out);
//生成到文件
Writer outFile = new OutputStreamWriter(new FileOutputStream("src/test.xml"), "utf-8");
template.process(root, out);
template.process(root, outFile);
out.close();
outFile.close();
首先加载模板文件test.ftl,封装在Template类中。数据模型封装在Map<String, Object>。最后通过两个输出流分别在文件和控制台中输出。
同样的道理可以在servlet中用freemarker生成页面。
修改模板test.ftl,放到/WEB-INF/templates目录下面
<html> <body> <h3>${message},${name}</h3> </body> </html>
新建servlet
public class HelloFreeMarker extends HttpServlet {
// 负责管理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", "yel");
// 获取模板文件
Template t = cfg.getTemplate("test.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();
}
}
最后通过浏览器访问servlet后根据模板生成html页面。
- 常用标签
直接输出值
${}
判断
<#if name == "Yel">Hello,Yel</#if>
循环
<#list users as user>
<li>${user.name}
</#list>