0

こんにちは私は@ModelAttribute なぜ使用するの目的を使用するのか疑問に思っていました

@RequestMapping(value="")
public String index(@ModelAttribute("before") Before b) {
    System.out.println(b.getBeforeString());
    return "home/index";
}

@ModelAttribute("before")
public Before before() {
    return new Before();
}

使えるとき

@RequestMapping(value="")
public String index() {
    Before b = new Before();
    System.out.println(b.getBeforeString());
    return "home/index";
}
4

1 に答える 1

3

@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

于 2013-03-05T13:42:21.810 に答える