===============================
Java 模板引擎选择
===============================
SpringBoot Starter项目向导中可选的Java模版引擎有:
1. Thymeleaf (百里香草叶子)
2. Freemarker
3. Mustache
4. Groovy Templates

简单评价这些模版引擎吧,
1. Thymeleaf: SpringBoot 看起来更推荐 Thymeleaf, 但我不喜欢它自作聪明的标签定义, 满眼 th 开头的黑魔法标签, 表示看不懂, 另外 Thymeleaf 也是公认性能最差的引擎, https://github.com/mbosecke/template-benchmark
2. Freemarker: 放弃了 Thymeleaf 后, 重点考察了 Freemarker, 断断续续学了几天, 要做一个小应用时, 还是碰到不少问题, 另外布局复用这块搞的也太复杂了.
3. Mustache: 语法比较奇怪.
4. Groovy Templates: 完全不是 html 语法, 完全不懂它的模版语法.

我对后端模版引擎选择标准:
在一个普通的web项目中, 后端模块引擎技术往往是最不被看重的领域, 一般在上面投入的时间也不多, 如果一个模版引擎一两天还不能上手, 说明这个模版引擎设计的太复杂了, 或者太另类了.

我的最终选择:
对benchmark (https://github.com/mbosecke/template-benchmark) 上的模版引擎都做了些研究, 综合考虑了项目成熟度/学习难度/项目活跃程度/, 最终选定 Pebble templates.

===============================
关于 Pebble templates
===============================
语法: Pebble templates 是 Django-like 模板引擎. 类似的引擎还有: Jinja2(Python), Twig(PHP), jtwig(Java)
学习成本: 花上一天学习就能应付日常开发, 官方文档也不长, 学习起来非常快.

目前稳定版: 3.0.5, 而且官方提供了 SpringBoot2 Starter 包.

主页: https://pebbletemplates.io/
github wiki: https://github.com/PebbleTemplates/pebble/wiki
https://github.com/PebbleTemplates/pebble/wiki/basic-usage
https://github.com/PebbleTemplates/pebble/wiki/installation

===============================
Pebble 重要的几个类
===============================
1. Loader 类: PebbleEngine 将依赖 Loader 加载原始的模板, Pebble 内置 FileLoader 和 ClasspathLoader 和 StringLoader  等几个实现类, 前者负责从文件系统中加载原始模板, 后者负责直接从字符串中加载原始模板. 引入 pebble-spring-boot-2-starter 后, 会在 Spring context 注册一个名为 pebbleLoader 的 Loader.
2. PebbleEngine 类: 引擎核心. 引入 pebble-spring-boot-2-starter 后, 会在 Spring context 注册一个名为 pebbleEngine 的引擎对象, pebbleEngine 使用 pebbleLoader 加载原始模板.
3. PebbleTemplate 类: 负责完成模板的渲染.
4. PebbleViewResolver 类, 以 ModelAndView 对象作为模板参数的输入, 然后使用 PebbleTemplate 对象完成渲染. 引入 pebble-spring-boot-2-starter 后, 会在 Spring context 注册一个名为 pebbleViewResolver 的ViewResolver对象.
一个 PebbleEngine 对象依赖一个特定类型的 Loader 对象, 如果我们的应用既有字符串模板, 又有文件模板, 我们需要定义两个 Loader 和两个 PebbleEngine 对象.

===============================
Pebble 和 SpringBoot 的集成
===============================
<dependency>
<groupId>io.pebbletemplates</groupId>
<artifactId>pebble-spring-boot-2-starter</artifactId>
<version>3.0.5</version>
</dependency>

pebble-spring-boot-2-starter, 会读取一些配置属性, 完整的属性清单见 https://github.com/PebbleTemplates/pebble-spring-boot-starter
下面是一些常用的默认属性值, 我们可以在 application.properties 文件中按需设定, 比如禁用缓存或修改后缀为.html 等.
pebble.prefix=/templates/
pebble.suffix=.pebble
pebble.content-type=text/html
pebble.cache=true
pebble.encoding=UTF-8
pebble.defaultLocale=null
pebble.strictVariables=false

自定义 Pebble Configuration 类:
引入 pebble-spring-boot-2-starter 后, Pebble 会向 Spring context 注册一个名为 pebbleLoader 的 Loader, 以及一个名为 pebbleEngine 的引擎对象, 以及一个名为 pebbleViewResolver 的 PebbleViewResolver 对象. pebbleLoader 是一个 FileLoader, pebbleEngine 使用 pebbleLoader 加载原始模板, pebbleViewResolver 负责组装参数和原始模板.
如果我们有特别的需求, 可以自定义自己的 Pebble Configuration, 按需注入我们自己的 pebbleLoader 和 pebbleEngine 和 pebbleViewResolver.

//@formatter:off
/**
* Pebble Config 类
* 1. 为了处理文本模板, 增加 pebbleStringLoader 和 pebbleStringEngine bean.
* 2. 为了处理其他目录的模板文件, 增加 pebbleFileLoader 和 pebbleFileEngine bean.
* 3. 未对 pebble-spring-boot-2-starter 注册的 pebbleLoader pebbleEngine pebbleViewResolver bean做任何修改.
* @author Administrator
*
*/
//@formatter:on
@Configuration
class PebbleConfig {
@Bean("pebbleStringLoader")
StringLoader pebbleStringLoader() {
return new StringLoader();
} @Autowired
@Bean("pebbleStringEngine")
PebbleEngine pebbleStringEngine(@Qualifier("pebbleStringLoader") StringLoader pebbleStringLoader) {
PebbleEngine stringEngine = new PebbleEngine.Builder().loader(pebbleStringLoader)
.build();
return stringEngine;
} @Bean
FileLoader pebbleFileLoader() {
FileLoader loader = new FileLoader();
loader.setPrefix("/path/to/resources");
loader.setSuffix(".html");
return loader;
} @Bean
@Autowired
PebbleEngine pebbleFileEngine(@Qualifier("pebbleFileLoader") FileLoader pebbleFileLoader) {
PebbleEngine fileEngine = new PebbleEngine.Builder().loader(pebbleFileLoader)
.build();
return fileEngine;
}
} @Component
class PebbleConverter {
@Autowired
@Qualifier("pebbleStringEngine")
PebbleEngine pebbleStringEngine; public String render(String templateRawText, Map<String, Object> context) throws IOException {
PebbleTemplate compinedTempate = pebbleStringEngine.getTemplate(templateRawText);
StringWriter writer = new StringWriter();
compinedTempate.evaluate(writer, context);
return writer.toString();
}
}

===============================
Pebble Layout 模板设计
===============================
这里简单展现一下使用Pebble如何模块化各个页面, 假设有下面文件:
home.pebble 文件: 主页模板
base.pebble 文件: 所有页面的母版
navbar.pebble 文件: 头部导航条
footer.pebble 文件: 尾部条
sidebar.pebble 文件: 左边导航条

这几个文件的关系是:
base.pebble 包含 navbar.pebble 和 footer.pebble 和 sidebar.pebble 文件, home.pebble 继承自 base.pebble 文件, 并 override 一些指定的元素.
包含指令为 {% include %}, 继承指令为 {% extends %}, override 是通过复用同名的block 块实现.

footer.pebble 文件内容: 

    <div>
</div> <!-- end of footer -->

navbar.pebble 文件内容: 

    <div>
</div> <!-- end of navbar -->

base.pebble 文件内容:
使用 {% include %} 指令将 footer/sidebar/navbar 几个 pebble 文件嵌入进来, 并加入了一个 content block, base.pebble 子文件可以扩展该block.

<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<link rel="stylesheet" href="/css/style.css" />
<title>Pebble Spring Example</title>
</head>
<body>
<div id="wrap">
{% include 'navbar' %} <div class="container">
<div class="row">
<div class="col-md-3">
{% include 'sidebar' %}
</div>
<div class="col-md-9">
{% block content %}
{# This section is to be overriden by child templates #}
{% endblock content %}
</div>
</div>
</div><!-- end container --> </div><!-- end wrap --> {% include 'footer' %}
</body>
</html>

home.pebble 文件内容:
使用 {% extends %} 指令继承了 base.pebble 页面, 同时使用了 {% block content %} 将真实的数据嵌入到 base.pebble 文件的 content block 中.

{% extends 'base' %}
{% block content %}
Home page
{% endblock content%}

===============================
我找到几个不错的Freemark链接
===============================
https://o7planning.org/en/11547/spring-boot-and-freemarker-tutorial
https://www.hawu.me/coding/733
http://www.tianshouzhi.com/api/tutorials/springboot/115
https://www.cnblogs.com/ChenD/p/6908246.html

SpringBoot系列: Pebble模板引擎的更多相关文章

  1. SpringBoot系列: Pebble模板引擎语法介绍

    本文基于Pebble官方文档, 对pebble的语法做一些介绍. ===============================Pebble 官方资料========================= ...

  2. SpringBoot日记——Thymeleaf模板引擎篇

    开发通常我们都会使用模板引擎,比如:JSP.Velocity.Freemarker.Thymeleaf等等很多,那么模板引擎是干嘛用的? 模板引擎,顾名思义,是一款模板,模板中可以动态的写入一些参数, ...

  3. Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  4. Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  5. 【Springboot】Springboot整合Thymeleaf模板引擎

    Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...

  6. SpringBoot集成Thymeleaf模板引擎

    简单介绍 目前在JavaEE领域有几中比较常用的模板引擎,分别是Jsp.Velocity.Freemarker.Thymeleaf,对Freemark语法不是特别熟悉,不过对于前端页面渲染效率来说,j ...

  7. SpringBoot系列——Thymeleaf模板

    前言 thymeleaf是springboot官方推荐使用的java模板引擎,在springboot的参考指南里的第28.1.10 Template Engines中介绍并推荐使用thymeleaf, ...

  8. SpringBoot使用thymeleaf模板引擎

    (1).添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  9. SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图

    在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...

随机推荐

  1. logrotate异常排查

    [root@dev240 logrotate.d]# /usr/sbin/logrotate -v /etc/logrotate.conf reading config file /etc/logro ...

  2. day21(1)---python的内存管理

    垃圾回收机制: 不能被程序访问到的数据,就称之为垃圾. 引用计数:引用计数是用来记录值的内存地址被记录的次数的 每一次对值地址的引用都可以使得该值的引用计数+1 每一次对值地址的释放都可以使得该值的引 ...

  3. elementUi源码解析(1)--项目结构篇

    因为在忙其他事情好久没有更新iview的源码,也是因为后面的一些组件有点复杂在考虑用什么方式把复杂的功能逻辑简单的展示出来,还没想到方法,突然想到element的组件基本也差不多,内部功能的逻辑也差不 ...

  4. 开放数据接口 API 简介与使用场景、调用方法

    此文章对开放数据接口 API 进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用. 在给大家分享的一系列软件开发视频课程中,以及在我们的社区微信群聊天中,都积极地鼓励大家开 ...

  5. 用es6类封装的图片预加载技术!

    1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. iso data 聚类算法

    isodata算法就是先拟定一个预期类,再选取一些聚类中心,通过不断合并或者分裂聚类,达到分类的目的 关键就是在于,如何分裂,合并 要合并或者分裂 必须要确定一些指标 所以第一步就是要确定 某些指标 ...

  7. 数据标记系列——标记工具Imagtagger

    https://github.com/bit-bots/imagetagger 待有空说一说!

  8. Clion设置字体大小和护眼色

    1.显示行号File->Settings->Editor->General->Appearance右侧,Show line numbers 2.设置字体大小与行间距File-& ...

  9. 7.docker日志收集

    默认情况下,docker logs或者docker service logs显示命令的输出,就像在终端中以交互方式运行命令时一样.UNIX和Linux命令通常开在运行时间上三个I / O流,所谓的 S ...

  10. 【C/C++】任意进制转换

    进制转换:R进制->10进制:10进制->R进制. #include<bits/stdc++.h> using namespace std; /*函数:r进制转换成10进制*/ ...