网上有一篇比较完善的中文的FreeMarker语法介绍的帖子,这里主要补充一些容易犯错和容易混淆的语法问题,特别是结合Struts2的Taglib一起使用时的问题。
普通的文本域(textfield)或隐藏域(hidden)
<@s.hidden name="user.id" />
<@s.hidden name="userId" value="${user.id}" />
下拉选择框(select)或复选框组(checkboxlist)
<@s.select name="receiver" list=users listKey="id" listValue="name" value="receiver.id" />
上面的例子两点值得注意:
- list属性指定的参数没有双引号。
- value属性指定的选中值没有变量符号。
再看几个其它的例子:
<@s.select name="color" list=enums["demo.enums.Color"]?values listKey="value" listValue="text" headerKey="" headerValue="全部" value="color.value" />
<@s.select name="color" list=statics["demo.Constants"].COLORS listKey="value" listValue="text" headerKey="" headerValue="全部" />
<#assign colors = {"RED":"#FF0000", "YELLOW":"#00FF00", "BLUE":"0000FF"}>
<@s.select name="color" list=colors listKey="value" listValue="key" headerKey="" headerValue="全部" />
日期变量的格式
即使已经设定了日期时间的默认格式,通常在显示日期格式时还是会费一些周折。
config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
config.setDateFormat("yyyy-MM-dd");
config.setTimeFormat("HH:mm:ss");
以直接输出一个时间变量为例:
${createDate}
createDate是完整的时间,那么会输出
"yyyy-MM-dd HH:mm:ss"格式。
createDate不是完整的时间,会报错,需要指定
?datatime ?date ?time。
${createDate?datetime}
${createDate?date}
${createDate?time}
但如果createDate有可能为null呢?
${createDate?date!}
${(createDate?date)!}
${createDate!?date}
${(createDate!)?date}
以上写法都是错的,只能这么写:
${(createDate?string("yyyy-MM-dd"))!}