【问题标题】:Spring form - mapping list of extended classesSpring表单——扩展类的映射列表
【发布时间】:2015-04-01 17:29:54
【问题描述】:

我的表单包含多个项目:

<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 扩展项:

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 类而不是 Item 中调用 print() 方法。

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

【问题讨论】:

    标签: java html spring


    【解决方案1】:

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

    【讨论】:

    • 但是如果我有鉴别器呢?例如: 可以spring 自动转换还是我需要自己做?
    • 你必须自己做,因为从 Spring 的角度来看,&lt;select name="items[&lt;index&gt;].type"&gt; 只是另一个输入字段。此外,您的Item 中还需要一个type 属性,否则Spring 在调用Item.getType() 时会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2019-07-26
    • 2011-11-28
    相关资源
    最近更新 更多