而是一個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}</#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/>