将不同的子类型绑定到Spring MVC控制器

时间:2013-05-14 09:36:52

标签: spring-mvc

我有一个类层次结构,其中一个类,比如Book是更具体项目的基类,比如ChildrensBook

我需要在JSP表单中显示这些项目,以便可以编辑它们的字段。 BookChildrensBook有很多共同之处,我使用单个控制器和单个JSP表单似乎是合理的。实际上,ChildrensBook只是一个Book,只有一个字段,例如ageGroup。仅在编辑ChildrensBook

的实例时,JSP才会显示此字段的输入框

我已经开始编写代码但是当完成的表单发回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似乎很尴尬,因为我使用的是Spring <form:form ...>标记,它会自动设置表单操作URL。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

您可以在呈现JSP页面时测试您拥有的对象,并指定两个不同的URL。您的控制器中将有两种方法,但您可以调用共享的方法以避免重复的代码。

在JSP中类似

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

在Controller中,类似

@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*/}