@ModelAttribute注記の使用

3895 ワード

詳細
 
@ModelAttributeの最も主要な役割は、モデルオブジェクトにデータを追加し、ページ表示時に使用することです.ただし,@ModelAttribute注釈の位置によっては,他の注釈と組み合わせて用いられ,意味が異なる.
 
1.@ModelAttributeコメントメソッド
例(1),(2),(3)と同様に,@ModelAttributeによって注釈される方法は,このコントローラの各方法の実行前に実行されるので,1つのコントローラが複数のURLをマッピングする使い方には慎重に用いる.
 
(1)@ModelAttributeコメントvoid戻り値のメソッド
 
@Controller 
public class HelloWorldController { 
    @ModelAttribute 
    public void populateModel(@RequestParam String abc, Model model) { 
          model.addAttribute("attributeName", abc); 
    } 
    @RequestMapping(value = "/helloWorld") 
    public String helloWorld() { 
        return "helloWorld"; 
    } 
 }

この例では、リクエスト/helloWorldを取得した後、populateModelメソッドはhelloWorldメソッドの前に呼び出され、リクエストパラメータabcの値をattributeNameというmodel属性に加え、このパラメータを持ってhelloWorldメソッドを実行する
 
 
(2)@ModelAttributeコメント特定のクラスを返す方法
 
@ModelAttribute 
public Account addAccount(@RequestParam String number) { 
    return accountManager.findAccount(number); 
} 
@RequestMapping(value = "/helloWorld") 
public String helloWorld(Account account) { 
    return "helloWorld"; 
} 

この場合、モデル属性の名前は指定されず、このメソッドがAccountタイプを返すように、戻りタイプによって暗黙的に表されます.このモデル属性の名前はaccountです.ただし、名前が一致しない場合、クラス一致も取得できます.たとえば、上のhelloWorldメソッドパラメータ名accountを他の名前に変更してもデータを取得できます.
 
(3)@ModelAttribute(value=")コメント特定のクラスを返す方法
 
@Controller 
public class HelloWorldController { 
   @ModelAttribute("attributeName") 
   public String addAccount(@RequestParam String abc) { 
       return abc; 
   } 
 
   @RequestMapping(value = "/helloWorld") 
   public String helloWorld() { 
       return "helloWorld"; 
   } 
}

この例では@ModelAttributeコメントのvalueプロパティを使用して、modelプロパティの名前を指定します.モデル属性値はメソッドの戻り値です.その役割はモデルに相当する.addAttribute("attributeName",abc);
 
 
(4)@ModelAttributeと@RequestMappingが同時に1つのメソッドを注釈する
 
@Controller 
public class HelloWorldController { 
    @RequestMapping(value = "/helloWorld.do") 
    @ModelAttribute("attributeName") 
    public String helloWorld() { 
         return "hi"; 
    } 
}

この場合、このメソッドの戻り値はビュー名を表すのではなく、modelプロパティの値であり、ビュー名はRequestToViewName Translatorによって要求「/helloWorld.do」に従って論理ビューhelloWorldに変換されます.Model属性名は@ModelAttribute(value=")で指定され、requestにkey=attributeName、value=hiがカプセル化されていることに相当します.
 
 
2.@ModelAttributeコメントメソッドのパラメータ
(1)モデルから値を取る(テストでは、このコメントをしなくても値が取れる)
 
@Controller 
public class HelloWorldController { 
     @ModelAttribute("user") 
     public User addAccount() { 
         return new User("jz","123"); 
      } 
 
     @RequestMapping(value = "/helloWorld") 
     public String helloWorld(@ModelAttribute("user") User user) { 
          user.setUserName("jizhou"); 
          return "helloWorld"; 
     } 
}

この例では,@ModelAttribute("user")User注釈メソッドパラメータ,パラメータuserの値はaddAccount()メソッドのmodel属性に由来する.
このときメソッドボディに@SessionAttributes("user")が表示されていない場合、scopeはrequest、表示されている場合、scopeはsession
 
(2)FormフォームまたはURLパラメータから取得する(実際には、このコメントをしなくてもuserオブジェクトを取得できる)
@Controller 
public class HelloWorldController { 
     @RequestMapping(value = "/helloWorld") 
     public String helloWorld(@ModelAttribute User user) { 
         return "helloWorld"; 
     } 
}