2016-11-28 8 views
1

私がSpringでform:formオブジェクトを使用している場合、Springがクラス変数の値を注入できるようにcommandNameを使用できます。Springはフォームの値をクラス変数にどのようにバインドするのですか?

しかし、コントローラーがこの値をどのようにキャッチしているのでしょうか?

@RequestMapping(method = RequestMethod.POST, value = "/form") 
public String postForm(@ModelAttribute("item") Item item, ModelMap model) 
{ 
    return "result"; 
} 

上記のコードでは、Itemが注入されています。しかし、この変数の名前を変更(またはモデル属性を削除)しても、この変数にフォーム値が挿入されることには影響しません。

春は、見つかった最初のモデルクラスの値をフォームから挿入しますか? SpringはフォームをItem itemパラメータに注入する必要があることをどのように知っていますか?

最初は、コントローラの変数(POST)にはフォームのcommandNameという名前を付けるべきだと思っていましたが、それ以外の名前でも不思議には機能しません。

答えて

1

the usage of @ModelAttribute on method argumentsを説明する専用のセクションが春のドキュメントにあります。

このプロセスは、データを提出するにバインドし、いくつかの規則に従っているとして知られています:

  1. @ModelAttribute場合は、明示的に引数(お使いの場合)の名前で宣言されています。この場合、フォームの送信データは自動的にこの名前でコピーされます。あなたはmodel.get("item")を呼び出して/検査して、あなたのModelMapモデルにすでに存在していることを自分で確認できます。
  2. まったく@ModelAttribute引数注釈がない場合は、属性名が仮定されfrom the typeは、基本的にあなたのケースでタイプItemは、名前item(キャメルケースの表記)を属性に変換し、フォームデータバインドして新しいアイテムを保持するために作成されていますフィールド。それがModelMap(上記と同じチェック:model.get(「アイテム」))にもあり実現する

キーポイントは、データバインディングがあなたのポストフォームRequestMappingを打つ前を発生し、これらすべての例です。

関連する問題