!對輸出的空值做處理,只輸出無返回值
輸出name的值:${name}。如果name爲null,就會報錯。
輸出name的值:${name!}。如果name爲null,就不會報錯,什麼也沒輸出。(重點)
輸出name的值:${name!"默認值"}。如果name爲null,就輸出”默認值”字符串。(重點)
輸出name的值:${name!100}。如果name爲null,就輸出100。
輸出user.name的值:${(user.name)!"默認值”},如果user或name爲null,就輸出默認值。(重點)
輸出user.name的值:${user.name!"默認值”},如果user爲null會報錯,如果name爲null,就輸出默認值。
使用default內建函數來處理:${user.name?default('vakin')} (較繁瑣)
??測試是否爲null,返回boolean值
product.color??將只測試color是否爲null
(product.color)??將測試product和color是否存在null
freemarker中??和?的區別
??是判斷對象是否爲空,例如:<#if object??>object對象不爲空(即object存在)</#if>
?後面要加內建函數名,例如:<#if object?exists>object對象不爲空(即object存在)</#if>
<#if str??>${str?string}</#if><#--將str以字符串形式顯示-->
freemarker的內建函數
${nowDate?time}<#--將現有時間以時間的格式顯示,顯示結果如:15:13:05-->
${nowDate?date}<#--以日期格式顯示,如:2011-4-28-->(date的格式可以在freemarker.properties文件中配置)
日期格式化 ${time?string("yyyy-MM-dd")}
截取字符串 ${str?substring(0,2)}
indexof的使用 ${str?last_index_of(",")}
split的使用
<#list "12,13,14,15"?split(",") as item>
${item}
</#list>
${s?if_exists}
${item_index?if_exists+1}
${user.name?default('vakin')},同上
freemarker運算符
<#if score gte 60>
及格
<#elseif score gte 80 && score lte 90>
良好
<#else>
高材生
</#if>
1. FreeMarker中的日期時間格式設置
FreeMarker中可以分別對date、time、datetime三種類型的日期時間設置格式,例如:
-
config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
-
config.setDateFormat("yyyy-MM-dd");
-
config.setTimeFormat("HH:mm:ss");
當我們對一個頁面變量使用 ?date
?time
?datetime
時就會分別按以上設置的對應格式顯示。
2. 什麼情況下可以不使用 ?date
?time
?datetime
FreeMarker會將 java.sql.Date
java.sql.Time
java.sql.Timestamp
類型的變量自動識別爲 date
time
datetime
。所以當變量是以上三種類型時,FreeMarker會自動匹配設置的格式,不需要在變量的後面加上?date
?time
?datetime
。
3. 變量爲 java.util.Date
類型時的困惑
FreeMarker無法自動識別 java.util.Date
類型應該顯示哪種格式,這時需要明確的指定其要顯示的格式,否則FreeMarker將會拋出異常。但有些時候我們發現 java.util.Date
類型的變量沒有指定格式在頁面也能正確顯示,這是什麼情況?例如:
-
@Entity
-
@Table(name = "Tmp_Company")
-
public class Company extends UuidEntity {
-
...
-
/** 成立日期 */
-
@Temporal(TemporalType.DATE)
-
private java.util.Date foundDate;
-
...
-
}
在查看頁面使用${company.foundDate}
時,沒有指定格式卻能夠正確顯示。這是因爲@Temporal(TemporalType.DATE)
註解讓ORM框架在從數據庫中取出數據後將 java.util.Date
類型自動轉換成了 java.sql.Date
類型,這時FreeMarker會自動識別其格式。假如在這個業務實體類上加上@Cache
註解,分別使用不同的緩存策略,還會出現更有意思的現象,這裏就不展開說了。
4. 結論
當變量類型是 java.sql.Date
java.sql.Time
java.sql.Timestamp
時,可以不用指定格式;當變量類型是java.util.Date
時,指定格式纔是最穩妥的辦法。
5. 補充
如果上例中的foundDate允許爲null時,在頁面怎麼寫纔會不報錯呢?
-
${foundDate?date!}
-
${(foundDate?date)!}
-
${foundDate!?date}
-
${(foundDate!)?date}
已經是很醜陋的寫法了吧,但以上寫法都是錯誤的,正確的只能這麼寫:
${(foundDate?string("yyyy-MM-dd"))!}