这样会遇到一个问题,当数据超过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