FreeMarker学习笔记(一) 初步认识Freemarker的模板

Java使用XDocReport +FreeMarker动态生成Word模板 java动态生成word模板 阅读详情

*******************************************************

*                   转载请注明来源地址http://blog.youkuaiyun.com/csuliky   作者:阿布

*******************************************************

首先我们来对Freemarker有一个初略的认识,在这一章中,我们要学会如何写出一个简单但是非常有效的Freemarker模板。

1.模板+数据模型=输出

假设你的一个电子商铺应用程序需要一个HTML页面,类似于这个:

我们说用户名("Big Joe")应该依赖于访问这个web页面的登录者,最新的产品应该来自于数据库,而且随时都会更新,在这种情况下,你不可能输入用户名、URL或者最新的产品在这个HTML页面里,因为你不可能使用静态的HTML页面。

FreeMarker对这个问题的解决方案是使用模板(template)来替代静态的HTML页面。模板除了使用FreeMarker的命令,使之能动态化以外,其他的和静态的HTML页面相同:

模板存储在Web服务器,通常就像静态HTML页面。但是无论何时访问这个页面,FreeMarker都会及时的通过把${...}替换成为最新的内容,来将模板转换为普通的HTML页面(例如:把${user}替换为"Big Joe"或者是任何访问该页面的用户)并将结果发送到访问者的浏览器上。这样访问者的浏览器将收到像第一个例子中的HTML页面(例如,普通的不带FreeMarker说明的HTML页面),并且用户不会感觉到其实服务器是在使用FreeMarker。在此期间,模板还在服务器上,没有任何改变,当有人再次访问这个页面时,FreeMarker将再次执行,以保证页面显示的信息总是最新的。现在你可能已经注意到模板没有包含任何命令来发现当前的访问者是谁,或者连接到数据库去查询以得到最新的产品。它看起来好像早已知道这些值。而且确实是这种情况。FreeMarker有一个重要的思想(其实是在MVC)就是显示逻辑和业务逻辑应该分离。在模板中你只要处理视觉问题,也就是说,视觉设计的问题,格式的问题。显示的数据(例如:用户名等等)是在FreeMarker之外来准备的。通常是Java语言或者其他普通的目标语言。这样模板的创建者不需要知道数据是怎样计算的。其实,在模板不作任何修改的情况下,数据完全可能改变,同时页面的外观也可能发生改变。当模板设计者和程序设计者是分开的时候,这种分离会特别有用。FreeMarker(模板设计者)对于数据的计算并不没有兴趣,但是FreeMarker必须知道实际的数据是什么。所有模板要使用的数据将被打包在一个数据模型中。数据是由刚才提到的程序设计者来创建的。模板设计者关心的是数据要像树型结构(就像你硬盘中的目录和文件一样),如下所示:

将这个与你早先看到的模板中的${user}和${lastestProduct.name}比较。就可以推断出数据模型就像计算机系统:一个根路径和一个lastestProduct目录,而url与那么就是lastestProduct目录下的文件。

总结:FreeMarker需要模板和数据模型来生成输出文件(通常是HTML文件)。

 

2.数据模型一览

正如你所看到的,数据模型基本上是一棵树。这棵树可以非常复杂和深,例如:

当作目录的变量被称为哈希表。哈希表存储其他变量的查询名称(例如:"animals","mouse"或者"price")。存储单个值的变量称为标量。当你想使用模板中的一个子变量的时候,你要从根开始指定它的路径,并且每一级用"."分隔开。为了访问price的mouse,你要从根开始,进入animals,然后进入mouse,最后进入price。因此你要写上"animals.mouse.price"。当你将${...}像这样置于表达式周围的时候,你是在告诉FreeMarker在这个点上输出相应的文字。还有另外一类重要的变量:sequences(序列)。它们类似于哈希表,但是它们不能存储它们所包含的变量的名字。相反,它们按顺序存储子变量,你可以用一个数字索引来访问。例如:在这个数据模型中,animals和whatnot.fruits就是sequences:

为了访问一个序列的子变量,你可以在方括号中使用数字索引。索引从0开始,因而索引的第一个项就是0,而第二项就是1,以此类推。所以为了访问第一个animal,你要写上"animals[0].name",为了访问"whatnot.fruits"的第二项,就要写上"whatnot.fruits[1]"。标量可以进一步分成这些分类:

  • String: 文本,就是任意的字符序列,例如:像上面的"m","o","u","s","e"。譬如:name、size就是string。

  • Number: 就是数字的值,像上面的price。注意"50"和50在FreeMarker中是完全不一样的。 前者是一个字符串,而后者是数字。

  • Date/time: 时间或日期。

  • Boolean: 值为:true/false (也可以是yes/no, 或者on/off)。 像上面的"protected"子变量就表示动物是否受保护。

总结:

  • 数据模型形象的说就是一棵树。

  • 标量存储单个值。可以是字符串、数字、日期/时间、或者是一个布尔值。

  • 哈希表是存储其他的变量的容器,并且这些变量与它们的一个可查找的名字相关联。

  • 序列就是按顺序存储其他变量的容器,可以通过数字索引来查找其中的值。数字索引从0开始。

3.模板一览

最简单的模板就是HTML文件(或者纯文本文件--FreeMarker并不限于HTML)。当客户端访问那个页面时,FreeMarker将那个HTML页面原样发送至客户端。然而如果你想让页面具有更多的动态性,那么你要开始将FreeMarker可以解析的特殊的部分添加到HTML页面中:

  • ${... } : FreeMarker将在输出时使用实际值替换掉花括号中的东西。这称之为插值(interpolation )。

  • FTL tags (FreeMarker Template Language tags): FTL(FreeMarker模板标记语言)有点类似于HTML标记, 但是FTL是FreeMarker指令,并且不会在输出时打印出来。FTL标记以"#"开头。(用户自定义的FTL标记用"@"代替"#",但这是高级话题中的部分)

  • Comments: FreeMarker注释类似于HTML注释,但是由<#--和-->限定。在定界符之间包括定界符在内的内容都将被FreeMarker忽略,并且不会再输出时写入。

任何非FTL标记、者插值或者是注释在FreeMarker中都将被视为静态文本,也不会被FreeMarker解释,而只是在输出时原样输出。FTL标签你所说的指令与HTML标签的关系和HTML标签与HTML元素的关系(例如:<table>元素)是一样的。(如果你不不能区别FTL标记与FreeMarker指令的话,就把它们当作同义词吧。)

 指令示例

虽然FreeMarker有许多指令,但是在概述中,我们仅介绍常用的三个。

 if指令

使用if指令,你可以有条件的跳过模板中的一部分,假设在下列例子中你想问候你的老板,Big Joe,以有别于其他用户:

这里你告诉FreeMarker"当user值为"Big Joe"的时侯, 加上", our beloved leader" 。通常在if条件为false时,<#if 条件>和</#if>之间的内容会被跳过。让我们来详细说明一下这里使用的条件:"=="是一个操作符用来测试它左边的值和右边的值是否相等,并且据此返回一个值为true或者是false。在"=="的左边,我引用一个变量的语法,应该已经非常熟悉,将用变量的值来取代。一般情况下, 在指令或插值中引起来的词就是提到的变量。右边我已经指定了一个字符串。模板中的字符串必须始终放在引号内。下面将打印"Pythons are free today!",加入他们的价格为0:

稍早时作为一个字符串直接指定,这里直接指定为( 0 ) 。请注意,数字不能被引起来。如果你用引号引起它( "0" ) , 那么将被FreeMarker曲解为字符串:

正如你所猜的那样,"!=" 是不等于的意思。你也可以这样写:

 

使用<#else> 标签,你可以指定如果if条件为false,将怎样处理。例如:

这将打印''Pythons are cheaper than elephants today.'',加入巨蟒的价格低于大象的价格,或者else打印出''Pythons are not cheaper than elephants today.''。如果你有一个布尔值(true/false)的变量,那么你可以在if条件中直接使用:

 list指令

当以想要列出某些东西的时候,列表指令是很后用的。例如如果你要是想先前的一个示例(data-model I used earlier to demonstrate sequences )来合并模板:

输出将会是这样:

通常list指令的格式如下:

<#list 作为循环变量的序列 >重复部分 </#list>

重复部分 会在你所提供的序列的每一个项被重复,从第一个项开始,一个接着一个。在所有的重复中,循环变量会保存当前项的值。这个变量仅在<#list ...> 和</#list> 标签中存在。作为另一个示例,我们列出数据模型中的水果:

whatnot.fruits 表达式对你来说应该熟悉了吧。

 include指令

使用include 指令你可以在模板中插入另外一个文件。假设你必须要在许多页面中显示同样的版权标志,你可以创建一个包含版权标志的文件,并在你需要显示的地方插入。比方说,你将版权标志保存在copyright_footer.html :

任何你需要的时候,都可以简单的用include 指令来插入:

并且输出如下:

如果你改变了copyright_footer.html 文件, 那么访问者会在所有的页面看都新的版权通知。

综合使用指令

你可以在页面上多次使用指令,并且可以像嵌套HTML元素那样来嵌套使用FreeMarker的指令。例如这将列出所有的动物并使用大字号打印动物的名字:

注意由于FreeMarker并不解释外部的FTL标签、插值和注释,所以它明白上述font标签嵌套的严重性。

 处理找不到的变量

实际上数据模型中经常有些参数是可选的。 发现人们犯了典型的错误, 如果变量找不到,除非你明确告诉FreeMarker怎样处理,否则它不会容许参考的变量变量丢失。在这里,我们将展示两个最典型的方式例子。

注意对于程序员:一个不存在的变量和一个为null的变量对于FreeMarker是同一回事,所以"找不到"涵盖了上述两种情况。

任何你提到变量的地方,你都可以使用"!"和缺省值,来在变量找不到时指定一个缺省值。像下面这个例子,在数据模型中当user 找不到时, 模板会假设user 的值就是"Anonymous" :

<h1>Welcome ${user!"Anonymous"

}!</h1>  

是不是在变量的名字后加上"??"就表示找不到呢。 结合这个和已经介绍的if 指令你可以跳过整个问候,如果user 变量找不到的话:

<#if user??

><h1>Welcome ${user}!</h1></#if>  

 

 

 

SpringBoot系列:Spring Boot使用模板引擎FreeMarker 可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源。 阅读详情

相关推荐

SpringBoot整合模板FreeMarker篇

模板FreeMarker篇 一、FreeMarker 介绍 Freemarker是java的免费模板引擎,主要用于MVC中的view层,生成html展示数据给客户端,可以完全替代jsp。 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中, 然后输出页面。它能够生成各种文本:...

灵越启航 2107

【Java实现导出Word文档功能 XDocReport +FreeMarker】

在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。导出Word方式多种多样,通常有以下几种方式:使用第三方Java工具类库Hutool的Word工具类,参考网址为​ ​https://www.hutool.cn/docs/#/poi/Word生成-Word07Writer​ ​;利用 Apache POI和FreeMarker模板引擎;第三方报表工具。上面的几种方式虽然可以实现Word文档的导出,但有以下 缺点 :第一种方式操作简单

qq_55656404的博客 6924

freeMarker模板加载

freemarker的关键是要得到一个Configuration对象,只有这个对象的getTemplate(name)方法才能获得模板。一般的做法是将获得的模板+数据通过html的response响应流输出到页面。获得这个configuration之前,freemarker先要将模板加载进来,freemarker的有内建的模板加载器,也可以自定义模板加载器。 自定义模板加载器类需要实现freemarker.cache.TemplateLoader接口,然后将它传递给Configuration对象的setTe

siqilou的专栏 6027

SSM框架集成导出Word文档功能 XDocReport +FreeMarker

SSM框架集成导出Word文档功能 XDocReport +FreeMarker

LaughsJoker的博客 2304

freemarker+springboot db方式读取模板配置

1、什么是freemarker FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数

u012278861的博客 1611

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1525

xDocReport+FreeMarker生成word文档

​。

苔的博客 706

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程

本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。

gin88的博客 367

Freemarker If指令

if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否则跳过内容不再输出。 模板: <!DOCTYPE html> <html> <head> <meta charset="utf‐8"> <title>Hello World!</title>...

糖炒栗子的博客 1万+

从选卡到验证:CST仿真GPU加速全流程实战指南

本文详细介绍了CST仿真中GPU加速的全流程实战指南,从硬件选型到软件配置,再到性能验证和常见问题排查。通过对比专业卡与游戏卡的性能差异,提供硬件选型建议,并分享驱动安装、关键设置及CST软件配置的黄金法则,帮助用户显著提升仿真效率。

weixin_30650039的博客 394

支付宝周期扣款实战:从签约到主动扣款的完整Java代码与避坑指南

本文详细介绍了支付宝周期扣款功能的完整Java实现流程,从协议签约到主动扣款的各个环节,包括业务模型设计、签约接口实现、异步通知处理、主动扣款技术等关键步骤。针对开发中常见的陷阱和问题,提供了实用的避坑指南和代码示例,帮助开发者高效实现连续支付功能,提升用户留存率。

weixin_27199085的博客 373

FreeMarker模板制作

一、前言 FreeMarker模板分为Word模板和Excel模板,制作方法都是相似,本篇博客将详细说明。 二、Excel模板制作 2.1 制作excel文档模板,选择新建 Microsoft Excel 工作表.xlsx 工作表 2.2 文件---> 另存为,选择 XML电子表格2003(*.xml),生成后缀名为 .xml 的模板表格 2.3 编辑器打开生成.xml模板表格,找到需要替换的内容,用FreeMarker语法代替和逻辑处理 2.4 删除模板的行数和列..

大话家的博客 5109

解锁SPWM电压利用率:三次谐波注入幅值的黄金分割点

本文深入探讨了SPWM电压利用率的提升方法,重点介绍了三次谐波注入技术及其黄金分割点(1/6比例)。通过数学推导和工程实践,揭示了如何通过特定幅值的三次谐波注入将电压利用率从86.6%提升至115%,与SVPWM相当。文章还提供了实验室调试流程和DSP实现代码,帮助工程师优化逆变器设计。

weixin_30729609的博客 915

freemarker模板引擎详解以及使用方法

freemarker模板引擎详解以及使用方法

真正的大师永远怀着一颗学徒的心 6482

探索Three.js:利用ShaderMaterial实现动态着色器特效

本文深入探讨了Three.js中ShaderMaterial的应用,指导开发者利用GLSL编写自定义着色器实现动态特效。文章从核心概念GLSL、Uniforms与Attributes讲起,通过创建动态颜色变化平面的实战案例,逐步进阶到实现波纹扩散与动态光影等高级效果,并提供了性能优化与调试技巧,帮助读者掌握创建高性能WebGL视觉特效的关键技能。

weixin_29250403的博客 199

【人工智能】AI驱动值班巡检Agent(Hermes)

传统运维值班巡检场景中,存在四大核心痛点:本项目基于 Agent+Skills+浏览器自动化 架构,构建了具备自我进化能力的AI值班员,核心逻辑流如下:

奶爸的编程之路,也就一周冷个三天 177

Freemarker 教程(一)-模板开发手册

layout: post title: “Freemarker 教程(一)-模板开发手册” date: 2021-2-2 08:00:00 +0800 category: Java author: Java课代表 excerpt: 本文是Freemarker系列的第一篇,面向模板开发人员,主要介绍 FreeMarker 所使用的 FTL语法,了解 Freemarker 的基本概念 本文是Freemarker系列的第一篇,面向模板开发人员,主要介绍 FreeMarker 所使用的 FTL(FreeM.

【Java课代表】的博客 5756

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaEE进阶——FreeMarker模板引擎

I. 简介 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于...

等一杯咖啡的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Freemarker--学习笔记

Freemarker学习笔记。一、Freemarker 概述FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。是一个Java类库。FreeMarker 被设计用来生成 HTMLWeb 页面,特别是基于 MVC 模式的应用程序,将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,而是将视图交给 FreeMarker 来输出。

weixin_45694171的博客 2108

freemarker 模板引擎详解

​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。​ 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。

weixin_44213835的博客 1592

freemarker模板引擎

FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网 页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一 款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。

#helloworld的博客 1079

在 Spring Boot 中实现 FreeMarker 模板

FreeMarker是一种功能强大、轻量级的模板引擎,用于在 Java 应用中生成动态文本输出(如 HTML、XML、邮件内容等)。它允许开发者将数据模型与模板文件分离,通过模板语法动态生成内容。FreeMarker 广泛用于 Web 开发、报表生成和自动化文档生成,特别是在 Spring Boot 项目中与 Spring MVC 集成,用于生成动态网页。FreeMarker 是一种高效的模板引擎,适合生成动态内容。在 Spring Boot 中,通过快速集成。

lssffy的博客 1515

FreeMarker生成HTML模板

FreeMarker生成HTML模板 发表于2014-01-09| Java技术 | FreeMarker 文章目录 1.模板文件 2.Java代码 今天,总结下FreeMarker生成HTML模板。 模板文件 这个template.ftl是freemarker的ftl模板文件,freemarker会解析这个文件,然后才生成HMTL文件。 <html...

小屁孩大帅-保密的博客 1237

Freemarker模板引擎

FreeMarker 是。根据前边的数据模型分析,课程预览就是把课程的相关信息进行整合,在课程预览界面进行展示,课程预览界面与课程发布的课程详情界面一致,保证了教学机构人员发布前看到什么样,发布后也会看到什么样。freemarker提供很多指令用于解析各种类型的数据模型,参考地址:http://freemarker.foofun.cn/ref_directives.html。所以模板引擎就是:模板+数据=输出,Jsp页面就是模板,页面中嵌入的jsp标签就是数据,两者相结合输出html网页。

Relievedz的博客 983
上一篇: Spring读书笔记(一) Spring的AOP介绍
下一篇: FreeMarker学习笔记(二) Freemarker模板的值与类型
csuliky
博客等级 码龄19年 77粉丝 57原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值