Freemarker介绍、使用并与Spring整合

原创 2018年04月16日 11:07:17


一、什么是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和它类似,其步骤大致如下:

  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}替换为输入的数据。


二、基本语法

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>

首先用@AutowiredfreeMarkerConfig注入进来

@Autowired
private FreeMarkerConfig freeMarkerConfig;

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

Configuration configuration = freeMarkerConfig.getConfiguration();
版权声明:本文为本人原创文章,未经本人允许不得转载,谢谢。 https://blog.csdn.net/yuanlaijike/article/details/79957994

WEB表现层框架:FreeMarker

-
  • 1970年01月01日 08:00

使用Rocker模板引擎解决动态拼接SQL语句的问题

相信大部分服务端程序员都和我有一样的感觉,就是在Java代码里根据条件拼接SQL语句是个技术含量很低,又很麻烦,还容易出错的问题。 最简单直观的方式当然是用String/StringBuffer/St...
  • rocks_lee
  • rocks_lee
  • 2016-10-14 16:12:41
  • 3434

RocketMQ安装与demo

下载地址:https://github.com/alibaba/RocketMQ/ 1. 下载zip压缩包,解压,到根目录执行:mvn -Dmaven.test.skip=true clean pa...
  • lxxc11
  • lxxc11
  • 2016-05-24 17:05:13
  • 5676

rocketmq实战入门

1.pom文件 com.alibaba.rocketmq rocketmq-client 3.2.6 生产者 : package com.sun.rocketmq.qs;...
  • sunqingzhong44
  • sunqingzhong44
  • 2017-06-03 20:35:06
  • 713

rocketmq 延迟队列的实现

流程描述: 1. producer发消息,设置一个延迟level值.  “设置消息延时 10s 消费”的 Producer 端代码如下: messageDelayLeve...
  • a137268431
  • a137268431
  • 2016-11-18 18:34:38
  • 1079

Ninja自己的技术栈

Frontend HTML rendering (Freemarker)JSON rendering / parsing (Jackson)XML rendering / parsing (Ja...
  • youdianjinjin
  • youdianjinjin
  • 2016-02-03 13:11:58
  • 764

Kafka vs RocketMQ——多Topic对性能稳定性的影响

引言上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至0...
  • a137268431
  • a137268431
  • 2018-04-15 11:45:14
  • 33

【MQ】CentOS7安装RocketMQ

一、前言      在前一篇博客中小编向大家简单介绍了一下《【MQ】为什么选择RocketMQ?》,关于RocketMQ是怎么使用,如何安装的小编将在这篇博客向大家介绍。二、环境准备 Centos7 ...
  • kisscatforever
  • kisscatforever
  • 2017-05-30 15:08:20
  • 978

Kafka vs RocketMQ—— Topic数量对单机性能的影响

引言上一期我们对比了三类消息产品(Kafka、RabbitMQ、RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务只...
  • a137268431
  • a137268431
  • 2018-04-15 11:36:16
  • 100

Beetl2.7 中文文档

Beetl2.7 中文文档 转自:http://ibeetl.com/guide/ Beetl作者:李家智 [xiandafu@126.com](mailto:xiandafu@126.c...
  • y19910825
  • y19910825
  • 2018-01-05 16:53:57
  • 1100
收藏助手
不良信息举报
您举报文章:Freemarker介绍、使用并与Spring整合
举报原因:
原因补充:

(最多只允许输入30个字)