2015-03-31 5 views
0

У меня есть форма, которая содержит несколько элементов:Яровая форма - список отображения расширенных классов

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

Как я могу отобразить его внутри метода контроллера? Я хотел бы вызвать метод print() из класса BigItem вместо Item.

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

ответ

0

Когда ваша форма возвращается весной, весна не будет иметь ни малейшего представления ли ваш item[1] является Item или BigItem. Так что это не сработает. Лучше всего использовать другой класс, скажем FormItem, с супер-набором всех атрибутов Item, BigItem, BiggerItem ... и т. Д. Затем используйте ваш контроллер для преобразования FormItem в соответствующий Item, чтобы разместить поля ввода или обработать их. Но тогда вы должны быть осторожны при разработке своих Item s, чтобы определить Item по наличию входных атрибутов.

+0

Но что делать, если у меня есть – Kamui

+0

Но что делать, если у меня есть дискриминатор? Например: <выберите имя = "пунктов [] .Type"> <параметр значение = "Пункт"> Пункт <параметр значение = "BigItem"> BigItem <параметр значение = "BiggerItem"> BiggerItem Может ли весна автоматически конвертировать его или мне нужно сделать это самостоятельно? – Kamui

+0

Вы должны сделать это сами, потому что в перспективе Spring элементы '