这样会遇到一个问题,当数据超过3位的时候,freemarker会自动用逗号截取 格式如:2,008

如何解决呢?

1> 加.toString(),如:${(userId).toString()}
 2> 加?c,如:${(userId)?c}
 3> freemarker配置文件freemarker.properties加上number_format=#

判断是否为空:

1.<#if xx[0]?exists>
 2.<#if xx??>
 3.<#if xx?default("xxx")>

不然当没有数据的时候 ,很大很大一个黄页就等着你了

序列号:

有时候页面的table需要在第一列显示序号 只需要使用 _index 即可 不过是从0开始的 你可以+1 比如:

<#list list as a>
 ${a_index+1}
 </#list>

数据类型转换:

${xx?string} //字符串
 ${xx?number}//整数
 ${xx?currency}//小数
 ${xx?percent}//百分比

截取字符串长度:

有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度

< lt. <= lte. > gt. >= gte
 <#if jstbqkVO.gzdd?length lt 8>
 <a href>${jstbqkVO.gzdd?default("")}</a>
 <#else>
 <a href title="${jstbqkVO.gzdd}">${jstbqkVO.gzdd[0..3]?default("")}...</a>
 </#if>

意思就是如果这个字符串的长度小于8,那么就正常显示,反之则取4位

嵌套list:

很多时候,数据库里存储的都是编号,而页面上需要显示的汉字,而且不在一张表里,看列子

<#list jsskList as jsskVO>
 <#list kcList as kcVO>
 <#if kcVO.kch=jsskVO.kch> (kcVO里有编号和名称,而jsskVO里只有编号)
 ${kcVO.kcm}
 </#if>
 </#list> </#list>

排序:

1.升序.sort_by()
 <#list list?sort_by("字段") as x>
 </#list> 2.降序.sort_by()?reverse
 <#list list?sort_by("字段")?reverse as x>
 </#list>

去空格:

${xx?trim}

格式化日期:

${date?string("yyyy-MM-dd HH:mm:ss ")}
 ${date?string("yyyyMMdd ")}

-------------------------------------------------------------------------------------------------------------------

1. 一、常用语法 
2. EG.一个对象BOOK 
3. 1、输出$...{book.name} 
4. 2、空值判断:$...{book.name?if_exists}, 
5. $...{book.name?default(‘xxx’)}//默认值xxx 
6. $...{book.name!"xxx"}//默认值xxx 
7. 3、日期格式:$...{book.date?string('yyyy-MM-dd')} 
8. 4、数字格式:$...{book?string.number}--20 
9. $...{book?string.currency}--<#--$20.00--> 
10. $...{book?string.percent}—<#--20%--> 
11. 5、插入布尔值: 
12.  <#assignfoo=true/> 
13. $...{foo?string("yes","no")}<#--yes--> 
14. 
15. 二、内置方法 
16. 1、数字型 
17.  <#assignanswer=42/> 
18. $...{answer} 
19. $...{answer?string}<#--thesameas$...{answer}--> 
20. $...{answer?string.number} 
21. $...{answer?string.currency} 
22. $...{answer?string.percent} 
23. 
24.  <#settingnumber_format="0.###E0"/> 
25. 
26. $...{12345?string("0.####E0")} 
27. 
28. 
29. $...{answer?string("number")}等同于:$...{answer?string.number}. 
30. 
31. 2、日期型: 
32. 预定义格式包括:short,middle和long。 
33. $...{openingTime?string.short} 
34. $...{openingTime?string.medium} 
35. $...{openingTime?string.long} 
36. 组合使用:$...{lastUpdated?string.short_long} 
37. $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")} 
38. 
39. 3、逻辑型 
40. foo?string 
41. foo?string("yes","no") 
42. 4、序列的内置方法: 
43. first 
44. last 
45. seq_contains 
46. $...{x?seq_contains("blue")?string("yes","no")} 
47. seq_index_of 
48. seq_last_index_of 
49. reverse 
50. size 
51. sort 
52. sort_by 
53. 多层次的hash排序 
54.  <#assignmembers=[ 
55. ...{"name":...{"first":"Joe","last":"Smith"},"age":40}, 
56. ...{"name":...{"first":"Fred","last":"Crooger"},"age":35}, 
57. ...{"name":...{"first":"Amanda","last":"Fox"},"age":25}]> 
58. Sortedbyname.last: 
59.  <#listmembers?sort_by(['name','last'])asm> 
60. -$...{m.name.last},$...{m.name.first}:$...{m.age}yearsold 
61.  </#list> 
62. 
63. chunk:将一个序列分解成几个序列。 
64.  <#assignseq=['a','b','c','d','e','f','g','h','i','j']> 
65.  <#listseq?chunk(4)asrow> 
66.  <#listrowascell>$...{cell}</#list> 
67.  </#list> 
68.  <#listseq?chunk(4,'-')asrow> 
69.  <#listrowascell>$...{cell}</#list> 
70.  </#list> 
71. chunk经常用于分栏或者表格输出的格式。 
72. 5、hash内置方法: 
73. keys: 
74. values: 
75. 三、序列 
76. 由逗号分隔的变量列表,由方括号限定,类似java中的一维数组 
77. 
78.  <#assignseq=["winter","spring","summer","autumn"]> 
79.  <#listseqasx> 
80. ${x_index+1}.${x} 
81. 
82.  <#ifx_has_next>, 
83. 
84.  </#list> 
85. 
86. 输出 
87. 1.winter, 
88. 2.spring, 
89. 3.summer, 
90. 4.autumn 
91. 
92. 四、Hashes(散列) 
93. 
94. 由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"greenmouse","price":150},键和值都是表达式,但是键必须是字符串。 
95.  <#assignages=...{"Joe":23,"Fred":25}+...{"Joe":30,"Julia":18}> 
96. Joeis$...{ages.Joe} 
97. Fredis$...{ages.Fred} 
98. Juliais$...{ages.Julia} 
99. 结果: 
100. -Joeis30 
101. -Fredis25 
102. -Juliais18 
103. 五、freemarker的空值和默认值 
104. 
105. ${user?if_exists} 
106. 
107. ${user?default('yourname')} 
108. 
109. 判断对象是不是null 
110.  <#ifmouse?exists> 
111. Mousefound 
112.  <#else> 
113. 
114. 或<#ifbook.name??> 
115. 
116. Mousefound 
117.  </#if> 
118. list空值判断<#ifbookList?size=0> 
119. 
120. 六、算术运算 
121. 比较操作符-<#ifexpression>...</#if> 
122. 1.)使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等 
123. 2.)=和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="1">会引起错误 
124. 3.)Freemarker是精确比较,所以"x"、"x"和"X"是不相等的 
125. 4.)对数字和日期可以使用<、<=、>和>=,但不能用于字符串 
126. 5.)由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if(x>y)>,另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>= 
127. 
128. 逻辑操作符-&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误 
129.  <#ifx<12&&color="green"> 
130. Wehavelessthan12things,andtheyaregreen. 
131.  </#if> 
132.  <#if!hot><#--herehotmustbeaboolean--> 
133. It'snothot. 
134.  </#if> 
135. 
136. 内置函数-用法类似访问hash(散列)的子变量,只是使用"?"替代".",例如:user?upper_case 
137. 下面列出常用的一些函数: 
138. 对于字符串 
139. html-对字符串进行HTML编码 
140. cap_first-使字符串第一个字母大写 
141. lower_case-将字符串转换成小写 
142. trim-去掉字符串前后的空白字符 
143. 对于Sequences(序列) 
144. size-获得序列中元素的数目 
145. 对于数字 
146. int-取得数字的整数部分(如-1.9?int的结果是-1) 
147. 
148. 例一: 
149. 
150.  <#--test的值为Tom&Jerry--> 
151. $...{test?html} 
152. $...{test?upper_case?html} 
153. 结果: 
154. Tom&Jerry 
155. TOM&JERRY 
156. 
157. 例二: 
158. 
159.  <#--seasons的值为"winter","spring","summer","autumn"--> 
160. $...{seasons?size} 
161. $...{seasons[1]?cap_first}<#--leftsidecanbyanyexpression--> 
162. $...{"horse"?cap_first} 
163. 结果: 
164. 4 
165. Spring 
166. Horse 
167. 
168. 方法的调用 
169. $...{repeat("What",3)} 
170. $...{repeat(repeat("x",2),3)+repeat("What",4)?upper_case} 
171. 结果: 
172. WhatWhatWhat 
173. xxxxxxWHATWHATWHATWHAT 
174. 
175. 操作符优先顺序 
176. 后缀[subvarName][subStringRange].(methodParams) 
177. 一元+expr、-expr、! 
178. 内建? 
179. 乘法*、/、% 
180. 加法+、- 
181. 关系<、>、<=、>=(lt、lte、gt、gte) 
182. 相等=、!= 
183. 逻辑&& 
184. 逻辑|| 
185. 数字范围.. 
186. 
187. 三.)Interpolation:由$...{...}或#...{...}两种类型,输出计算值,可以定义输出的格式 
188. 例一: 
189. 
190.  <#settingnumber_format="currency"/> 
191.  <#assignanswer=42/> 
192. $...{answer} 
193. $...{answer?string}<#--thesameas$...{answer}--> 
194. $...{answer?string.number} 
195. $...{answer?string.currency} 
196. $...{answer?string.percent} 
197. 结果: 
198. $42.00 
199. $42.00 
200. 42 
201. $42.00 
202. 4,200% 
203. 
204. 例二: 
205. 
206. $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")} 
207. $...{lastUpdated?string("EEE,MMMd,''yy")} 
208. $...{lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")} 
209. 结果: 
210. 2003-04-0821:24:44PacificDaylightTime 
211. Tue,Apr8,'03 
212. Tuesday,April08,2003,09:24:44PM(PDT) 
213. 
214. 例三: 
215. 
216.  <#assignfoo=true/> 
217. $...{foo?string("yes","no")} 
218. 结果: 
219. yes 
220. 
221. 例四: 
222. 
223.  <#--xis2.582andyis4--> 
224. #...{x;M2}<#--2.58--> 
225. #...{y;M2}<#--4--> 
226. #...{x;m1}<#--2.6--> 
227. #...{y;m1}<#--4.0--> 
228. #...{x;m1M2}<#--2.58--> 
229. #...{y;m1M2}<#--4.0--> 
230. 说明:mX-小数部分最小X位;MX-小数部分最大X位。 
231. 
232. 四.)注释:<#--和--> 
233. 
234. 下面是一个常用的模板例子: 
235. 
236.  <p>Wehavetheseanimals: 
237.  <tableborder=1> 
238.  <tr><th>Name<th>Price 
239.  <#listanimalsasbeing> 
240. <tr>
241. <td>
242.  <#ifbeing.size="large"><b></#if> 
243. $...{being.name} 
244.  <#ifbeing.size="large"></b></#if> 
245.  <td>$...{being.price}Euros 
246.  </#list> 
247.  </table> 
248.  <#include"/copyright_footer.html"> 
249. 注意点: 
250. 1.)FreeMarker是区分大小写的; 
251. 2.)FTL标记不能位于另一个FTL标记内部,例如:<#if<#include'foo'>='bar'>...</if>; 
252. 3.)$...{…}只能在文本中使用; 
253. 4.)多余的空白字符会在模板输出时去除; 
254. 5.)如果使用的指令不存在,会产生一个错误消息。 
255.  <#--x的值设定为5--> 
256. $...{x*x-100} 
257. $...{x/2} 
258. $...{12%10} 
259. 结果: 
260. -75 
261. 2.5 
262. 2 
263. 
264. 注意:操作符两边必须是数字;使用"+"时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。 
265. 使用内建的指令int获得整数部分: 
266. $...{(x/2)?int} 
267. $...{1.1?int} 
268. $...{1.999?int} 
269. $...{-1.1?int} 
270. $...{-1.999?int} 
271. 结果: 
272. 2 
273. 1 
274. 1 
275. -1 
276. -1