2011-01-15 8 views
6

春3参照たちを教える:メソッド引数レベルで@ModelAttributeアノテーションの意味は?

あなたはメソッド パラメータにそれを配置すると、@ModelAttributeが特定、 注釈付きメソッドのパラメータ

に モデル属性をマッピングし、私はこのことを理解していません私は確かにモデルのオブジェクトのエイリアス(戻り値の型としてModelMapを使用している場合はキー値)が要求ハンドラメソッドの実行後にビューに渡されたことを確認しています。したがって、要求ハンドラメソッドが実行されると、モデルオブジェクトの名前をメソッドパラメータにマップすることはできません。

この矛盾を解決するために、私はstackoverflowに行き、this詳細な例を見つけました。 例の著者は言った:「personAttribute」モデルは、それが思わ JSP

からコントローラに渡され た

//、彼は春の参照に魅了され...

私は彼のサンプルアプリケーションを自分の環境に配備し、メソッドMainController.saveEdit()から@ModelAttributeアノテーションを厳しくカットしました。結果として、アプリケーションは変更なしで動作します。だから結論:@ModelAttribute注釈は、Webフォームのフィールド値を引数のフィールドに渡す必要はありません。次に、私は質問に固執しました:@ModelAttribute注釈の平均は何ですか? View内のモデルオブジェクトのエイリアスを設定することが唯一の手段である場合は、ModelMapにオブジェクトを明示的に追加するよりも、なぜこの方法が優れていますか?引数が注釈されていない場合は、そのタイプ(すなわち、それはHttpServletRequestModelMapなどはありません)、それは@ModelAttribute -annotated引数のように扱われています特別な意味を持ちません -

答えて

8

ポイントは@ModelAttributeがオプションであることです。

ので、@ModelAttributeを効果的に2つの場合に必要とされている:属性の名前を指定するには

  • @ModelAttributeが省略されているか、または空白のvalueがある場合は、デフォルトの名前が使用されます(最初の文字が大文字になった引数の型名)。

  • 引数の型が特別な意味を持つ場合。たとえば、ドメインオブジェクトが属性として渡された場合、java.security.Principalに注釈を付ける必要があります。そうでない場合は、代わりにHttpServletRequest.getUserPrincipal()の結果が渡されます。

実際には、引数の意味を文書化するために、@ModelAttributeを使用する傾向があります。

関連する問題