简介:这个用于java 使用word模板编写word文档,即往里面填充数据,word-->XML--> FTL格式;需要用到freemarker 2.3.18。
在Freemarker应用中经常会遍历List获取需要的数据,并对需要的数据进行排序加工后呈现给用户。那么在Freemarker中如何遍历List,并对List中数据进行适当的排序呢?
通过下文的介绍,相信您一定会找到答案。一、 Freemarker中list指令简单介绍
要想在Freemarker中遍历list,必须通过使用list指令,即<#list sequence as item>…</#list>
sequence是集合(collection)的表达式,item是循环变量的名字,不能是表达式。
当在遍历sequence时,会将遍历变量的值保存到item中。
举个例子说明吧:
<#list userList as user>
…
</#list>
userList中封装了很多个User对象,我们在遍历userList时候,会将遍历的User对象的值,保存到上述的user变量中。那么在取值时,我们可以通过${user.userName }来获取User对象的userName属性值。
List指令还隐含了两个循环变量:
item_index:当前迭代项在所有迭代项中的位置,是数字值。
item_has_next:用于判断当前迭代项是否是所有迭代项中的最后一项。
注意:在使用上述两个循环变量时,一定要将item换成你自己定义的循环变量名,item其实就是前缀罢了。
例如,如果你使用<# list list as l>..</#list>定义,那么就要使用l_index,l_has_next。
在循环过程中,如果您想跳出循环,那么可以使用结合break指令,即<#break>来完成。
二、 Freemarker中对List进行排序
通常我们的排序操作都是通过DAO层来实现的,如果我们想随时更改我们的排序,那么就必须修改我们的DAO层代码,确实不方便。但Freemarker为我们提供了这样的排序方法,解决了这个问题。
1. sort升序排序函数
sort对序列(sequence)进行排序,要求序列中的变量必须是:字符串(按首字母排序),数字,日期值。
<#list list?sort as l>…</#list>
2. sort_by函数
sort_by有一个参数,该参数用于指定想要排序的子变量,排序是按照变量对应的值进行排序,如:
<#list userList?sort_by(“age”) as user>…</#list>
age是User对象的属性,排序是按age的值进行的。
3. reverse降序排序函数
<#list list? reverse as l>…</#list>。reverse使用同sort相同。reverse还可以同sort_by一起使用
如:想让用户按年龄降序排序,那么可以这个样写<#list userList?sort_by(“age”)?reverse as user>…</#list>
三、 Freemarker如何遍历List实例应用
创通过上面的介绍,相信您已经对Freemarker如何遍历List有了了解,那么我们就废话少说,开始做一个应用吧。
User类
public class User{
private String username;
private
(省略set和get方法)
}
user.ftl
<#--Freemarker遍历list-->
简单遍历list:
<#list userList as user>
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
</#list>
<#--Freemarker遍历list并应用list隐含变量item_index-->
item_index使用:
<#list userList as user>
第${user_index+1}个用户
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
</#list>
<#--Freemarker遍历list并应用list隐含变量item_has_next-->
item_has_next,size使用:
<#list userList as user>
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
<#if !user_has_next>
共有${userList?size}最后一个用户是:${user.userName}
</#if>
</#list>
<#--Freemarker遍历list并按用户年龄升序排序-->
按用户年龄升序排序:
<#list userList?sort_by("age") as user>
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
</#list>
<#--Freemarker遍历list并按用户年龄降序排序-->
按用户年龄降序排序:
<#list userList?sort_by("age")?reverse as user>
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
</#list>
<#--Freemarker遍历list当用户年龄大于21岁时,停止输出-->
list中应用break:
<#list userList?sort_by("age")?reverse as user>
用户名:${user.userName}
密 码:${user.userPassword}
年 龄: ${user.age}
<#if (user.age>21) >
<#break>
</#if>
</#list>
ClientTest类
public class ClientTest{
public static List<User> initUserList(){
User user1=new User();
user1.setUserName("张三");
user1.setUserPassword("123");
user1.setAge(20);
User user2=new User();
user2.setUserName("李四");
user2.setUserPassword("123");
user2.setAge(22);
User user3=new User();
user3.setUserName("王五");
user3.setUserPassword("123");
user3.setAge(21);
List<User> list=new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
return list;
}
public static void main(String[] args){
List<User> list=ClientTest.initUserList();
Map<String,Object> root=new HashMap<String,Object>();
root.put(“userList”,list);
FreeMarkertUtil.analysisTemplate(“user.ftl”,”UTF-8”,root);
//FreeMarkUtil类可以参考我上传得源码。
}
}
==============常用语法=================
三.
EG.一个对象BOOK
1.输出 ${book.name}
空值判断:${book.name?if_exists },
${book.name?default(‘xxx’)}//默认值xxx
${ book.name!"xxx"}//默认值xxx
日期格式:${book.date?string('yyyy-MM-dd')}
数字格式:${book?string.number}--20
${book?string.currency}--<#-- $20.00 -->
${book?string.percent}—<#-- 20% -->
插入布尔值:
<#assign foo=ture />
${foo?string("yes","no")} <#-- yes -->
=============逻辑判断==================
2.
a:
<#if condition>...
<#elseif condit
inc 发布于2007-09-08 16:18:57
ion2>...
<#elseif condition3>......
<#else>...
其中空值判断可以写成<#if book.name?? >
</#if>
b:
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
===============循环读取=================
3.
<#list sequence as item>
...
</#list>
空值判断<#if bookList?size = 0></#list>
e.g.
<#list employees as e>
${e_index}. ${e.name}
</#list>
<#if mole?default(0)!=0>
=============用来压缩空白空间和空白的行===============
用例
<#assign x = " moo ">
(<#compress>
1 2 3 4 5
${moo}
test only
I said, test only
)
输出
(1 2 3 4 5
moo
test only
I said, test only)
==============Sequence内置的计数器==============
3. Sequence内置的计数器: xxx_index
用途:显示序号
模板:
<#list employees as e>
${e_index}. ${e.name}
</#list>
输出:
1. Readonly
2. Robbin
==============Sequence内置的分段器=====================
4. Sequence内置的分段器: chunk
用途:某些比较BT的排版需求
模板:
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<ul>
<li><#list row as cell>${cell} </#list></li>
</ul>
</#list>
<#list seq?chunk(4, '-') as row>
<tr>
<td><#list row as cell>${cell} </#list></td>
</tr>
</#list>
输出:
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
</ul>
<ul>
<li>e</li>
<li>f</li>
<li>g</li>
<li>h</li>
</ul>
<ul>
<li>i</li>
<li>j</li>
</ul>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
</tr>
<tr>
<td>e</td>
<td>f</td>
<td>g</td>
<td>h</td>
</tr>
<tr>
<td>i</td>
<td>j</td>
<td>-</td>
<td>-</td>
</tr>
=====================freemarker的list================================
Scalar String:${scalarString}
Scalar Number:${scalarNumber}
Object is:${scalarObject}
List使用样例-List元素为Scalar对象:
<#list scalarList as value0>
Scalar List值:${value0}
</#list>
List使用样例-List元素为User对象:
<#list userList as listUser>
List对象User Id值:${listUser.userId}
</#list>
Map使用样例-Map Values元素为Scalar :
<#list scalarMap?keys as mykey>
Scalar Map key is :${mykey}
Scalar Map value is:${scalarMap[mykey]}
</#list>
Map使用样例-Map Values元素为User对象:
<#list userMap?keys as key1>
<#assign mapUser="${userMap[key1]}" >
User Object is :${mapUser}
<#--
以下方法有问题
User is :${mapUser.userId} <br>
-->
</#list>
==============FreeMarker中list排序==============
升序:
<#list list?sort_by("time") as v>
</#list>
降序:
<#list list?sort_by("time") as v>
</#list>
===============freemarker在模板中定义变量==============
在模板中定义的变量有三种类型:
plain变量:可以在模板的任何地方访问,包括include指令插入的模板,使用assign指令创建和替换
<#include "/WEB-INF/index/top.html">
==============freemarker.properties配置================
(1)解决输出中文乱码问题:
default_encoding=UTF-8
locale=zh_CN
number_format=#
(2)提高freemarker的性能
template_update_delay=60000
(3)freemarker的标签种类:
${..}
# 代表是FTL tags
<#if ...></#if>
<#list totalList as elementObject>...</#list>
@ ,代表用户自定义的标签
<#-- --> 注释标签,注意不是<!-- -->
=====================将图片整除换行====== <#if (u_index+1)%4=0>当图片超过五个就换行=======
<table width="100%">
<tr>
<td><table width="100%">
<tr>
<#if map["最新-图片"]?exists>
<#list map["最新-图片"] as u>
<#if (u_index+1)%4=0>
<td><table width="70" height="65" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="middle" bgcolor="#6F7074">
<a target="_blank" href="shownews.page?id=${u.id?default("")}&mole=2 "><img src="${u.chartpath?default('')}" width="67" height="41" border="0" /></a></td>
</tr>
<tr>
<td align="center" bgcolor="#6F7074">
<a target="_blank" href="shownews.page?id=${u.id?default("")}&mole=2 " class="tableff">
<@jf.greet title=u.title len=4 /></a>
</td>
</tr>
</table></td></tr><tr >
<#else>
<td><table width="70" height="65" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="middle" bgcolor="#6F7074">
<a target="_blank" href="shownews.page?id=${u.id?default("")}&mole=2 "><img src="${u.chartpath?default('')}" width="67" height="41" border="0" /></a></td>
</tr>
<tr>
<td align="center" bgcolor="#6F7074">
<a target="_blank" href="shownews.page?id=${u.id?default("")}&mole=2 " class="tableff">
<@jf.greet title=u.title len=4 /></a>
</td>
</tr>
</table></td>
</#if>
</#list>
</#if>
</tr>
</table>
</td>
</tr>
</table>
</tr>
</table></td>
</#if>
</#list>
</#if>
</tr>
</table>
</td>
</tr>
</table>
===============================freemarker中在application
${Application.web_title}
在类里:
list=dser.indexvideo(cvo);
if(list.size()!=0){
map.put("最新",list);}
在html静态页里:
<#import "/WEB-INF/ftl/index.ftl" as jf>
(index.ftl
<#macro greet title len>
<#if title?length != 0>
<#if (title?length>len)>
${title[0..len-1]} <#else>
${title?trim}
</#if>
<#else>
${title?default("")}
</#if>
</#macro>
<#--时间比较-->
<#macro vstime start end>
<#if start?default("")==""||end?default("")=="">
--
<#else>
<#assign starts=start?replace("-","") >
<#assign ends=end?replace("-","") >
<#if (starts?number>ends?number)>
<font color="red">以过期</font>
<#else>
未过期
</#if>
</#if>
</#macro>
)
<#if map["最新"]?exists>
<#list map["最新"] as u>
${u.filepath?default('')}
<@jf.greet title=u.title len=6 />
</#list></#if>