1.5 Checkboxes標籤
相對於一個checkbox標籤只能生成一個對應的複選框而言,一個checkboxes標籤將根據其綁定的數據生成N個複選框。checkboxes綁定的數據可以是數組、集合和Map。在使用checkboxes時我們有兩個屬性是必須指定的,一個是path,另一個是items。Items表示當前要用來展現的項有哪些,而path所綁定的表單對象的屬性表示當前表單對象擁有的項,即在items所展現的所有項中表單對象擁有的項會被設定爲選中狀態。先來看以下一段代碼:
- <form:form action="formTag/form.do" method="post" commandName="user">
- <table>
- <tr>
- <td>Roles:</td>
- <td>
- <form:checkboxes path="roles" items="${roleList}"/>
- </td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
<form:form action="formTag/form.do" method="post" commandName="user">
<table>
<tr>
<td>Roles:</td>
<td>
<form:checkboxes path="roles" items="${roleList}"/>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
上面的JSP視圖對應着如下的處理器方法:
- @RequestMapping(value="form", method=RequestMethod.GET)
- public String formTag(Map<String, Object> map) {
- User user = new User();
- List<String> roles = new ArrayList<String>();
- roles.add("role1");
- roles.add("role3");
- user.setRoles(roles);
- List<String> roleList = new ArrayList<String>();
- roleList.add("role1");
- roleList.add("role2");
- roleList.add("role3");
- map.put("user", user);
- map.put("roleList", roleList);
- return"formTag/form";
- }
@RequestMapping(value="form", method=RequestMethod.GET)
public String formTag(Map<String, Object> map) {
User user = new User();
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role3");
user.setRoles(roles);
List<String> roleList = new ArrayList<String>();
roleList.add("role1");
roleList.add("role2");
roleList.add("role3");
map.put("user", user);
map.put("roleList", roleList);
return "formTag/form";
}
從以上代碼中我們可以看到我們放在ModelMap中的roleList對象有三個元素,分別是role1、role2和role3,而我們的表單對象User的roles屬性只擁有兩個元素,分別是role1和role3,,所以當我們訪問該處理器方法返回如上所示的視圖頁面時,我們要展現的複選框項是roleList,也就是role1、role2和role3,而我們表單對象只擁有role1和role3,所以在頁面進行渲染的時候會展示3個複選框項,但只有role1和role3會被設定爲選中狀態。
上面介紹的這種情況是使用List作爲展現複選框項的數據源,這種情況我們已經看到了它所呈現出來的標籤Label和它的值是一樣的。使用Array和Set作爲數據源也是這種情況。那麼如果要讓checkboxes呈現出來的Label和實際上送的value不同的話應該怎麼做呢?這個時候我們就可以使用Map作爲數據源了。使用Map作爲checkboxes的items屬性的數據源時Key將作爲真正的複選框的value,而Map的value將作爲Label進行展示。當使用Map作爲checkboxes的items屬性的數據源時我們綁定的表單對象屬性的類型可以是Array、集合和Map,這種情況就是判斷items Map中是否含有對應的key來決定當前的複選框是否處於選中狀態。我們來看以下一個處理器方法以及其對應的視圖代碼。
處理器方法:
- @RequestMapping(value="form", method=RequestMethod.GET)
- public String formTag(Map<String, Object> map) {
- User user = new User();
- List<String> roles = new ArrayList<String>();
- roles.add("role1");
- roles.add("role3");
- user.setRoles(roles);
- Map<String, String> roleMap = new HashMap<String, String>();
- roleMap.put("role1", "角色1");
- roleMap.put("role2", "角色2");
- roleMap.put("role3", "角色3");
- map.put("user", user);
- map.put("roleMap", roleMap);
- return"formTag/form";
- }
@RequestMapping(value="form", method=RequestMethod.GET)
public String formTag(Map<String, Object> map) {
User user = new User();
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role3");
user.setRoles(roles);
Map<String, String> roleMap = new HashMap<String, String>();
roleMap.put("role1", "角色1");
roleMap.put("role2", "角色2");
roleMap.put("role3", "角色3");
map.put("user", user);
map.put("roleMap", roleMap);
return "formTag/form";
}
對應的視圖代碼:
- <form:form action="formTag/form.do" method="post" commandName="user">
- <table>
- <tr>
- <td>Roles:</td>
- <td>
- <form:checkboxes path="roles" items="${roleMap}"/>
- </td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
<form:form action="formTag/form.do" method="post" commandName="user">
<table>
<tr>
<td>Roles:</td>
<td>
<form:checkboxes path="roles" items="${roleMap}"/>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
這個時候我們知道會呈現出3個複選框,而checkboxes綁定的表單對象user的roles屬性是一個集合對象,其包含的兩個元素都能在checkboxes的items數據源中找到對應的Key,所以以這兩個元素爲value的checkbox將處於選中狀態。效果如下:
當我們使用Array或者集合作爲數據源,且裏面的元素都是一個一個POJO時,我們還可以使用checkboxes標籤的itemLabel和itemValue屬性來表示使用數組或者集合中元素對象的哪一個屬性作爲需要呈現的單選框的label和value。