Freemarker介绍、使用并与Spring整合
一、什么是Freemarker
1.1 介绍
FreeMarker
是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker
与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
主要用Freemarker
做静态页面或是页面展示。
1.2 入门程序
首先导入依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.27-incubating</version>
</dependency>
在我的D盘下,存在文件夹flt
,用于存放模板文件;存在文件夹flt_out
,用于存放输出文件。
在flt文件夹下新建文件test.ftl,内容为:
${test}
是不是有点像EL表达式
,在EL表达式中使用model.addAttr..()
就可以替换掉JSP中的EL表达式了,Freemarker和它类似,其步骤大致如下:
- 创建
Configuration
对象,指定编码集和模板文件夹 - 创建
Template
对象,指定模板文件 - 准备数据
- 创建
Writer
对象,指定输出文件 - 生成模板
@Test
public void firstDemo() throws Exception {
//1、创建Configuration对象,指定编码集和模板文件夹
Configuration configuration = new Configuration(Configuration.getVersion());
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File("D:/ftl"));
//2、创建Template对象,指定模板文件
Template template = configuration.getTemplate("test.ftl");
//3、准备数据,Map或POJO类型,推荐Map
Map<String,Object> data = new HashMap<>();
data.put("test", "第一个Freemarker例子");
//4、创建Writer对象,指定输出文件
Writer writer = new FileWriter("D:/ftl_out/test.txt");
//5、生成模板
template.process(data,writer);
}
运行程序,在ftl_out文件夹中生成了test.txt文件,查看文件内容:
可以看到,成功将${test}
替换为输入的数据。
二、基本语法
2.1 取Map中Key
上面的入门程序其实就是这种。
如果模板中内容为:
${test}
直接往Map中存key即可:
Map<String,Object> data = new HashMap<>();
data.put("test", "第一个Freemarker例子");
2.2 取POJO中属性
其实取POJO和EL表达式还是一样,如果存在模板内容为:
学生信息:
姓名:${student.name}
年龄:${student.age}
有一个Student对象,内容为:
public class Student {
private String name;
private Integer age;
// 省略getter/setter...
}
则创建一个Map,放入一个Student对象即可:
Map<String,Object> data = new HashMap<>();
data.put("student", student对象);
2.3 取集合中元素
如果存在一个学生列表,模板内容:
<#list studentList as student>
学生信息:
姓名:${student.name}
年龄:${student.age}
</#list>
传递一个list即可:
List<Student> list = new ArrayList<>();
list.add(new Student("jitwxs", 20));
list.add(new Student("zhangsan", 25));
list.add(new Student("lisi", 12));
Map<String,Object> data = new HashMap<>();
data.put("studentList", list);
2.4 取循环中下标
如果要取循环中的坐标,修改模板如下:
<#list studentList as student>
学生信息,当前index:${student_index}
姓名:${student.name}
年龄:${student.age}
</#list>
2.5 判断
修改模板如下:
<#list studentList as student>
<#if student_index % 2 == 0>
学生信息(偶数):
<#else>
学生信息(单数):
</#if>
姓名:${student.name}
年龄:${student.age}
</#list>
2.6 日期处理
传入模板一个Date()对象:
Map<String,Object> data = new HashMap<>();
data.put("date", new Date());
模板内容:
当前日期:${date?date}
当前时间:${date?time}
当前日期和时间:${date?datetime}
自定义日期格式:${date?string("yyyyMMdd-HH:mm:ss")}
2.7 NULL处理
放入一个null值:
Map<String,Object> data = new HashMap<>();
data.put("value",null);
模板内容如下:
方法1:使用默认值
${value!"value值为null"}
方法2:使用if语句
<#if value??>
${value}
<#else>
value值为null
</#if>
2.8 include
一个模板还可以包含另一个模板,使用include标签即可:
学生信息:
姓名:${student.name}
年龄:${student.age}
<#include "test.ftl"/>
三、与Spring整合
在配置文件中将FreeMarkerConfigurer
注入Bean:
<!-- FreeMarker -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="D:/ftl" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
首先用@Autowired
将freeMarkerConfig
注入进来
@Autowired
private FreeMarkerConfig freeMarkerConfig;
然后调用getConfiguration()
得到Configuration
对象,剩下的和之前就一样了。
Configuration configuration = freeMarkerConfig.getConfiguration();
上一篇: 选课系统开发
推荐阅读
-
spring boot使用thymeleaf为模板的基本步骤介绍
-
使用spring整合Quartz实现—定时器功能
-
使用maven整合Spring+SpringMVC+Mybatis框架详细步骤(图文)
-
使用spring整合Quartz实现—定时器功能
-
Apache shiro的简单介绍与使用教程(与spring整合使用)
-
微服务架构下使用Spring Cloud Zuul作为网关将多个微服务整合到一个Swagger服务上
-
spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪
-
Spring 整合Shiro 并扩展使用EL表达式的实例详解
-
荐 使用IDEA实现SSM整合(Maven+Spring+Mybatis+SpringMvc)
-
Spring Boot整合静态化技术FreeMarker