2013-05-14 75 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