1. 程式人生 > >FreeMaker中遍歷List的用法

FreeMaker中遍歷List的用法

Freemarker中如何遍歷List摘要:在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.ftl

Java程式碼
1.public class User {   
2.    private String userName;   
3.    private String userPassword;   
4.    private Integer age;   
5.       
6.       
7.    public String getUserName() {   
8.        return userName;   
9.    }   
10.  
11.    public void setUserName(String userName) {   
12.        this.userName = userName;   
13.    }   
14.  
15.    public String getUserPassword() {   
16.        return userPassword;   
17.    }   
18.  
19.    public void setUserPassword(String userPassword) {   
20.        this.userPassword = userPassword;   
21.    }   
22.  
23.    public Integer getAge() {   
24.        return age;   
25.    }   
26.  
27.    public void setAge(Integer age) {   
28.        this.age = age;   
29.    }   
30.       
31.}  

1.<#--Freemarker遍歷list-->   
2.簡單遍歷list:   
3.<#list userList as user>   
4.    使用者名稱:${user.userName}   
5.    密  碼:${user.userPassword}   
6.    年  齡: ${user.age}   
7.</#list>   
8.  
9.  
10.<#--Freemarker遍歷list並應用list隱含變數item_index-->   
11.item_index使用:   
12.<#list userList as user>   
13.第${user_index+1}個使用者    <#--item_index:當前迭代項在所有迭代項中的位置,是數字值-->   
14.    使用者名稱:${user.userName}   
15.    密  碼:${user.userPassword}   
16.    年  齡: ${user.age}   
17.</#list>   
18.<#--Freemarker遍歷list並應用list隱含變數item_has_next-->   
19.item_has_next,size使用:   
20.<#list userList as user>   
21.    使用者名稱:${user.userName}   
22.    密  碼:${user.userPassword}   
23.    年  齡: ${user.age}   
24.    <#if !user_has_next>  <#--item_has_next:用於判斷當前迭代項是否是所有迭代項中的最後一項 -->   
25.    共有${userList?size}使用者,最後一個使用者是:${user.userName}   
26.    </#if>   
27.</#list>   
28.<#--Freemarker遍歷list並按使用者年齡升序排序-->   
29.  
30.按使用者年齡升序排序:   
31.<#list userList?sort_by("age") as user>   
32.  
33.    使用者名稱:${user.userName}   
34.    密  碼:${user.userPassword}   
35.    年  齡: ${user.age}   
36.       
37.</#list>   
38.<#--Freemarker遍歷list並按使用者年齡降序排序-->   
39.  
40.按使用者年齡降序排序:   
41.<#list userList?sort_by("age")?reverse as user>   
42.  
43.    使用者名稱:${user.userName}   
44.    密  碼:${user.userPassword}   
45.    年  齡: ${user.age}   
46.       
47.</#list>   
48.<#--Freemarker遍歷list當用戶年齡大於21歲時,停止輸出-->   
49.list中應用break:   
50.<#list userList?sort_by("age")?reverse as user>   
51.  
52.    使用者名稱:${user.userName}   
53.    密  碼:${user.userPassword}   
54.    年  齡: ${user.age}   
55.    <#if (user.age>21) >   
56.        <#break>   
57.    </#if>   
58.</#list>  

FreemarkerUtil
1.public class FreeMarkerUtil {   
2.        public static void analysisTemplate(String templateName,String templateEncoding,Map<?,?> root){   
3.        try {   
4.            Configuration config=new Configuration();   
5.            File file=new File("src/templates");   
6.            //設定要解析的模板所在的目錄,並載入模板檔案   
7.            config.setDirectoryForTemplateLoading(file);   
8.            //設定包裝器,並將物件包裝為資料模型   
9.            config.setObjectWrapper(new DefaultObjectWrapper());   
10.               
11.            //獲取模板,並設定編碼方式,這個編碼必須要與頁面中的編碼格式一致   
12.            Template template=config.getTemplate(templateName,templateEncoding);   
13.            //合併資料模型與模板   
14.            Writer out = new OutputStreamWriter(System.out);   
15.            template.process(root, out);   
16.            out.flush();   
17.            out.close();   
18.        } catch (IOException e) {   
19.            e.printStackTrace();   
20.        }catch (TemplateException e) {   
21.            e.printStackTrace();   
22.        }   
23.           
24.    }    
25.}  
public class FreeMarkerUtil {
	 	public static void analysisTemplate(String templateName,String templateEncoding,Map<?,?> root){
		try {
			Configuration config=new Configuration();
			File file=new File("src/templates");
			//設定要解析的模板所在的目錄,並載入模板檔案
			config.setDirectoryForTemplateLoading(file);
			//設定包裝器,並將物件包裝為資料模型
			config.setObjectWrapper(new DefaultObjectWrapper());
			
			//獲取模板,並設定編碼方式,這個編碼必須要與頁面中的編碼格式一致
			Template template=config.getTemplate(templateName,templateEncoding);
			//合併資料模型與模板
			Writer out = new OutputStreamWriter(System.out);
		    template.process(root, out);
		    out.flush();
		    out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}catch (TemplateException e) {
			e.printStackTrace();
		}
		
	} 
}