Freemarker介绍、使用并与Spring整合

版权声明:本文版权归Jitwxs所有,欢迎转载,但未经作者同意必须保留原文链接。 https://blog.csdn.net/yuanlaijike/article/details/79957994


一、什么是Freemarker

1.1 介绍

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等

主要用Freemarker做静态页面或是页面展示

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}

test

是不是有点像EL表达式,在EL表达式中使用model.addAttr..()就可以替换掉JSP中的EL表达式了,Freemarker和它类似,其步骤大致如下:

  1. 创建Configuration对象,指定编码集和模板文件夹
  2. 创建Template对象,指定模板文件
  3. 准备数据
  4. 创建Writer对象,指定输出文件
  5. 生成模板
@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结果

可以看到,成功将${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>

NULL处理

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>

首先用@AutowiredfreeMarkerConfig注入进来

@Autowired
private FreeMarkerConfig freeMarkerConfig;

然后调用getConfiguration()得到Configuration 对象,剩下的和之前就一样了。

Configuration configuration = freeMarkerConfig.getConfiguration();
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页