博客
关于我
SpringBoot整合FreeMarker模板引擎
阅读量:453 次
发布时间:2019-03-06

本文共 4119 字,大约阅读时间需要 13 分钟。

目录

本篇要点

  • 介绍FreeMark基本原理。
  • 介绍SpringBoot与FreeMarker快速整合。

FreeMarker是什么?

  • 一款模板引擎。即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。

  • 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据,体现就是:模板+ 数据模型 = 输出。

快速开始

  1. pom.xml确定导入FreeMarker依赖包
org.springframework.boot
spring-boot-starter-freemarker
  1. 配置application.yml相关配置
spring:  freemarker:    settings:      classic_compatible: true #处理空值      datetime_format: yyy-MM-dd HH:mm      number_format: 0.##    suffix: .ftl    template-loader-path:      - classpath:/templates
  1. 在templates目录下放置.ftl文件,意为freemarker templates layer
  2. 编写Controller,将模型存入request中:
@Controllerpublic class TestController{    @GetMapping("test")    public String test(HttpServletRequest request){        List
users = new LinkedList<>(); for(int i = 0; i < 10; i ++){ User user = new User(); user.setId((long)i); user.setUsername("name = " + i); users.add(user); } request.setAttribute("users",users); return "test"; }}
  1. 简单使用FreeMarker的标签指令:
<#list users>    

Users:

    <#items as user>
  • ${user.id}--${user.username}
<#else>

no users!

模板一览

${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,被称为插值表达式。

<#../>:FTL标签,以#开头,自定义标签则以@开头。

常用指令

条件指令:if、elseif、else

<#if animals.python.price < animals.elephant.price>  Pythons are cheaper than elephants today.<#elseif animals.elephant.price < animals.python.price>  Elephants are cheaper than pythons today.<#else>  Elephants and pythons cost the same today.

list指令

list 指令的一般格式为: <#list sequence as loopVariable> repeatThisrepeatThis 部分将会在给定的 sequence 遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable 将持有当前遍历项的值。 这个变量仅存在于 <#list ...><#list> 标签内。

We have these animals:

<#list animals as animal>
${animal.name} ${animal.price} Euros

sequence 可以是任意表达式, 比如我们可以列表显示示例数据模型中的水果,就像这样:

    <#list misc.fruits as fruit>
  • ${fruit}

上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的 <ul></ul>,而不是什么都没有。 要避免这样的情况,可以这么来使用 list

<#list misc.fruits>  

Fruits:

    <#items as fruit>
  • ${fruit}<#sep> and
<#else>

We have no fruits.

include指令

使用 include 指令, 我们可以在模板中插入其他文件的内容。

如果需要在每个页面的下方都显示版权信息,可以将版权信息单独放在页面文件 copyright_footer.html 中:


Copyright (c) 2000 Acmee Inc,
All Rights Reserved.

使用时,用include引入该文件即可:

  Test page  

Test page

Blah blah... <#include "/copyright_footer.html">

内建函数

内建函数很像子变量(如果了解Java术语的话,也可以说像方法), 它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。 为了清晰子变量是哪部分,使用 ?(问号)代替 .(点)来访问它们。

所有内建函数参考:

处理不存在的变量

一个不存在的变量和一个是null值的变量, 对于FreeMarker来说是一样的。

不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况, 通过在变量名后面跟着一个 !(叹号,译者注)和默认值。 就像下面的这个例子,当 user 不存在于数据模型时, 模板将会将 user 的值表示为字符串 "visitor"。(当 user 存在时, 模板就会表现出 ${user} 的值):

Welcome ${user!"visitor"}!

也可以在变量名后面通过放置 ?? 来询问一个变量是否存在。将它和 if 指令合并, 那么如果 user 变量不存在的话将会忽略整个问候的代码段:

<#if user??>

Welcome ${user}!

自定义指令

使用macro定义宏

  • 未带参数宏调用
<#macro greet>  Hello Joe!
<#--未带参数宏调用--> <@greet>
  • 带参数宏调用
<#macro greet_2 person>    Hello ${person}!
<#--带参数宏调用--> <@greet_2 person="天乔巴夏"/>
  • 嵌套调用
<#macro nest_test>    <#nested >
<#--嵌套调用--> <@nest_test> hyh

使用TemplateDirectiveModel扩展。

这部分可以参考我发在码云上的代码:

@Override    public void execute(DirectiveHandler handler) throws Exception {        // 获取参数        String username = handler.getString("username");        String city = handler.getString("city");        // 处理参数        String template = "{}来自{}.";        String format = StrUtil.format(template, username, city);        // 传回去        handler.put("result",format).render();    }
@Configurationpublic class FreeMarkerConfig {    @Autowired    StringTemplate stringTemplate;    @Autowired    private freemarker.template.Configuration configuration;    @PostConstruct    public void setUp() {        configuration.setSharedVariable("timeAgo", new TimeAgoMethod());        configuration.setSharedVariable("strstr", stringTemplate);    }}
<@strstr username="hyh" city="杭州">    ${result}    

源码下载

本文内容均为对优秀博客及官方文档总结而得,原文地址均已在文中参考阅读处标注。最后,文中的代码样例已经全部上传至Gitee:

参考阅读

转载地址:http://icofz.baihongyu.com/

你可能感兴趣的文章
Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置自带的stub状态实现活动监控指标
查看>>
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>