FreeMark (一):简介及其使用

原创 2018年04月17日 18:35:47

1. Freemark 简介

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

对于java web开发来说,使用FreeMarker模板,可以将java代码从页面中分离出来。
- 开发人员只需关注业务逻辑代码,而由页面设计人员去设计显示效果,
- 两类人员各司其职,发挥其擅长的一面。

2. 常用指令

  • FreeMarker注释:

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

2.1 if指令

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

格式:
“`
<#if condition>content


示例:

<#if username == “boss”>Hi boss!


说明:上例意思是如果变量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 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,书写代码:animals.python.price!0animalspython{(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”)}
版权声明:本文为博主原创文章,转载请注明出处!!!!!!!!!! https://blog.csdn.net/qq_21434959/article/details/79978919

第1周:机器学习简介-人工智能工程师直通车

本课程共分为三个阶段。从机器学习到深度学习,再到项目实战,循序渐进,层层深入。除了系统讲解成为一名人工智能工程师所需的理论知识外,每节课还会配有实战案例,通过练习巩固所学知识,学以致用解决实际问题。第三个阶段包含四个大型工业级综合实战案例,采用大量真实数据集,完美模拟工作场景。学完后,大家绝对可以胜任人工智能领域相关工作。
  • 2018年01月19日 18:15

freemarker高级用法1

freemarker高级用法1   2012-03-21 12:31:18|  分类: freemarker |  标签: |字号大中小 订阅 1, ?interp...
  • yztezhl
  • yztezhl
  • 2013-07-25 16:28:42
  • 1384

freemarker 模版简介 if指令

简介:1.${expression}  :有点像JSP中的el表达式,但是在freemarker中这个不叫el表达式,功能上大致一样,它将会输出真实的值来替换花括号里的表达式,向这样的表达式(指的是在...
  • yhc13429826359
  • yhc13429826359
  • 2013-06-19 17:43:52
  • 1513

freemark使用 一

 在java程序中使用FreeMarker众所周知, freemarker 的思想是:模板+数据模型=输出那么我们就在Java程序中看看freemarker是如何做到的1.创建Configuratio...
  • hakunamatata2008
  • hakunamatata2008
  • 2009-01-19 16:29:00
  • 2986

Spark入门实战系列--1.Spark及其生态圈简介

Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark ...
  • yirenboy
  • yirenboy
  • 2015-08-05 11:18:30
  • 4779

freemark文档

  • 2010年06月17日 23:37
  • 288KB
  • 下载

Swift架构和原理详解

一 关于存储对象存储系统是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势,提供了高可靠行,跨平台性以及安全的数据共享的存储体系结构。二 Swift特点极高的数据持久性...
  • chengqiuming
  • chengqiuming
  • 2018-02-21 19:54:01
  • 156

LoadRunner基本介绍及简单操作流程

一、             LoadRunner组件 a)         虚拟用户生成器——捕捉用户业务流程,创建自动性能测试脚本 b)        Controller——组织、驱动、管理...
  • xxl1988922
  • xxl1988922
  • 2011-08-27 22:36:30
  • 2112

putty简介

putty简介   Putty   随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程。在各种远    程登录工具中,Putty是出色的工具之一。   Putty是一...
  • xiaotom5
  • xiaotom5
  • 2012-11-15 15:37:30
  • 1764

pandas学习笔记(1)--pandas简介

Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高...
  • lwplwf
  • lwplwf
  • 2017-02-20 16:31:16
  • 1839
收藏助手
不良信息举报
您举报文章:FreeMark (一):简介及其使用
举报原因:
原因补充:

(最多只允许输入30个字)