0

私はクラス階層を持っています.1つのクラスBookは、より具体的なアイテムの基本クラスですChildrensBook

フィールドを編集できるように、これらの項目を JSP フォームで表示する必要があります。Book共通点が非常にChildrensBook多いため、1 つのコントローラーと 1 つの JSP フォームを使用するのが妥当と思われます。実際ChildrensBookには、 に 1 つのフィールドを追加しただけです。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代わりにa を使用して別のハンドラー メソッドを作成するとBookCommand、おそらく MVC がどちらを使用するかを判断できないため、失敗します。<form:form ...>フォームのアクション URL を自動的に設定する Spring タグを使用しているため、児童書のフォームを別の URL に投稿するのは面倒に思えます。

アドバイスをありがとう。

4

1 に答える 1

0

JSP ページをレンダリングして 2 つの異なる URL を指定すると、どのオブジェクトがあるかをテストできます。コントローラーには 2 つのメソッドがありますが、コードの重複を避けるために共有されているメソッドを呼び出すことができます。

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 に答える