这是一个相当老牌的开源的免费的模版引擎。通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通的组件嵌入到我们的产品中。

来看一张来自 Freemarker 官网的图片:


可以看到,Freemarker 可以将模版和数据渲染成 HTML 。
Freemarker 模版后缀为 .ftl(FreeMarker Template Language)。FTL 是一种简单的、专用的语言,它不是像 Java 那样成熟的编程语言。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

好了,这是一个简单的介绍,接下来我们来看看 Freemarker 和 Spring Boot 的一个整合操作。

实践

在 SSM 中整合 Freemarker ,所有的配置文件加起来,前前后后大约在 50 行左右,Spring Boot 中要几行配置呢? 0 行!

1.创建工程

首先创建一个 Spring Boot 工程,引入 Freemarker 依赖:

<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-freemarker</artifactid>
</dependency>
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid>
</dependency>

工程创建完成后,在 org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration 类中,可以看到关于 Freemarker 的自动化配置:

@Configuration
@ConditionalOnClass({ freemarker.template.Configuration.class, FreeMarkerConfigurationFactory.class })
@EnableConfigurationProperties(FreeMarkerProperties.class)
@Import({ FreeMarkerServletWebConfiguration.class, FreeMarkerReactiveWebConfiguration.class,FreeMarkerNonWebConfiguration.class })
public class FreeMarkerAutoConfiguration {
}

从这里可以看出,当 classpath 下存在 freemarker.template.Configuration 以及 FreeMarkerConfigurationFactory 时,配置才会生效,也就是说当我们引入了 Freemarker 之后,配置就会生效。但是这里的自动化配置只做了模板位置检查,其他配置则是在导入的 FreeMarkerServletWebConfiguration 配置中完成的。那么我们再来看看 FreeMarkerServletWebConfiguration 类,部分源码如下:

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, FreeMarkerConfigurer.class })
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration {protected FreeMarkerServletWebConfiguration(FreeMarkerProperties properties) {super(properties);}@Bean@ConditionalOnMissingBean(FreeMarkerConfig.class)public FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();applyProperties(configurer);return configurer;}@Bean@ConditionalOnMissingBean(name = "freeMarkerViewResolver")@ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true)public FreeMarkerViewResolver freeMarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();getProperties().applyToMvcViewResolver(resolver);return resolver;}
}

在这个类的构造方法中,注入了 FreeMarkerProperties:

@ConfigurationProperties(prefix = "spring.freemarker")
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";public static final String DEFAULT_PREFIX = "";public static final String DEFAULT_SUFFIX = ".ftl";/*** Well-known FreeMarker keys which are passed to FreeMarker's Configuration.*/private Map settings = new HashMap<>();
}

FreeMarkerProperties 中则配置了 Freemarker 的基本信息,例如模板位置在 classpath:/templates/ ,再例如模板后缀为 .ftl,那么这些配置我们以后都可以在 application.properties 中进行修改。

如果我们在 SSM 的 XML 文件中自己配置 Freemarker ,也不过就是配置这些东西。现在,这些配置由 FreeMarkerServletWebConfiguration​ 帮我们完成了。

2.创建类

首先我们来创建一个 User 类,如下:

public class User {private Long id;private String username;private String address;//省略 getter/setter
}

再来创建 UserController:

@Controller
public class UserController {@GetMapping("/index")public String index(Model model) {List users = new ArrayList<>();for (int i = 0; i < 10; i++) {User user = new User();user.setId((long) i);user.setUsername("javaboy>>>>" + i);user.setAddress("www.javaboy.org>>>>" + i);users.add(user);}model.addAttribute("users", users);return "index";}
}

最后在 freemarker 中渲染数据:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<table border="1"><tr><td>用户编号</td><td>用户名称</td><td>用户地址</td></tr><#list users as user><tr><td>${user.id}</td><td>${user.username}</td><td>${user.address}</td></tr></#list>
</table>
</body>
</html>

运行效果如下:

其他配置

如果我们要修改模版文件位置等,可以在 application.properties 中进行配置:

spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/

好了,整合完成之后,Freemarker 的更多用法,就和在 SSM 中使用 Freemarker 一样了,这里我就不再赘述。

Spring Boot 整合 Freemarker相关推荐

  1. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  2. Spring Boot 整合 FreeMarker 实例

    前言 在之前的文章Spring Boot 整合 Thymeleaf中,我们学习了如何将模板 Thymeleaf 整合到 Spring Boot 中,那今天我们就来看看,另一个老牌的开源免费模板引擎 - ...

  3. Spring Boot整合Freemarker

    目录 Freemarker模板 导入 Freemarker模板 Freemarker自动化配置 创建类说明 其他配置 直接输出值 输出变量 其他常见表达式 常见内置函数 常见指令 宏 Freemark ...

  4. spring boot整合freemarker及freemarker基础语法超详细讲解

    采用模板+数据=HTML 实现页面的静态化. 也就是服务端的页面静态化技术. JSP/Freemarker/Thymeleaf是常见的模板引擎. 引依赖 okhttp与HttpClient一样的作用, ...

  5. java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板

    点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...

  6. spring boot整合spring security笔记

    最近自己做了一个小项目,正在进行springboot和spring Security的整合,有一丢丢的感悟,在这里分享一下: 首先,spring boot整合spring security最好是使用T ...

  7. RabbitMQ使用及与spring boot整合

    1.MQ 消息队列(Message Queue,简称MQ)--应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...

  8. Spring Boot 教程(三): Spring Boot 整合Mybatis

    教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...

  9. 五、spring boot整合mybatis-plus

    spring boot整合mybatis-plus 简介 mybatis 增强工具包,简化 CRUD 操作. 文档 http://mp.baomidou.com http://mybatis.plus ...

最新文章

  1. Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )
  2. Java类名.方法和变量
  3. 借个iPad玩玩,越狱4.2.1成功
  4. WeChat.app debuger
  5. BufferedWriter 和 BufferedReader 的基本用法,附演示程序。以及一个复制文本文件的程序
  6. 野生前端的数据结构基础练习(4)——字典
  7. python统计数据库中每个数的个数,如何统计每个数据库中每个集合中的文档数?...
  8. matlab 三对角矩阵 追赶法,追赶法求解三对角方程及其算例.doc
  9. 大数据计算技术架构解析
  10. np.ones(),np.zeros(), np.empty(),np.full(),np.ones_like() 基本用法
  11. 数字中国城市巡礼之杭州,让城市长出“神经系统”
  12. 并发控制五(封锁的粒度)
  13. NLP 模型压缩方法综述
  14. 如何更新谷歌chrome浏览器
  15. IT职业病预防之颈椎病(一)
  16. python语言是干什么的-python语言可以干什么
  17. SS2H框架搭建,基础上篇
  18. 牛客网练习,某公司2017秋招 叫车 2017年
  19. 避暑山庄消失的三十六景,曾经那么美!
  20. git checkout恢复文件

热门文章

  1. OpenCV人脸检测与三角剖分绘制
  2. 用OpenCV玩《铁拳》!!!
  3. 2-Entity RANSAC:在变化的环境中进行稳健的视觉定位
  4. ACM题目:救济金发放
  5. xilinx FIFO
  6. linux文件时间属性的详解
  7. YARN-2.7.3-源码分析系列2:启动脚本原理的分析
  8. ios 3DTouch初识
  9. 正则表达式学习实例1
  10. android 虚线