我正在尝试根据我拥有的数据列表显示复选框列表。我设法做到了这一点,但是,我似乎无法设置所需项目的选中值。
如果我有以下类结构。
public class Basic {
private String name;
private List<CBItem> cbItems;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<CBItem> getCbItems() {
return cbItems;
}
public void setCbItems(List<CBItem> cbItems) {
this.cbItems = cbItems;
}
}
public class CBItem {
private String name;
private Boolean selected;
public CBItem(String name, Boolean selected) {
this.name = name;
this.selected = selected;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSelected() {
return selected;
}
public void setSelected(Boolean selected) {
this.selected = selected;
}
}
我正在我的控制器中初始化它:
public String handleDemo(Model model) {
Basic basic = new Basic();
basic.setName("Basic Data Structure");
List<CBItem> cbItems = new ArrayList<CBItem>();
cbItems.add(new CBItem("First", true));
cbItems.add(new CBItem("Second",false));
cbItems.add(new CBItem("Third", false));
cbItems.add(new CBItem("Fourth", true));
basic.setCbItems(cbItems);
model.addAttribute("basic", basic);
return "demo";
}
并使用以下语句在jsp页面上显示:
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Testing Basic Data</title>
</head>
<body>
<sf:form modelAttribute="basic">
<sf:checkboxes path="cbItems" items="${basic.cbItems}" itemLabel="name" itemValue="selected" delimiter="<br/>" />
</sf:form>
</body>
</html>
当我检查Spring文档中的checkbox标签时:
复选框标记有3种方法可以满足您的所有要求 复选框需要。
方法一 - 当绑定值的类型为java.lang.Boolean时, 如果输入(复选框)标记为“已检查” 绑定值是真的。 value属性对应于已解析的 setValue(Object)value属性的值。
方法二 - 当 bound值的类型为array或java.util.Collection ,. 如果已配置,则输入(复选框)标记为“已检查” setValue(Object)值存在于绑定的Collection中。
方法 三 - 对于任何其他绑定值类型,标记输入(复选框) 如果配置的setValue(Object)等于绑定,则为'checked' 值。
我认为,当itemValue =“selected”中的绑定值将值绑定到布尔值时,布尔值应该为selected = Boolean.TRUE的值添加checked语句。但是,使用Spring 3.0.5.RELEASE我得到以下生成的HTML
<html>
<head>
<title>Testing Basic Data</title>
</head>
<body>
<form id="basic" action="/demo" method="post">
<span>
<input id="cbItems1" name="cbItems" type="checkbox" value="true" checked="checked"/>
<label for="cbItems1">First</label>
</span>
<span>
<br/>
<input id="cbItems2" name="cbItems" type="checkbox" value="false" checked="checked"/>
<label for="cbItems2">Second</label>
</span>
<span>
<br/>
<input id="cbItems3" name="cbItems" type="checkbox" value="false" checked="checked"/>
<label for="cbItems3">Third</label>
</span>
<span>
<br/>
<input id="cbItems4" name="cbItems" type="checkbox" value="true" checked="checked"/>
<label for="cbItems4">Fourth</label>
</span>
<input type="hidden" name="_cbItems" value="on"/>
</form>
</body>
</html>
将值设置为true或false,而不是正确添加checked属性。
我做错了什么?
答案 0 :(得分:0)
你的逻辑有点过分我害怕。让我们看看你的复选框标签。
<sf:checkboxes path="cbItems" items="${basic.cbItems}" itemLabel="name" itemValue="selected" delimiter="<br/>" />
它与basic.cbItems
绑定,这很好。但是,作为items
属性,您提供完全相同的列表。由于两者都相同,因此无论您提供什么itemValue
,都会选中所有复选框。相反,您应该为items
提供包含所有可能值的集合。您还应该为hashCode()
类重写equals()
和CBItem
,以便可以测试实例是否相等。在这样做之后,您的代码看起来就像是。
public String demo(ModelMap model) {
Basic basic = new Basic();
basic.setName("Basic Data Structure");
List<CBItem> allItems = new ArrayList<CBItem>();
allItems.add(new CBItem("First", true));
allItems.add(new CBItem("Second",false));
allItems.add(new CBItem("Third", false));
allItems.add(new CBItem("Fourth", true));
model.addAttribute("allItems", allItems);
List<CBItem> cbItems = new ArrayList<>();
cbItems.add(new CBItem("First", true));
cbItems.add(new CBItem("Third", true));
basic.setCbItems(cbItems);
model.addAttribute("basic", basic);
return "demo";
}
<sf:form modelAttribute="basic">
<sf:checkboxes path="cbItems" items="${allItems}" itemLabel="name" itemValue="name" delimiter="<br/>" />
</sf:form>