目录

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

Freemarker模板

可以看到,Freemarker 可以将模版和数据渲染成 HTML

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

导入 Freemarker模板

建立Spring Boot 工程,导入web依赖和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>

Freemarker自动化配置

org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration 类中,可以看到关于 Freemarker 的自动化配置:

@Configuration(proxyBeanMethods = false)
@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(proxyBeanMethods = false)
@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)FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();applyProperties(configurer);return configurer;}@Beanfreemarker.template.Configuration freeMarkerConfiguration(FreeMarkerConfig configurer) {return configurer.getConfiguration();}@Bean@ConditionalOnMissingBean(name = "freeMarkerViewResolver")@ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true)FreeMarkerViewResolver freeMarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();getProperties().applyToMvcViewResolver(resolver);return resolver;}@Bean@ConditionalOnEnabledResourceChain@ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class)FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(new ResourceUrlEncodingFilter());registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);return registration;}}
  1. @ConditionalOnWebApplication 表示当前配置在 web 环境下才会生效
  2. @ConditionalOnClass 表示当前配置在存在 Servlet 和 FreeMarkerConfigurer 时才会生效
  3. @AutoConfigureAfter 表示当前自动化配置在 WebMvcAutoConfiguration 之后完成
  4. 代码中,主要提供了 FreeMarkerConfigurer 和FreeMarkerViewResolver
  5. FreeMarkerConfigurer 是 Freemarker 的一些基本配置,例如 templateLoaderPath、defaultEncoding 等
  6. FreeMarkerViewResolver 则是视图解析器的基本配置,包含了viewClass、suffix、allowRequestOverride、allowSessionOverride 等属性

另外还有一点,在这个类的构造方法中,注入了 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 = ".ftlh";/*** Well-known FreeMarker keys which are passed to FreeMarker's Configuration.*/private Map<String, String> settings = new HashMap<>();

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

创建类说明

其他配置

如果我们要修改模版文件位置等,可以在 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=.ftlh
spring.freemarker.template-loader-path=classpath:/templates/

配置文件按照顺序依次解释如下:

  • HttpServletRequest的属性是否可以覆盖controller中model的同名项

  • HttpSession的属性是否可以覆盖controller中model的同名项

  • 是否开启缓存

  • 模板文件编码

  • 是否检查模板位置

  • Content-Type的值

  • 是否将HttpServletRequest中的属性添加到Model中

  • 是否将HttpSession中的属性添加到Model中

  • 模板文件后缀

  • 模板文件位置

直接输出值

字符串:
可以直接输入一个字符串:

<div>${"我是泠青沼"}</div>
<div>${"我的文件保存C:\\盘"}</div>

\要进行转义
可以在目标字符串的引号前面增加 r 标记,在 r 标记后的文本内容会直接输出,如:

<div>${r"我的文件保存C:\\盘"}</div>


数字:

    <#assign price=90><div>${price?string.currency}</div>//钱币符号显示<div>${price?string.percent}</div>//百分数显示


布尔类型:

<#assign flag=true>
<div>${flag?string('yes','no')}</div>


集合类型:

 <#list 5..1 as x><div>${x}</div></#list><br><#list 1..5 as x><div>${x}</div></#list><br><#list [2+2,"dong","zhai","duan"] as x><div>${x}</div></#list><br><#list ["dong","zhai","duan"] as x><div>${x}</div></#list><br>


Map:

    <#assign userinfo={"name":"dong","password":"123456","id":"1"}><#list userinfo?keys as key><div>${key}-${userinfo[key]}</div></#list><br><#list userinfo?values as value><div>${value}</div></#list><br><div>${userinfo.name}</div><div>${userinfo.password}</div><div>${userinfo.id}</div><br>

输出变量

<div>${info['name']}</div>
<div>${info['age']}</div>
<hr>
<#list info?values as value><div>${value}</div>
</#list>
<hr>
<#list info?keys as key><div>${key}-${info[key]}</div>
</#list>
<hr>
<div>${users[1].name}</div>
<hr>
<table border="1"><#list users as user><tr><td>${user.id}</td><td>${user.name}</td><td>${user.password}</td><td>${user_index}</td>//序列index<td>${user_has_next?string("yes","no")}</td>//判断是否有下一个</tr></#list>
</table>
<hr>
<table border="1"><#list users[2..3] as user><tr><td>${user.id}</td><td>${user.name}</td><td>${user.password}</td></tr></#list>
</table>
<hr>

其他常见表达式

字符串操作:

<div>${"hello ${name}"}</div>
<div>${"hello "+name}</div>
<div>${name[0]}${name[1]}</div>
<div>${name[0..1]}</div>

<div><#assign age=88><div>${age*99/99+99-1}</div>
</div>
<hr>
<#list [1,2,3]+[4,5,6] as x><div>${x}</div>
</#list>
<hr>
<#list (info+{"address":"jiu"})?keys as key><div>${key}</div>
</#list>


比较表达式:

    <#assign age=88><#if age lt 99>99</#if><#if age gt 99>99</#if><#if age gte 99>99</#if><#if age lte 99>99</#if>

常见内置函数

<div><div>${"lqing"?cap_first}</div><div>${"LAZKOM"?lower_case}</div><div>${"oppoint"?upper_case}</div><div>${"op po in t"?trim}</div><div>${users?size}</div><div>${3.155?int}</div><div>${birth?string("yyyy-MM-dd")}</div>
</div>

作用:

  1. 首字母大写
  2. 大写字母转小写
  3. 小写字母转大写
  4. 删除字符中的空格
  5. 计算输出集合中的个数
  6. 取小数中整数部分
  7. 日期的格式化

常见指令

if-else:

<div><#assign age1=30><#if age1 gt 60 >老年人<#elseif age1 gt 40>中年人<#elseif age1 gt 20>青年人<#else >少年</#if>
</div>

switch:

<div><#assign x=10><#switch x><#case 1>1<#break><#case 10>10<#break><#default>100</#switch>
</div>

引用变量:
新建一个文件lqz.ftlh:

<h1>hello,,,,,,,dong</h1>

在本来的页面中加入:

<#include './lqz.ftlh'>


文本内容展示:

<#noparse>
<#include './lqz.ftlh'>
<div><#assign x=10><#switch x><#case 1>1<#break><#case 10>10<#break><#default>100</#switch>
</div>
</#noparse>

<#macro book bs ts> //定义宏<table><tr><td>${bs[0]}</td><td>${ts[0]}</td><td>${bs[1]}</td><td>${ts[1]}</td></tr></table><#nested>
</#macro>
//引用调用宏
<@book bs=["三国演义","红楼梦"] ts=["罗贯中","曹雪芹"]><h1>hello!!! neated!!</h1>
</@book>

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 模版,我们可以将数据渲染成 HTML 网页.电子邮件.配置文件以及源代码等.Freemarker 不是面向最终用户的,而是一个 Ja ...

  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. Mysql增强半同步模式_MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT...
  2. MIT发布白皮书:美国欲重返世界半导体霸主!
  3. 物理化学 焓变的计算和相变焓
  4. 一个简单的FreeMarker案例
  5. Flink 在唯品会的实践
  6. 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的
  7. 零基础 | 入行软件测试,你想知道的都在这里了
  8. 模拟电路——基本放大电路
  9. 4米乘以12米CAD图_【超干货】CAD铺装排版下料之路径阵列
  10. 超强的照片无损放大修复工具 SmartDeblur模糊照片变清晰工具
  11. 软件测试面试题:智力题。
  12. 聊天机器人ChatGPT横空出世,今天来看看ChatGPT是如何回答面试官的问题的?
  13. 1022: [SHOI2008]小约翰的游戏John
  14. 如何利用excel和python构建拟合曲线预测可转债股票价格?
  15. 电精2 android,安卓街机模拟器|街机电精2(街机模拟器)安卓版 - 系统天堂
  16. Gson系列1 --- Gson 序列化与反序列化 -- 数组 / 集合序列化
  17. 【三十天精通 Vue 3】 专栏内容介绍
  18. 前端实现炫酷动效_前端动效实现--lottie - web
  19. linux 安装配置java环境 jdk1.6 jdk-6u45-linux-x64.bin
  20. 纯CSS实现Table固定表头和首列

热门文章

  1. 使用内存池的原因,内存池的应用
  2. 学校人脸识别门禁系统的意义
  3. python快速数据分析_收藏 | 10个可以快速用Python进行数据分析的小技巧
  4. 免费的webservice接口(天气预报/IP查询/股票查询/手机归属地等)
  5. 2022年全球市场冷冻蛋挞皮总体规模、主要生产商、主要地区、产品和应用细分研究报告
  6. 【企业微信开发】企业微信开发测试推送应用消息流程
  7. 读写shp等空间数据,进行geometry、SimpleFeature等转换的工具类
  8. 将.hhc文件转换成html文件解析
  9. python raise和except区别_Python3 try-except、raise和assert解析
  10. 【CSS】内联样式,内部样式表,外部样式表