FreeMarker簡單總結

!對輸出的空值做處理,只輸出無返回值

輸出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三種類型的日期時間設置格式,例如:

  1. config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");

  2. config.setDateFormat("yyyy-MM-dd");

  3. 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 類型的變量沒有指定格式在頁面也能正確顯示,這是什麼情況?例如:


 
  1. @Entity

  2. @Table(name = "Tmp_Company")

  3. public class Company extends UuidEntity {

  4. ...

  5. /** 成立日期 */

  6. @Temporal(TemporalType.DATE)

  7. private java.util.Date foundDate;

  8. ...

  9. }

在查看頁面使用${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時,在頁面怎麼寫纔會不報錯呢?


 
  1. ${foundDate?date!}

  2. ${(foundDate?date)!}

  3. ${foundDate!?date}

  4. ${(foundDate!)?date}

已經是很醜陋的寫法了吧,但以上寫法都是錯誤的,正確的只能這麼寫:

${(foundDate?string("yyyy-MM-dd"))!} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章