0

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

我需要在 JSP 表单中显示这些项目,以便可以编辑它们的字段。Book并且ChildrensBook有很多共同点,以至于我使用单个控制器和单个 JSP 表单似乎是合理的。实际上ChildrensBook只是一个Book带有一个额外字段的 a,例如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 */ }

如您所见,我将表单绑定到 aBookCommand但我需要儿童书籍的表单绑定到ChildrensBookCommand对象。

在这种情况下有什么好的解决方案?专门为其创建另一个表单/控制器ChildrensBook会导致大量不受欢迎的重复代码。ChildrensBookCommand使用 a而不是创建另一个处理程序方法BookCommand失败,大概是因为 MVC 无法判断使用哪个。将儿童图书表单发布到不同的 URL 似乎很尴尬,因为我使用的是 Spring<form:form ...>标记,它会自动设置表单操作 URL。

感谢您的任何建议。

4

1 回答 1

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*/}
于 2013-05-14T11:35:42.060 回答