Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring Form Taglib复选框和默认值_Spring Mvc_Checkbox_Taglib - Fatal编程技术网

Spring mvc Spring Form Taglib复选框和默认值

Spring mvc Spring Form Taglib复选框和默认值,spring-mvc,checkbox,taglib,Spring Mvc,Checkbox,Taglib,我试图根据我拥有的数据列表显示复选框列表。我已经设法做到了这一点,但是,我似乎无法设置所需项目的检查值 如果我有下面的类结构 public class Basic { private String name; private List<CBItem> cbItems; public String getName() { return name; } public void setName(String name) {

我试图根据我拥有的数据列表显示复选框列表。我已经设法做到了这一点,但是,我似乎无法设置所需项目的检查值

如果我有下面的类结构

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;
    }
}
公共类基础{
私有字符串名称;
私人物品清单;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共列表getCbItems(){
归还物品;
}
公共无效setCbItems(列出cbItems){
this.cbItems=cbItems;
}
}
公共类项目{
私有字符串名称;
选择私有布尔值;
公共CBItem(字符串名称,已选择布尔值){
this.name=名称;
this.selected=selected;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共布尔getSelected(){
返回选中的;
}
已选择公共无效设置(已选择布尔值){
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";
}
publicsstringhandledemo(模型){
基本=新的基本();
basic.setName(“基本数据结构”);
List cbItems=new ArrayList();
cbItems.add(新的CBItem(“First”,true));
cbItems.add(新的CBItem(“第二个”,false));
cbItems.add(新的CBItem(“第三个”,false));
添加(新的CBItem(“第四个”,真));
基本。设置cbItems(cbItems);
model.addAttribute(“基本”,基本);
返回“演示”;
}
并使用以下语句将其显示在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文档中的复选框标记时:

复选框标记有3种方法,它们应该满足您的所有需求 复选框需要

方法一-当绑定值的类型为java.lang.Boolean时, 如果 绑定值为true。value属性对应于已解析的 setValue(对象)值属性的值

方法二——当 绑定值的类型为array或java.util.Collection 如果已配置输入,则输入(复选框)标记为“已选中” 绑定集合中存在setValue(对象)值

接近 三-对于任何其他绑定值类型,将标记输入(复选框) 如果配置的设置值(对象)等于绑定值,则为“已选中” 价值观

我相信,由于itemValue=“selected”中的绑定值将值绑定到布尔值,那么布尔值应该为那些selected=Boolean.TRUE的值添加checked语句。然而,使用Spring3.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,而不是正确添加选中的属性


我做错了什么?

恐怕你的逻辑有点错误。让我们看看你的复选框标签

它绑定到
basic.cbItems
,这很好。但是作为
属性,您提供了完全相同的列表。由于两者相等,因此无论您提供什么
itemValue
,都将选中所有复选框。相反,您应该为
提供一个包含所有可能值的集合。您还应该为
CBItem
类重写
hashCode()
equals()
,以便测试实例是否相等。执行此操作后,您的代码将如下所示:

处理程序方法
公共字符串演示(ModelMap模型){
基本=新的基本();
basic.setName(“基本数据结构”);
List allItems=new ArrayList();
添加(新的CBItem(“第一个”,真));
添加(新的CBItem(“第二个”,假));
添加(新的CBItem(“第三个”,假));
添加(新的CBItem(“第四个”,正确));
model.addAttribute(“allItems”,allItems);
List cbItems=new ArrayList();
cbItems.add(新的CBItem(“First”,true));
添加(新的CBItem(“第三个”,真));
基本。设置cbItems(cbItems);
model.addAttribute(“基本”,基本);
返回“演示”;
}
JSP表单标记

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>