2013-05-14 45 views
0

我有一個類層次結構,其中一個類,比如Book是更具體的項目的基類,比如ChildrensBook將不同的子類型綁定到Spring MVC控制器

我需要以JSP形式呈現這些項目,以便可以編輯它們的字段。 BookChildrensBook有很多共同之處,因此使用單個控制器和單個JSP表單似乎是合理的。實際上ChildrensBook只是一個Book帶有一個額外字段,比如ageGroup。 JSP僅在編輯ChildrensBook

編輯實例時才顯示該字段的輸入框我已經開始編寫代碼,但是當完成的表單發回MVC控制器時我遇到了問題。下面是處理表單的方法:

@RequestMapping(value="*", method = RequestMethod.POST) 
public String onSubmit(@Valid @ModelAttribute("entity") BookCommand command, BindingResult result, RedirectAttributes redirectAttributes, ModelMap model) 
{ /* code not shown */ } 

正如你所看到的,我的形式結合到BookCommand,但我需要爲兒童讀物的形式綁定到ChildrensBookCommand對象。

在這種情況下什麼是一個好的解決方案?專門爲ChildrensBook創建另一個表單/控制器會導致大量不需要的重複代碼。 使用ChildrensBookCommand而不是BookCommand創建另一個處理程序方法失敗,可能是因爲MVC無法確定要使用哪一個。 將兒童書形式發佈到不同的URL看起來很尷尬,因爲我使用自動設置表單動作URL的Spring <form:form ...>標籤。

感謝您的任何建議。

回答

0

您可以測試您在呈現JSP頁面時指定哪個對象並指定兩個不同的URL。控制器中會有兩種方法,但您可以調用共享的方法以避免重複的代碼。

在JSP類似

if(myobject is Book) 
    <form action="urlForBook"/> 
else 
    <form action="urlForChildrenBook"/> 

在控制器,像

@RequestMapping(value="/book", method = RequestMethod.POST) 
public String onBookSubmit(@Valid @ModelAttribute("entity") BookCommand command, BindingResult result, RedirectAttributes redirectAttributes, ModelMap model) 
{ commonMethod(); } 

@RequestMapping(value="/childrenbook", method = RequestMethod.POST) 
public String onChildrenBookSubmit(@Valid @ModelAttribute("entity") BookCommand command, BindingResult result, RedirectAttributes redirectAttributes, ModelMap model) 
{ commonMethod(); } 

private commonMethod() 
{ /* code goes here*/} 
+0

謝謝,這工作。使用Spring表單標籤,我使用了' – Alex 2013-05-14 12:02:19

+0

,就像我的情況一樣,它們在每個映射方法中都使用單獨的命令對象(BookCommand,ChildrensBookCommand),因此有必要爲每個命令指定一個驗證器。如何做到這一點解釋[這裏](http://stackoverflow.com/questions/14533488/addiing-multiple-validators-using-initbinder) – Alex 2013-05-14 14:45:04

相關問題