1. Freemark 简介

FreeMarker是一款模板引擎:一种基于魔板的、用来生成输出文本的通用工具。类似模板引擎还有Velocity,Common Template等。

对于java web开发来说,使用FreeMarker模板,可以将java代码从页面中分离出来。

  • 开发人员只需关注业务逻辑代码,而由页面设计人员去设计显示效果,
  • 两类人员各司其职,发挥其擅长的一面。

2. 常用指令

  • FreeMarker注释:

    类似HTML的注释,用<#–和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间的内容会被FreeMarker忽略,不会执行或输出。

2.1 if指令

if指令进行条件输出控制,类似程序语言中的if语句。

格式:

<#if condition>content</#if>
<#if condition>content<#else>other content</#if>

示例:

<#if username == "boss">Hi boss!</#if>
<#if username == "boss">Hi boss!<#else>Hi!</#if>

说明:上例意思是如果变量username值为"boss",输出Hi boss!,否则输出Hi!。

是来判断在它两侧的值相等的操作符,比较的结果是布尔值,true 或者false。在的左侧,是引用的变量,右侧是指定的字符串。

注意:右侧字面量可以是字符串或数字,如果是字符串,要用引号(单,双引号都行)括起来,并且==左右两边类型要一致,否则出报错。

2.2 list指令

list指令用来遍历集合中的内容。

格式:

    <#list vars as var>  repeat content  </#list>

示例:

<#list ["星期一", "星期二", "星期三"] as day>  ${day}  </#list>

说明:上例输出三行,每行依次输出星期一、星期二、星期三。

集合中元素可以是简单的字符串,如上例,也可以是复杂对象

2.3 assign指令

assign指令用来定义一个变量并给其赋值,或者替换原有变量的值

格式:

<#assign name=value [name1=value1...]>
<#assign name>capture this</#assign>

示例:

 <#assign username="master">

说明:
后一种格式为复杂用法。将assign对中的内容输出作为name变量的值

2.4 include指令

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

<#include "filepath">

示例:

 <#include "/copyright_footer.html">

说明:被包含进来的文件,既可以是静态页,也可以是动态页(即ftl模板)。include指令会先将该文件内容包含进当前模板,然后再跟数据模型结合输出。

3 .处理未定义变量或值为null

当变量未定义时,或值为null时,默认设置下FreeMarker会报错。下面有两种处理方式

3.1.设置默认值

格式:

${varname!default_value}

示例:

  ${user!"visitor"}  ${apple.price!0}

说明:对于多级访问的变量,比如animals.python.price,书写代码: a n i m a l s . p y t h o n . p r i c e ! 0 , 当 a n i m a l s 或 者 p y t h o n 不 存 在 , 那 么 模 板 处 理 过 程 将 会 以 “ 未 定 义 的 变 量 ” 错 误 而 停 止 。 为 了 防 止 这 种 情 况 的 发 生 , 可 以 这 样 来 书 写 代 码 {animals.python.price!0},当animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码 animals.python.price!0,当animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码{(animals.python.price)!0}。这种情况下当animals或python不存在时表达式的结果仍然是0。

3.2.加if判断

格式:

    <#if varname??>content</#if>  <#if varname?exists>content</#if>

示例:

    <#if user??>Hi,${user}</#if>  <#if user?exists>Hi,${user}</#if>

说明:如果user变量存在,且值不为NULL时,才输出Hi,user变量值。同样对于多级访问的变量,??前面的变量名最好被()包含,原因参照!设置默认值。

3.3.修改全局配置

    classic_compatible=true

当FreeMarker指定为"Classic Compatibile"(兼容经典)模式运作时,引擎将会按下列方式输出:

  • 1).友好的处理未定义表达式(即不报错),所谓未定义表达式,就是指“expr”变量未定义,或值为null.

    像、${expr}、“otherexpr == expr”、“otherexpr != expr”、hash[expr]中expr未定义时当成空字符串对待

    像、中expr未定义时,循环体不会执行(就像expr是一个空List一样)

    像用在指令中或作为布尔表达式时,空值将被当成是false来处理。非布尔数据模型或者逻辑操作数也可以放在指令中,空模型(长度为零的字符串,空的数组或者hash集合)被当成是false来对待,其他情况下都被当成是true来处理。

  • 2).布尔值被看作字符串时(比如用${…}输出,或者是和其他字符串连接时),

true值将被转换成“true”字符串处理,false值将被转换成空字符串

  • 3).传给和的标量模型被当成只包含一个该元素的list来处理。

  • 4).指令的路径参数将被作为绝对路径处理

4、常见操作汇总

4.1 直接指定值

  • 字符串:“Foo” 或者 ‘Foo’ 或者 “It’s “quoted”” 或者"C:\raw\string"
  • 数字:123.45
  • 布尔值:true, false
  • 序列:[“foo”, “bar”, 123.45], 1…100
  • 哈希表:{“name”:“green mouse”, “price”:150}

4.2 检索变量

顶层变量:user
从哈希表中检索数据:user.name, user[“name”]
从序列中检索:products[5]
特殊变量:.main

  • 字符串操作

插值(或连接):“Hello ${user}!”(或"Free" + “Marker”)
获取一个字符:name[0]

  • 序列操作

连接:users + [“guest”]
序列切分:products[10…19] 或 products[5…]

  • 哈希表操作

连接:passwords + {“joe”:“secret42”}

  • 算数运算

(x * 1.5 + 10) / 2 - y % 100

  • 比较运算

x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, x > y 等等

  • 逻辑操作

!registered && (firstVisit || fromEurope)

  • 内建函数

name?upper_case

  • 方法调用

repeat(“What”, 3)

  • 处理不存在的值

指定默认值:name!“unknown” 或name! 多级访问变量(user.name)!“unknown” 或者 (user.name)!
检测不存在的值:name?? ,(user.name)??

5. 数字格式化问题

当数字超过3位的时候,默认输出会自动带上逗号。例如2000,会显示为2,000。还有当小数位数超过3位时,默认只显示小数点后3位。例如1.33213,会显示为1.332;1.33253,会显示为1.333;

  • 如何解决呢?

    1> 加?c,即转成字符串,如:${userId?c}

2> 修改配置文件freemarker.properties加上number_format=#

6. 格式化输出

  • ${xx?c} //转成字符串显示
  • ${xx?string.number}//按数字显示
  • ${xx?string.currency}//按贷币格式显示
  • ${xx?string.percent} //按百分比格式显示

7. 去空格

  • ${xx?trim}

8.格式化日期

  • ${date?string(“yyyy-MM-dd HH:mm:ss”)}
  • ${date?string(“yyyyMMdd”)}

freemark(一): 简介及其使用相关推荐

  1. FreeMark简介

    Freemarker.它是为程序显示数据而准备的.(像数据库SQL语句的查询.)以及.Freemarker仅仅是利用模板加上数据生成文本页面,Freemarker并不是一个WEB应用程序框架.可以说是 ...

  2. mustache模板技术简介

    mustache模板技术简介 一.简介 Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,通常是标准的 HTML 文档.当然不同的开发语言有不同模板引擎,如 J ...

  3. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  4. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  5. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  6. TensorRT简介

    TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...

  7. 谷粒商城学习笔记——第一期:项目简介

    一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...

  8. 通俗易懂的Go协程的引入及GMP模型简介

    本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...

  9. Linux 交叉编译简介

    Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...

最新文章

  1. Web API与JWT认证
  2. joda time, jackson 与 scala 反射
  3. Oracle CBO 与 RBO
  4. python 內建数据类型
  5. 八十四、Python | Leetcode回溯算法系列
  6. STM32学习之路-SysTick的应用(时间延迟)
  7. Spring Cloud 配置中心客户端读取配置
  8. mkpasswd命令使用方法
  9. java设计模式之美_《设计模式之美》-笔记
  10. topcoder srm 661 div1
  11. [Be a Coding Plasterer] Components 1:get Basic Things
  12. 寻找二叉树最小叶子节点值
  13. linux qt安装包下载链接
  14. PreScan第一课:软件简介和基础
  15. RS485串口Modbus设备联网解决方案
  16. java graphics类_java_关于Graphics类
  17. 华为官方模拟器eNSP_B500高速网盘下载——带CE系统
  18. iOS app url scheme跳转到淘宝商品详情页 唤醒app
  19. stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级
  20. R for LC+cohort

热门文章

  1. Unity3D实战【八】Animator 动画控制器
  2. 旅游与摄影杂志旅游与摄影杂志社旅游与摄影编辑部2023年第4期目录
  3. qq和TIM都不能联网解决方法 “登陆超时,请检查你的网络或者本机防火墙设置。错误码:0x00000001”
  4. 【论文阅读】Reliable and Trustworthy Machine Learning for Health Using Dataset Shift Detection
  5. mysql给表添加行号
  6. 【leetcode】286. 墙与门
  7. JavaScript前端页面三大家族
  8. 阿里入股“百脑汇”背后暗藏啥玄机?
  9. matlab 平面 偶极子 声场,二维矢量声强的误差分析
  10. 阿里内部不传之秘:1000页算法刷题笔记(附源码可直接运行)