Freemarker 基础语法使用 相关容易错误知识点 每个用法都写了demo代码 值得一看^_^
1:FreeMarker语言概述
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
而FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。
2:FreeMarker特性
通用目标
能够生成各种文本:HTML、XML、RTF、Java源代码等等
易于嵌入到你的产品中:轻量级;不需要Servlet环境
插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等
你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器
强大的模板语言
所有常用的指令:include、if/elseif/else、循环结构
在模板中创建和改变变量
几乎在任何地方都可以使用复杂表达式来指定值
命名的宏,可以具有位置参数和嵌套内容
名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突
输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换
通用数据模型
FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示
你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰
3:基本指令用法和错误的点
3.1 处理不存在的变量&对象 用??来判断
一个不存在的变量和一个是 null
值的变量, 对于FreeMarker来说是一样的,所以这里所指的"丢失"包含这两种情况。
//错误的写法
<#if test> //如果在一个变量或者对象的时候 不加上判断为null的情况就会报错
</#if>
//正确的写法
<#if test ??> //变量名后面通过放置 ?? 来询问一个变量是否存在。将它和 if 指令合并, 那么如果 user 变量不存在的话将会忽略整个问候的代码
</#if>
3.2 对象存在,对象中的变量值为null需要加 ?if_exists
//错误的写法
<#list test as item> //item 是可以自定义的
<li>${test.name}<li>
</#list>
//正确的写法
1:test首先需要判断是否为null
2: 要加上?if_exists ?if_exists如果存在 返回该变量值,否者不输出
3: test.name也要加上?if_exists判断
<#if test ??>
<#list test?if_exists as item> //item 是可以自定义的
<li>${test.name?if_exists}<li>
</#list>
</#if>
3.3 if 指令与比较运算符一起搭配 相关使用
表达式中支持的比较运算符有如下几种:
1. =(或者==):判断两个值是否相等;
2. !=:判断两个值是否不相等;
注: =和!=可以用作字符串、数值和日期的比较,但两边的数据类型必须相同。而且FreeMarker的比较是精确比较,不会忽略大小写及空格。
3. >(或者gt):大于
4. >=(或者gte):大于等于
5. <(或者lt):小于
6. <=(或者lte):小于等于
注: 上面这些比较运算符可以用于数字和日期,但不能用于字符串。大部分时候,使用gt比>有更好的效果,因为FreeMarker会把>解释成标签的结束字符。可以使用括号来避免这种情况。
1:判断2个值是否相等
<#if id == 0> //也可以写成 <#if id = 0>或者<#if id == "0">
</#if>
2:判断2个值不想等
<#if id != 0> //也可以写成 <#if id != 0>或者<#if id != "0">
</#if>
3:判断当前数字大于
<#if id > 0> //也可以写成 <#if id gt 0>
</#if>
4:判断当前数字大于等于
<#if id >= 0> //也可以写成 <#if id gte 0>
</#if>
5:判断当前数字小于
<#if id < 0> //也可以写成 <#if id lt 0>
</#if>
6:判断当前数字小于等于
<#if id <= 0> //也可以写成 <#if id lte 0>
</#if>
3.4 list 标签相关使用
3.4.1 list 就是一个遍历输出数组的标签
//这里的test数组 只有3条数据记录
<#if test ??>
<#list test?if_exists as item> //item自定义 随便写
<li>${item.name}</li>
</#list>
</#if>
//页面输出结果的话就是
<li>小兰</li>
<li>小王</li>
<li>小谭</li>
3.4.2 list (长度,遍历,下标,嵌套,排序,)
默认设置当前数组为3
1:list遍历数组输出
<#if test ??>
<#list test ?if_exists as item>
<li>${item.name}</li> //name是你的变量名称
</#list>
</#if>
2:list获取每条数据的下标 _index为每条数据的下标 下标也是从0开始
<#if test ??>
<#list test ?if_exists as item>
<li>${item_index}</li>
</#list>
</#if>
//页面输出就是
<li>0</li>
<li>1</li>
<li>2</li>
3:list对数组排序 升序&降序
3.1 升序
<#list test?sort_by("字段") as item>
</#list>
3.2降序
<#list test?sort_by("字段")?reverse as item>
</#list>
4:list长度的判断
<#if test??>
<#list test?if_exists as item>
<#if (test?size == 6) > 6</#if>
<#if (test?size == 8) > 8</#if>
</#list>
</#if>
3.5 split 字符串切割
<#if test ??>
<#list test?split(",") as item> //切割的字符是可以自己根据数据来指定的哈
<td>年龄:${item}</td>
</#list>
</#if>
3.6 list标签遍历map数据
<#if map2?exists>
<#list map2?keys as key>
key:${key}
</#list>
</#if>
3.7基本数据类型 补充一下
1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出
2. 日期型:等价于java中的Date类型, 不同之处在于不能直接输出,需要转换成字符串再输出
3. 数值型:等价于java 中的int, float, double 等数值类型,有三种显示形式:数值型(默认) 、货币型、百分比型
4. 字符串型:等价于java 中的字符串,有很多内置函数
5. sequence 类型:等价于java中的数组,list,set 等集合类型
6. hash 类型:等价于java 中的Map 类型
后续还会更新文章介绍相关的写法和注意点 谢谢阅读当前文章 期待你的评论文章不足之处。 我的博客网站:TAN博客