2009年7月29日 星期三

[Struts2] Collection-based UI Tags

除了之前比較簡單的 UI tags 之外,Struts2 framework 當然也會提供一些比較複雜的 tags,不然就無法符合使用者的需求了!在這裡我們將會介紹三種以 Collection 為基礎的 UI tags:1) select tag、2) radio tag 與 3) checkbox list tag。

這裡所謂的 Collection-based 就是在 Java 端的 property 是以 Collection 為主,如 List、Map 等,而這些 property 要如何在頁面上顯示,就是這裡的重點了!同樣的,在這裡我只會介紹每個 tag 特殊的 attributes,而共用的 attributes 就請參考 Simple UI Tags 的共同 attributes。

1) Select Tag
Select Tag 對於 Collection-based UI Tags 來說,應該是最常使用到的 tag!因為下拉式選單是最常見到的顯示方式,下面是最簡單的範例:
<s:select name="user.name" list="{'Silver','Brian','Mike'}" />

我們使用到 OGNL 的 List 型態,並且由 OGNL 幫我們快速建立。name attribute 就是該選單選到的值要被儲存到的目標 property,而 list 則是我們要顯示在頁面的 Collection-based 物件。以下就是 select tag 的 attributes:
















































AttributeTypeDescription
listCollection-based type, List, Map, Array or Iterator用來產生 select tag 的 option list
listKeyString根據 list attribute 中,指定 property 用來產生 option tag 的 key
listValueString根據 list attribute 中,指定 property 用來產生 option tag 的 value
headerKeyString類似於 listKey,產生在 Collection 之前
headerValueString類似於 listValue,產生在 Collection 之前
emptyOptionBoolean指定是否自動產生空的 option 在 header 之前
multipleBoolean是否可以多重選擇
sizeInteger指定一次顯示的筆數,會有 scroll bar 輔助多餘的 option


上述的 attributes 中,比較需要注意的是 list, listKey 與 listValue 這三個,list 是用來設定我們要顯示的 Collection-based property,在這裡要注意的是 list attribute 的型態只能接受 Collection, Array, List, Map 與 Iterator,如果型態不對就會出現錯誤!另外,listKey 則是根據 list 中所存放物件的某個 property,例如:
private List<UserBean> userList;

userList 中存放了一堆的 UserBean 物件,每個 UserBean 物件都有 name 與 age 的 property,那我們的 select tag 撰寫成:
<s:select list="userList" listKey="age" listValue="name" />

就是指定每一個 select 之下的 option 都會以 UserBean 物件中的 age 作為 key (也就是作為 option tag 中的 value attribute),而 name property 則為 option 顯示的內容。也就會變成如下:
<select>

<option value="10">Silver</option>
<option value="24">Su</option>
<option value="50">Jason</option>

</select>

從上面的結果我們也可以知道,我們的 userList 中存有三個 UserBean 物件。

而比較特別的是 headerKey 與 headerValue 這兩個 attributes,就目前為止我也搞不清楚這兩個 attributes 有什麼特別的用處,如果我們指定的 list 物件中需要增加一項資料,但我們不想動到 list 物件,那我們可以使用 headerKey 與 headerValue 來增加一項 option。而 emptyOption attribute 則是指定我們是否需要 Struts2 framework 幫我們自動產生一個空白的 option。size attribute 則是用來指定一次顯示的數量,如果我們不指定就會是一次顯示一項,這樣會比較像是下拉式選單,如果顯示數量大於 1 又小於 list 的總數量,則會多了上下的 scroll bar 幫助我們選擇。

這幾個 attribute 中比較有趣的是 multiple,以往的下拉式選單都是多選一,如果我們指定 multiply="true",選單就可以呈現多選,在不指定 size attribute 之下,多選的選單就會將整個 list 展開。如果我們採用多選的選單,選單送出的 property (也就是 name attribute 所只到的 property) 必須是一個 Collection-based property,這點應該很直觀,既然可以多選,就表示我們需要用 Collection-based 物件來接收,否則就失去多選的意義了!

2) Radio Tag
使用 radio tag 就如同使用 select tag 一樣,只是少了許多 attributes 可以使用罷了:























AttributeTypeDescription
listCollection-based type, List, Map, Array or Iterator用來產生 select tag 的 option list
listKeyString根據 list attribute 中,指定 property 用來產生 radio 的 key
listValueString根據 list attribute 中,指定 property 用來產生 radio 的 value


由於使用的方式大同小異,所以我就不舉例了!而要注意的是,radio tag 一定是單選,所以 name attribute 指到的 property 可以是 primitive type 或 Collection-based type。

3) Checkbox List Tag
使用 checkboxlist tag 跟 select 也是類似,只是要注意的是,不要將 checkbox 與 checkboxlist 搞混了!checkbox 是單選,checkboxlist 是多選!而 checkboxlist 提供的 attributes 有:























AttributeTypeDescription
listCollection-based type, List, Map, Array or Iterator用來產生 select tag 的 option list
listKeyString根據 list attribute 中,指定 property 用來產生 checkbox 的 key
listValueString根據 list attribute 中,指定 property 用來產生 checkbox 的 value


不過在這裡要注意的是,因為 checkboxlist 一定是多選,所以 name attribute 指到的 property 一定是要 Collection-based type。

最後我想探討的是如何將 list 的選項初始化,由於 name attribute 是指定該元件在表單送出後的目的地,如果我們要讓某個 select tag 中的 option 被預先選起來,我們就要在相對應的 property 事先給予值,例如我們有一個 select tag 如下:
<s:select name="myFavorite" list="favoriteList"
listKey="key" listValue="value" />
這個 select tag 的目的地是 myFavorite property,如果我們希望 list 中某個 option 先被選起來,我們就將 favoriteList 物件中的該項目的 key 填入 myFavorite property,這樣 Struts2 framework 就會幫我們選起該 option 了!總之記得,資料怎麼來就怎麼去!

沒有留言: