freemarker API demo
FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具。它是为Java 程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。
FreeMarker 的设计实际上是被用来生成HTML 网页,尤其是通过基于实现了MVC(ModelView Controller,模型-视图-控制器)模式的Servlet 应用程序。使MVC 模式的动态网页的构思使得你可以将前端设计者(编写HTML)从程序员中分离出来。所有人各司其职,发挥其擅长的一面。网页设计师可以改写页面的显示效果而不受程序员编译代码的影响,因为应用程序的逻辑(Java 程序)和页面设计(FreeMarker 模板)已经分开了。页面模板代码不会受到复杂的程序代码影响。这种分离的思想即便对一个程序员和页面设计师是同一个人的项目来说都是非常有用的,因为分离使得代码保持简洁而且便于维护。
尽管FreeMarker 也有编程能力,但它也不是像PHP 那样的一种全面的编程语言。反而,Java 程序准备的数据来显示(比如SQL 查询),FreeMarker 仅仅使用模板生成文本页面来呈现已经准备好的数据。
freemarker说白了就是一个模板生成工具,模板+数据模型=输出。
一下为API中简单demo.
API与所需JAR在 http://download.csdn.net/detail/wangxuewei111/5248999
首先创建数据模型 UpperCaseTransform(根据该模型,可将传进来的字符串变成大写)
1 package com.wang; 2 3 import java.io.*; 4 import java.util.*; 5 import freemarker.template.TemplateTransformModel; 6 7 class UpperCaseTransform implements TemplateTransformModel { 8 public Writer getWriter(Writer out, Map args) { 9 return new UpperCaseWriter(out); 10 } 11 12 private class UpperCaseWriter extends Writer { 13 private Writer out; 14 15 UpperCaseWriter(Writer out) { 16 this.out = out; 17 } 18 19 public void write(char[] cbuf, int off, int len) throws IOException { 20 out.write(new String(cbuf, off, len).toUpperCase()); 21 } 22 23 public void flush() throws IOException { 24 out.flush(); 25 } 26 27 public void close() { 28 } 29 } 30 }
编写test1.ftl模板
<#--将一下字符串转换成大写--> blah1 <@upperCase> blah2 blah3 </@upperCase> blah4 <#--显示用户和链接--> <html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Our latest product: <a href="${latestProduct.url}">${latestProduct.name}</a>! </body> </html>
编写main方法Test
1 package com.wang; 2 3 import freemarker.template.*; 4 import java.util.*; 5 import java.io.*; 6 7 public class Test { 8 public static void main(String[] args) throws Exception { 9 /* 一般在应用的整个生命周期中你仅需要执行一下代码一次 */ 10 /* 创建一个合适的configuration */ 11 Configuration cfg = new Configuration(); 12 cfg.setDirectoryForTemplateLoading(new File( 13 "D:"+File.separator+"wang")); 14 cfg.setObjectWrapper(new DefaultObjectWrapper()); 15 /* 而以下代码你通常会在一个应用生命周期中执行多次 */ 16 /* 获取或创建一个模版 */ 17 Template temp = cfg.getTemplate("test1.ftl"); 18 /* 创建一个数据模型Create a data model */ 19 Map root = new HashMap(); 20 root.put("upperCase", new UpperCaseTransform()); 21 root.put("user", "Big Joe"); 22 Map latest = new HashMap(); 23 root.put("latestProduct", latest); 24 latest.put("url", "products/greenmouse.html"); 25 latest.put("name", "green mouse"); 26 SimpleHash root1 = new SimpleHash(); 27 //放置一个简单的String 对象 28 root1.put("theString", "wombat"); 29 //放置任意的一个java objects: 30 root1.put("theObject", new TestObject("green mouse", 31 1200)); 32 /* 合并数据模型和模版 */ 33 Writer out = new OutputStreamWriter(System.out); 34 temp.process(root, out); 35 out.flush(); 36 } 37 }
控制台输出:
=========================================================
此外,freemarker中还有自己的标签,如模板中<#-- -->即为注释标签,有时间整理出来添加。