我有一个类层次结构,其中一个类,比如Book
是更具体项目的基类,比如ChildrensBook
。
我需要在JSP表单中显示这些项目,以便可以编辑它们的字段。 Book
和ChildrensBook
有很多共同之处,我使用单个控制器和单个JSP表单似乎是合理的。实际上,ChildrensBook
只是一个Book
,只有一个字段,例如ageGroup
。仅在编辑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似乎很尴尬,因为我使用的是Spring <form:form ...>
标记,它会自动设置表单操作URL。
感谢您的任何建议。
答案 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*/}