【问题标题】:Spring Form Taglib Checkboxes and the Default ValueSpring Form Taglib 复选框和默认值
【发布时间】:2011-10-15 22:42:24
【问题描述】:

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

如果我有以下类结构。

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 文档时:

复选框标签有 3 种方法可以满足您的所有要求 复选框需要。

方法一 - 当绑定值是 java.lang.Boolean 类型时, 如果输入(复选框)被标记为“已选中” 界值为真。 value属性对应resolved setValue(Object) 值属性的值。

方法二 - 当 绑定值的类型是数组或 java.util.Collection, 如果配置了输入(复选框),则标记为“已选中” setValue(Object) 值存在于绑定的集合中。

方法 三 - 对于任何其他绑定值类型,输入(复选框)被标记 如果配置的 setValue(Object) 等于界限,则为“已检查” 价值。

我被引导相信,由于 itemValue="selected" 中的绑定值将该值绑定到布尔值,那么布尔值应该为 selected = Boolean.TRUE 的那些值添加检查语句。但是,使用 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>

值被设置为真或假,而不是正确添加选中的属性。

我做错了什么?

【问题讨论】:

    标签: spring-mvc checkbox taglib


    【解决方案1】:

    恐怕你的逻辑有点不对劲。让我们看看你的复选框标签。

    &lt;sf:checkboxes path="cbItems" items="${basic.cbItems}" itemLabel="name" itemValue="selected" delimiter="&lt;br/&gt;" /&gt;

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

    处理方法

    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";
    }
    

    JSP 表单标签

    <sf:form modelAttribute="basic">
        <sf:checkboxes path="cbItems" items="${allItems}" itemLabel="name" itemValue="name" delimiter="<br/>" />
    </sf:form>
    

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2015-09-07
      • 2015-03-24
      相关资源
      最近更新 更多