Spring Boot整合Freemarker
目录
- 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;}}
- @ConditionalOnWebApplication 表示当前配置在 web 环境下才会生效
- @ConditionalOnClass 表示当前配置在存在 Servlet 和 FreeMarkerConfigurer 时才会生效
- @AutoConfigureAfter 表示当前自动化配置在 WebMvcAutoConfiguration 之后完成
- 代码中,主要提供了 FreeMarkerConfigurer 和FreeMarkerViewResolver
- FreeMarkerConfigurer 是 Freemarker 的一些基本配置,例如 templateLoaderPath、defaultEncoding 等
- 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>
作用:
- 首字母大写
- 大写字母转小写
- 小写字母转大写
- 删除字符中的空格
- 计算输出集合中的个数
- 取小数中整数部分
- 日期的格式化
常见指令
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相关推荐
- freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...
- Spring Boot 整合 FreeMarker 实例
前言 在之前的文章Spring Boot 整合 Thymeleaf中,我们学习了如何将模板 Thymeleaf 整合到 Spring Boot 中,那今天我们就来看看,另一个老牌的开源免费模板引擎 - ...
- Spring Boot 整合 Freemarker
这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页.电子邮件.配置文件以及源代码等.Freemarker 不是面向最终用户的,而是一个 Ja ...
- spring boot整合freemarker及freemarker基础语法超详细讲解
采用模板+数据=HTML 实现页面的静态化. 也就是服务端的页面静态化技术. JSP/Freemarker/Thymeleaf是常见的模板引擎. 引依赖 okhttp与HttpClient一样的作用, ...
- java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板
点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...
- spring boot整合spring security笔记
最近自己做了一个小项目,正在进行springboot和spring Security的整合,有一丢丢的感悟,在这里分享一下: 首先,spring boot整合spring security最好是使用T ...
- RabbitMQ使用及与spring boot整合
1.MQ 消息队列(Message Queue,简称MQ)--应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...
- Spring Boot 教程(三): Spring Boot 整合Mybatis
教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...
- 五、spring boot整合mybatis-plus
spring boot整合mybatis-plus 简介 mybatis 增强工具包,简化 CRUD 操作. 文档 http://mp.baomidou.com http://mybatis.plus ...
最新文章
- Mysql增强半同步模式_MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT...
- MIT发布白皮书:美国欲重返世界半导体霸主!
- 物理化学 焓变的计算和相变焓
- 一个简单的FreeMarker案例
- Flink 在唯品会的实践
- 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的
- 零基础 | 入行软件测试,你想知道的都在这里了
- 模拟电路——基本放大电路
- 4米乘以12米CAD图_【超干货】CAD铺装排版下料之路径阵列
- 超强的照片无损放大修复工具 SmartDeblur模糊照片变清晰工具
- 软件测试面试题:智力题。
- 聊天机器人ChatGPT横空出世,今天来看看ChatGPT是如何回答面试官的问题的?
- 1022: [SHOI2008]小约翰的游戏John
- 如何利用excel和python构建拟合曲线预测可转债股票价格?
- 电精2 android,安卓街机模拟器|街机电精2(街机模拟器)安卓版 - 系统天堂
- Gson系列1 --- Gson 序列化与反序列化 -- 数组 / 集合序列化
- 【三十天精通 Vue 3】 专栏内容介绍
- 前端实现炫酷动效_前端动效实现--lottie - web
- linux 安装配置java环境 jdk1.6 jdk-6u45-linux-x64.bin
- 纯CSS实现Table固定表头和首列
热门文章
- 使用内存池的原因,内存池的应用
- 学校人脸识别门禁系统的意义
- python快速数据分析_收藏 | 10个可以快速用Python进行数据分析的小技巧
- 免费的webservice接口(天气预报/IP查询/股票查询/手机归属地等)
- 2022年全球市场冷冻蛋挞皮总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 【企业微信开发】企业微信开发测试推送应用消息流程
- 读写shp等空间数据,进行geometry、SimpleFeature等转换的工具类
- 将.hhc文件转换成html文件解析
- python raise和except区别_Python3 try-except、raise和assert解析
- 【CSS】内联样式,内部样式表,外部样式表