@ModelAttribute
ビューで後で使用するためにMVCモデルにデータを入力するために使用されます。これは、モデルに物事を配置する唯一の方法ではありません(これは、コードによって直接実行することもできます)が@RequestMapping
、特に、メソッド引数またはメソッドからの戻り値を追加する便利な方法です。
注釈が付けられたメソッドは、同じコントローラークラスで呼び出される@ModelAttribute
すべてのメソッドの前に呼び出されます。@RequestMapping
これは通常、フォームの読み取り専用コンポーネントをポップアップ表示するために使用されます。たとえば、選択リストの値などです。(http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-modelattrib-methods)-またはバインド前にBeanを準備するため着信リクエスト値(データストアからのロードなど)。
したがって、最初の例では...
@ModelAttribute("before")
public Before before() {
return new Before();
}
@RequestMapping(value="")
public String index(@ModelAttribute("before") Before b) {
System.out.println(b.getBeforeString());
return "home/index";
}
...before()
メソッドが最初に呼び出されBefore
、「before」という名前のインスタンスがモデルに配置されます。次に、index(...)
メソッドが呼び出され、まったく同じBefore
インスタンスを受け取ります(モデル属性名「before」も使用するため)。ただし、リクエストのパラメータ名がBeforeプロパティ名にマップされるリクエストからの値が入力されます。(余談ですが、これはおそらくあなたが意図していることではありません。これが本当にあなたが望むものである場合はBindingResult
、バインディングエラーをキャッチするためにインデックスメソッドに2番目の引数を追加することを検討する必要があります(http://static.springsource.org/spring/docs /3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-arguments箇条書き17))。
これに続いて、の@ModelAttribute
注釈index(...)
により、そのBefore
インスタンスは、次のビューで使用するために「before」という名前のモデルを提示します:「/ home/index」。
(注目に値する:before()
メソッドがまったくない場合、メソッドは引数なしのコンストラクターindex()
で作成されたインスタンスを受け取り、着信リクエスト値でポップアップ表示されます。その後、名前を付けてモデルに配置されます。Before
次のビューで使用するための「前」。)
2番目のコードスニペット..。
@RequestMapping(value="")
public String index() {
Before b = new Before();
System.out.println(b.getBeforeString());
return "home/index";
}
...は実際Before
にはモデルに追加されていないため、ビューでは使用できません。ここのモデルでBeforeが必要な場合は、次を使用します。
@RequestMapping(value="")
public String index(Model uiModel) {
Before b = new Before();
System.out.println(b.getBeforeString());
uiModel.addAttribute("beforeName", b); // will add to model with name "beforeName"
uiModel.addAttribute(b) // will add to model with a default name (lower-cased simple type name by convention), ie: "before"
return "home/index";
}
HTH