Spring MVC复选框绑定到对象列表

时间:2015-10-21 19:37:04

标签: spring-mvc checkbox spring-boot velocity

我有一个包含其他实体列表的实体。应通过选中复选框填写列表。 选中复选框并提交表单时,列表将正确填写。但是,再次打开页面时,不会预先分配复选框。

为了创建复选框,我使用的是一个ID,其中ID为键,String为值(对于标签)。

如果那很重要:我正在使用Spring boot 1.2.6进行配置。

这是一个小例子:

实体类:

@Entity
public class Pizza {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany
    private List<Topping> toppings;

    private String name;

    // getters and setters
}

页面的Controller方法:

@RequestMapping(value = "/edit/{pizzaid}", method = RequestMethod.GET)
    public ModelAndView editPizza(ModelAndView mav, @PathVariable long pizzaid) {
        mav.setViewName("pizza_edit");
        mav.addObject("toppings", getToppingMap());
        Pizza pizza = pizzaRepo.findOne(pizzaid);
        mav.addObject("pizza", pizza);
        return mav;
    }

private Map<Long,String> getToppingMap(){
    Map<Long, String> result = new LinkedHashMap<>();
    for (Topping topping : toppingRepo.findAll()) {
        result.put(topping.getId(), topping.getName());
    }
    return result;
}
模板中的

(力度)我正在使用spring提供的宏:

#springFormCheckboxes("pizza.toppings" $toppings "<br/>" "")

将表单发布回服务器时,将调用以下方法:

@RequestMapping(value = "/edit/{pizzaid}", method = RequestMethod.POST)
    public ModelAndView savePizza(ModelAndView mav, @Valid Pizza pizza, BindingResult bindingResult, @PathVariable long pizzaid) {
        pizza.setId(pizzaid);
        pizzaRepo.save(pizza);
        mav.setViewName("pizza_edit");
        mav.addObject("toppings", getToppingMap());
        mav.addObject("pizza", pizza);
        return mav;
    }

在这里,List与所选ID对应的Topping-entities完全填充。

现在,在生成的页面中,未选中任何复选框。似乎从ID到实体(请求到实体)的转换是自动完成的,但另一个方向(实体到html)不起作用?

我尝试在披萨上添加一个方法,该方法返回复选框预分配的ID:

public List<Long> getToppingIds() {
    List<Long> res = new ArrayList<>();
    if (toppings != null){
        for (Topping t : toppings) {
            res.add(t.getId());
        }
    }
    return res;
}

然后将此调用为宏

#springFormCheckboxes("pizza.toppingIds" $toppings "<br/>" "")  

现在选中复选框,这很好。但输入名称更改为toppingIds,因此在提交表单后,List未填充。

使用反映对象列表的复选框的正确方法是什么? (我发现大多数例子只使用字符串)

0 个答案:

没有答案