[Freemark]freemark常用语法

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,
而是一个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 用于将字符串中的<、>、&和“替换为对应得<>":&


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


== 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}



== 定义变量,显示变量
<#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 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 pro.proComment != "">//${pro.proComment}

1. 判断对象是否存在(null)
例如判断 target 是否为null,如果不为 nll 则做xxx动作
<#if target??>
    xxxx

 (目标变量后面连续两个??)
 
2. 字符串或数字比较
 java里标准字符串比较需要 .equals() 方法,在freemarkder中进行了简化,字符串的比较方法和数字做到完全一样
 <#if str == "success">
    xxx

<#if str !== "error">
    xxx


==判断是否包含子串:
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}
 */
 

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

你可能感兴趣的:(Freemark)