0

私は次のコードを使用しています:

@RequestMapping(value="/myUrl", method=RequestMethod.GET)
public ModelAndView myRequestHandler(
    HttpServletRequest request, HttpServletResponse response,
    @ModelAttribute(value="paramName") @ValidMyModelForm form)
// automatically populates form setters from form:form in JSP view
{
}

次のリンクで回答を読んで、ここで ModelAttribute の使用法が正しくないことを疑い始めています。

Spring MVC の @ModelAttribute とは?

私はそれを正しい方法で使用していますか?それはうまくいくようですが、私が何も悪いことをしていないことを確認したいです。

フォーム オブジェクトは、次のようなコードを使用して別のメソッドでモデルに追加されます。

 modelAndView.addObject("formName", new MyModelForm());

JSP ビューでは、フォーム名が として追加されていcommandName="formName"ます。

4

1 に答える 1

0

この署名も完全に機能するはずです。

public ModelAndView myRequestHandler(@Valid MyModelForm form)

ここで、Spring MVC はMyModelForm、フォームから送信されたものに基づいてインスタンスが作成およびバインドされることを保証します。

さて、追加はあなたに何@ModelAttributeをもたらしますか:

最初の単純なケース:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)

で他のメソッドを持っていないと仮定すると@ModelAttribute、上記で行うことは、仮定のために存在する可能性が低い名前paramNameでモデルを探すことであり、MyModelForm のインスタンスが作成され、前と同じようにバインドされます。paramNameビューで使用できる 名前のモデルオブジェクトが利用可能になったことを1つ追加しますparamName.myformValue

つまり、本質的に:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)

次と同等です。

public ModelAndView myRequestHandler(@Valid MyModelForm form, Model model) {
    ...
    model.addAttribute("paramName", form)
}

次に、MyModelForm の一部をプリロードする @ModelAttribute でアノテーションが付けられたメソッドがある場合:

@ModelAttribute("paramName");
public MyModelForm loadModel(int id) {
   MyModelForm fromDB = loadFromDB(id);
}

さて、あなたのメソッド署名の利点:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)

DB から事前入力したモデルは、フォームで送信されたもので強化されます。

于 2013-03-21T00:58:23.083 に答える