spring mvc checking复选框未设置对象

时间:2016-02-16 11:19:12

标签: spring jsp spring-mvc checkbox

您好我是初级MVC并且正在尝试实现一个表单:checkboxes标签并遇到了一些问题。我用google搜索的所有例子都和Strings一起工作,我想和对象一起工作,所以我希望有人可以提供建议。

我在DTO中设置了一个对象列表,如下所示:

TestDTO

private List<Barrier> barriers;

public List<Barrier> getBarriers() {
        return barriers;
    }

    public void setBarriers(List<Barrier> barriers) {
        this.barriers = barriers;
    }

在我的控制器类中,我从数据库中获取屏障对象并将它们添加到我的DTO中,然后将其传递给jsp

        savedRecord.setBarriers(dataService.getBarriers());

        mav.addObject("testDto", savedRecord);
在我的JSP中,我使用form:checkboxes标签,如下所示:

<form:checkboxes path="barriers" items="${testDto.barriers}" element="label class='block-label'" 
                            itemLabel="barrier"/>

我也试过添加

itemValue="id"

但这不起作用

这包含在from元素

<form:form method="post" accept-charset="UTF-8" action="${action}"
        onsubmit="return checkAndSend()" id="create"
        novalidate="" modelAttribute="testDto">

所以我遇到的问题如下:

  1. 显示全部的复选框似乎都已选中。我已经在屏障对象上实现了一个hashcode和equals方法,但是当我想要它们未经检查时,它们似乎仍然被检查。
  2. Barrier.java

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((barrier == null) ? 0 : barrier.hashCode());
        result = prime * result + ((display == null) ? 0 : display.hashCode());
        result = prime * result + id;
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Barrier other = (Barrier) obj;
        if (barrier == null) {
            if (other.barrier != null)
                return false;
        } else if (!barrier.equals(other.barrier))
            return false;
        if (display == null) {
            if (other.display != null)
                return false;
        } else if (!display.equals(other.display))
            return false;
        if (id != other.id)
            return false;
        return true;
    }
    
    1. 当我点击提交时,我查看testDto我的障碍对象列表为空。如何获取表示要在testDto上设置的对象的复选框。
    2. 赞赏任何指示和建议

      由于

      更新:

      感谢指点。我跟着以下。你的建议有所帮助。

      我在控制器中创建了folloiwng

      @InitBinder
      public void initBinder(WebDataBinder binder)
      {
          binder.registerCustomEditor(Barrier.class, new BarrierPropertyEditor(barrierService));
      }
      

      然后添加了一个类进行转换

      public class BarrierPropertyEditor extends PropertyEditorSupport {
      
          private BarrierService barrierService;
      
          public BarrierPropertyEditor(BarrierService barrierService) {
              this.barrierService = barrierService;
          }
      
          @Override
          public void setAsText(String text) {
              Barrier b = barrierService.findById(Integer.valueOf(text));
              setValue(b);
          }
      
      }
      

      这会在我的DTO上设置屏障对象。

      (对不起盖帽)它没有解释为什么在最初的负载下检查复选框。

      如何在初始加载时取消选中复选框?

1 个答案:

答案 0 :(得分:0)

您可以在Controller中使用@ModelAttribute来提供复选框中的值列表。

@ModelAttribute("barrierList")
public List<Barrier> populateBarrierList() {
    List<Barrier> barrierList = dataService.getBarriers();
    for(Barrier barrier: barrierList )
    {
        barrierList.add(barrier);
    }       
    return barrierList ;
}

在JSP中,使用以下命令:

<form:checkboxes path="barriers" items="${barrierList}" element="label class='block-label'"  itemLabel="barrier"/>