FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。 官方网址:http://freemarker.org/ 这里有一个可以在线测试FreeMaker的网站:http://freemarker-online.kenshoo.com/。大家在学习的时候,可以试试。 另外,还有一个模板引擎Velocity,也是非常出名的。
FreeMaker在几个常用的IDE中都有语法高亮提示的插件, 具体怎么安装可以查考这里(http://freemarker.org/editors.html)。 多说一句,如果没有语法高亮功能的编辑器,基本上就不能用,所以插件还是很有必要的。
下面是一段利用FreeMarker的API生成一个XML文档的例子(其中的User类您可以自己写一个,只要有name和age属性即可): [codesyntax lang="java"]
import java.awt.Desktop;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
/**
* 这是一个使用Freemarker生成XML文件的Helloworld。需要添加下面的的Maven依赖:
* <pre>
* {@code
* <dependency>
* <groupId>org.freemarker</groupId>
* <artifactId>freemarker</artifactId>
* <version>2.3.22</version>
* </dependency>
* }
* </pre>
* 本程序执行完毕后会将输出文件直接打开。
* @author suren
* @date 2015年12月16日 上午8:12:27
*/
public class Test {
/**
* TODO
* @param args
* @throws IOException
* @throws ParseException
* @throws MalformedTemplateNameException
* @throws TemplateNotFoundException
* @throws TemplateException
*/
public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
@SuppressWarnings("deprecation")
Configuration conf = new Configuration();
Template template = conf.getTemplate("target/classes/users.xml");
File outFile = new File("d:/test.log");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
List<User> userList = new ArrayList<User>();
userList.add(new User("name1", 12));
userList.add(new User("name2", 13));
userList.add(new User("name3", 14));
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("userList", userList);
template.process(dataMap , out);
out.flush();
out.close();
Desktop.getDesktop().open(outFile);
}
}
[/codesyntax] 下面是模板文件: [codesyntax lang="xml"]
<?xml version="1.0" encoding="UTF-8"?>
<#list userList as user>
<user>
<name value="${user.name}" />
<age value="${user.age}" max=<#if user.age == 12>"true"<#else>"false"</#if> />
</user>
</#list>
[/codesyntax]
<#if parameters.runtimes??></#if>
这里是runtimes不为空的判断
<#if parameters.autostart!false></#if>
这里是当变量autostart为null或者不存在时给指定的默认值
${options}.autostart = ${parameters.autostart?string("true", "false")};
这里将autostart从布尔值变为字符串类型
<#if (!autostart?? || autostart!=true) && (!start?? || start!=true)></#if>
这是一个多层嵌套的逻辑判断,意思是autostart不存在或者值不为true,并且start不存储或者start的值不为true
这里的宏类似于函数的感念,可以重复调用。macro后的第一个字符串是宏名称(hanshuming),从第二个开始就是参数名了。在调用宏的时候,参数的顺序不做要求。 [codesyntax lang="xml"]
<#macro print count>
<#if count gte 0>
${count}
<#assign a=count-1>
<@print count=a></@print>
</#if>
</#macro>
<@print count=12></@print>
[/codesyntax] 在定义宏的时候,可以给参数添加默认值,有默认值的参数在调用的时候可以不赋值:
<#macro print count other=12>
在宏定义里还可以使用嵌套,如下: [codesyntax lang="xml"]
<#macro print count other=12>
<#if count gte 0>
${count}---${other}<#nested>
<#assign a=count-1>
<@print count=a><#nested></@print>
</#if>
</#macro>
<@print count=12>hereis nested</@print>
[/codesyntax]
这里是官方的使用手册:http://freemarker.org/docs/index.html
FreeMaker百度百科 http://blog.sina.com.cn/s/blog_812a917c0100u0q8.html