У меня есть форма, которая содержит несколько элементов:Яровая форма - список отображения расширенных классов
<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();
Но что делать, если у меня есть – Kamui
Но что делать, если у меня есть дискриминатор? Например: <выберите имя = "пунктов [] .Type"> <параметр значение = "Пункт"> Пункт <параметр значение = "BigItem"> BigItem <параметр значение = "BiggerItem"> BiggerItem Может ли весна автоматически конвертировать его или мне нужно сделать это самостоятельно? –
Kamui
Вы должны сделать это сами, потому что в перспективе Spring элементы '