一、简介
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。其原理如下图所示:
FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,没有被绑定到Servlet或HTML或任意Web相关的东西上,它也可以用于非Web应用环境中。
FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP,故此FreeMarker不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等各种文本文件。总之,FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部Java程序通过数据库操作等生成数据传入模板(template)中,然后输出页面。它能够生成各种文本:HTML、XML、RTF、Java源代码等等,而且不需要Servlet环境,并且可以从任何源载入模板,如本地文件、数据库等等。
二、使用
引包
<dependency>
<groupId>org.FreeMarker</groupId>
<artifactId>FreeMarker</artifactId>
<version>2.3.29</version>
</dependency>
spring应用可以这样使用
compile"org.springframework.boot:spring-boot-starter-freemarker:$springBootVersion"
具体使用过程
// 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对于的版本号。
Configuration configuration = new Configuration(Configuration.getVersion());
// 第二步:设置模板文件所在的路径。
configuration.setDirectoryForTemplateLoading(new File("/WEB-INF/ftl"));
// 第三步:设置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("hello.ftl");
// 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
Map dataModel = new HashMap<>();
//向数据集中添加数据
dataModel.put("hello", "this is my first FreeMarker test.");
// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(new File("/hello.html"));
// 第七步:调用模板对象的process方法输出文件。
template.process(dataModel, out);
// 第八步:关闭流。
out.close();
三、实例
创建一个模版xxx.ftl,我创建的是student.ftl,置于/templates文件夹下
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
</tr>
<#list studentList as student>
<tr>
<td> ${student.name}</td>
<td>${student.age}</td>
</tr>
</#list>
</table>
因为是引了springboot的freemarker模块,springboot自动生成了一个FreeMarkerConfigurer 的bean,不需要自己去new了。使用FreeMarkerConfigurer 创建一个template的bean,设置template的模版路径为student.ftl【相对FreeMarkerConfigurer 设置的,模版文件路径,默认为/templates】
@Configuration
public class FreeMarkerTemplateConfig {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Bean
public Template studentTemplate() throws IOException {
return freeMarkerConfigurer.getConfiguration().getTemplate("student.ftl");
}
}
使用时引用tempate bean,将模版所需的参数设置到map中,调用tempate 的process函数,根据模版及绑定参数生成结果
@Autowired
private Template studentTemplate;
@Test
public void testFreeMarker() {
Student student = new Student();
student.setName("张三");
student.setAge(13L);
Student student1 = new Student();
student1.setName("李四");
student1.setAge(14L);
Writer writer = new StringWriter();
try {
Map<String, List<Student>> param = new HashMap<>();
param.put("studentList", Arrays.asList(student, student1));
studentTemplate.process(param, writer);
} catch (Exception e) {
}
String s = writer.toString();
}
生成的结果如下
参考:http://www.freemarker.net/