它不是面向最终用户的,
而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker模板的编写语言为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据,而在模板之外注意于要展示什么数据。

注意:freemarker中显示某对象使用${name}, freeMarker控制较严格,对于null,或者miss value,freemarker会报错。

1. 需要判断对象是否为空;

2. 也可以通过设置默认值来避免对象为空的错误。

判断为空具体方法:


!:default value operator,语法结构为:unsafe_expr!default_expr,

     ${name!''}如果name为空,就以默认值(“!”后的字符)显示。

   对象user,name为user的属性的情况,user,name都有可能为空,可以写成${(user.name)!''},

     表示user或者name为null,都显示为空。

??: Missing value test operator ,测试是否为missing value

     product.color??将只测试color是否为null

     (product.color)??将测试product和color是否存在null

?exists:旧版本的用法



常用语法:

<#--   --> freemark的注释

前提:将数据封装到map中,每个元素可以是个对象,有属性,有关联的对象

properties 为准备好的Map对象集合,

${ package } packge为变量,为map的key,${}后可以直接显示内容;
${.now} 当前时间


className=dept
${ className?cap_first }   首字母大写
${ className?uncap_first } 首字母小写
全小写
<#if (list.title?length>15)> 字符串长度
${ package?replace(".","/") } 替换

== html
html 用于将字符串中的<、>、&和“替换为对应得&lt;&gt;&quot:&amp

== 特殊字符替换
$ ${'$'}
# ${'#'}


== FreeMarker不会自动进行类型的转换
 
常见的转换:
 
String -->  int            ?eval
int       -->  String      ?c

freemarker中的c函数是将数字转换成字符串,当你在页面中要显示带小数的数字时,一定要写成${x?c}而不能写成${x?default('')},否则显示出的数字都变成了整数,小数位都被自动截掉了。切记!!!

== 遍历集合
<#list properties as pro>  
private  ${pro.proType} ${pro.proName};<#if pro.proComment != "">//${pro.proComment}</#if>
</#list>


== 定义变量,显示变量
<#assign x=pro.proName?index_of("createBy")>
${x}

布尔类型转换为字符串显示
<#assign x=pro.primary?string('yes', 'no')>
${x}


Boolean类型不能使用isXxx,需要使用getXxx,因为Freemarker使用java会对isXxx映射返回boolean基本型,但是freemarker不支持基本类型boolean,会抛异常。
freemarker中输出时可以使用这种方式输出${xxx?string("true","flase")}当xxx为true时显示字符串true,否则为字符串false,当然true,false字符串也可以换成其他字符串,比如yes和no。

==布尔判断
<#if pro.primary>
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
</#if>
<#if pro.primary?string('yes', 'no')=="no">
<#if "createBy,createDept,createTime,updateBy,updateTime"?index_of(pro.proName) == -1>
public ${pro.proType} get${pro.proName?cap_first}() {
return this.${pro.proName};
}
public void set${pro.proName?cap_first}(${pro.proType} ${pro.proName}) {
this.${pro.proName} = ${pro.proName};
} 
</#if>
</#if>


 ==判断空串
 <#if pro.proComment != "">//${pro.proComment}</#if>

 1. 判断对象是否存在(null)
 例如判断 target 是否为null,如果不为 nll 则做xxx动作
 <#if target??>
     xxxx
 </#if>
  (目标变量后面连续两个??)
  
 2. 字符串或数字比较
  java里标准字符串比较需要 .equals() 方法,在freemarkder中进行了简化,字符串的比较方法和数字做到完全一样
  <#if str == "success">
     xxx
 </#if>
 <#if str !== "error">
     xxx
 </#if>



==判断是否包含子串:
 pro.proName为子串
 <#if "CreateBy,CreateDept,CreateTime"?index_of(pro.proName)==-1>

 == 高级应用:宏        --常用场景:实现每个文件引入版本example:
在CopyRight.ftl中定义:
<#macro CopyRight> 
/**
  * @Description: ${ className }Service接口
  * @Author: 米米米
  * @Company: http://java.cn
  * @CreateDate: ${.now}
  */
  </#macro>

 调用:
 <#import "CopyRight.ftl" as my>
 <@my.CopyRight/>