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"))!} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章