Spring表单 - 扩展类的映射列表

时间:2015-03-31 16:54:36

标签: java html spring

我的表单包含多个项目:

<form>
    <input name="items[0].title">
    <input name="items[1].title">
    <input name="items[2].title">
</form>

和班级:

class Form
{
    private List<Item> items;

    public List<Item> getItems()
    {
        return items;
    }
    public void setItems(List<Item> items)
    {
        this.items = items;
    }
}

class Item
{
    private String title;

    public String getTitle()
    {
        return title;
    }
    public void setTitle(String title)
    {
        this.title= title;
    }

    public String print()
    {
        System.out.println("title: " + title);
    }
}

它工作正常。我可以这样使用它:

@RequestMapping(value="/add", method=RequestMethod.POST)
    public ModelAndView addSubmit(Form form)
{
    form.getItems().get(1).print();

    ...
}

我想要做的是添加新类型的项目。例如,具有额外字段大小的BigItem:

class BigItem
{
    private String title;
    private String size;

    public String getTitle()
    {
        return title;
    }
    public void setTitle(String title)
    {
        this.title= title;
    }
    public String getSize()
    {
        return size;
    }
    public void setSize(String size)
    {
        this.size= size;
    }

    public String print()
    {
        System.out.println("title: " + title);
        System.out.println("size: " + size);
    }
}

这只是一个原型和简化的代码。我希望将来有新的非常复杂的项目类型,需要为此做好准备。我的想法是使用公共字段和方法创建类Item,并在需要新项类型(例如BigItem)时随时扩展它。但我不知道如何映射它。我们假设我的表单如下:

<form>
    <input name="items[0].title">
    <input name="items[1].title">
    <input name="items[1].size">
    <input name="items[2].title">
</form>

和类BigItem扩展Item:

class BigItem extends Item
{
    private String size;

    public String getSize()
    {
        return size;
    }
    public void setSize(String size)
    {
        this.size= size;
    }

    public String print()
    {
        System.out.println("title: " + title);
        System.out.println("size: " + size);
    }
}

如何在控制器方法中映射它?我想从BigItem类调用方法print()而不是Item。

form.getItems().get(1).print();

1 个答案:

答案 0 :(得分:0)

当您的表单返回Spring时,Spring将不知道您的item[1]Item还是BigItem。所以它不会起作用。你最好的选择是使用另一个类,比如FormItem,使用ItemBigItemBiggerItem等所有属性的超级集合。然后使用你的控制器将FormItem转换为适当的Item以容纳输入字段或处理它们。但是,在设计Item时必须小心谨慎,以便通过输入属性的存在来识别明确的Item