2015-03-31 110 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); 
    } 
} 

我該如何映射它的控制器方法裏面?我想從BigItem類而不是Item調用方法print()。

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

回答

0

當你的形式返回彈簧,彈簧會不知道你是否item[1]ItemBigItem。所以它不會工作。最好的辦法是使用另一個類,說FormItem,用一個超集的所有屬性的ItemBigItemBiggerItem ...等,然後使用您的控制器來轉換FormItem到適當Item容納輸入字段或處理它們。但是,在設計Item時必須小心謹慎,以便通過輸入屬性的存在可以確定一個確定的Item

+0

但是如果我有 – Kamui 2015-04-01 12:25:35

+0

但是如果我有鑑別器呢?例如: <選擇名稱= 「項[] .TYPE」> <選項值= 「項」>物品 <選項值= 「BigItem」> BigItem <選項值= 「BiggerItem」> BiggerItem 可以彈簧自動轉換它,或者我需要自己做這個? – Kamui 2015-04-01 12:32:53

+0

你必須自己做,因爲在Spring的角度來看,'