Флажки Spring Form Taglib и значение по умолчанию - PullRequest
3 голосов
/ 29 июля 2011

Я пытаюсь отобразить список флажков на основе списка данных, которые у меня есть. Мне удалось это сделать, однако я не могу установить проверенные значения для необходимых элементов.

Если у меня следующая структура класса.

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 для тега флажка:

Существует три подхода к метке флажка, которые должны соответствовать всем вашим флажок нужен.

Первый подход - Когда связанное значение имеет тип java.lang.Boolean, вход (флажок) помечается как «отмеченный», если Связанное значение верно. Атрибут значения соответствует разрешенному значение свойства значения 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>

Где значение устанавливается в true или false вместо правильного добавления отмеченного атрибута.

Что я делаю не так?

1 Ответ

0 голосов
/ 07 апреля 2014

Боюсь, ваша логика немного нарушена. Давайте посмотрим на ваш флажок.

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

тег формы JSP

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