@ModelAttribute注記の使用
3895 ワード
詳細
@ModelAttributeの最も主要な役割は、モデルオブジェクトにデータを追加し、ページ表示時に使用することです.ただし,@ModelAttribute注釈の位置によっては,他の注釈と組み合わせて用いられ,意味が異なる.
1.@ModelAttributeコメントメソッド
例(1),(2),(3)と同様に,@ModelAttributeによって注釈される方法は,このコントローラの各方法の実行前に実行されるので,1つのコントローラが複数のURLをマッピングする使い方には慎重に用いる.
(1)@ModelAttributeコメントvoid戻り値のメソッド
この例では、リクエスト/helloWorldを取得した後、populateModelメソッドはhelloWorldメソッドの前に呼び出され、リクエストパラメータabcの値をattributeNameというmodel属性に加え、このパラメータを持ってhelloWorldメソッドを実行する
(2)@ModelAttributeコメント特定のクラスを返す方法
この場合、モデル属性の名前は指定されず、このメソッドがAccountタイプを返すように、戻りタイプによって暗黙的に表されます.このモデル属性の名前はaccountです.ただし、名前が一致しない場合、クラス一致も取得できます.たとえば、上のhelloWorldメソッドパラメータ名accountを他の名前に変更してもデータを取得できます.
(3)@ModelAttribute(value=")コメント特定のクラスを返す方法
この例では@ModelAttributeコメントのvalueプロパティを使用して、modelプロパティの名前を指定します.モデル属性値はメソッドの戻り値です.その役割はモデルに相当する.addAttribute("attributeName",abc);
(4)@ModelAttributeと@RequestMappingが同時に1つのメソッドを注釈する
この場合、このメソッドの戻り値はビュー名を表すのではなく、modelプロパティの値であり、ビュー名はRequestToViewName Translatorによって要求「/helloWorld.do」に従って論理ビューhelloWorldに変換されます.Model属性名は@ModelAttribute(value=")で指定され、requestにkey=attributeName、value=hiがカプセル化されていることに相当します.
2.@ModelAttributeコメントメソッドのパラメータ
(1)モデルから値を取る(テストでは、このコメントをしなくても値が取れる)
この例では,@ModelAttribute("user")User注釈メソッドパラメータ,パラメータuserの値はaddAccount()メソッドのmodel属性に由来する.
このときメソッドボディに@SessionAttributes("user")が表示されていない場合、scopeはrequest、表示されている場合、scopeはsession
(2)FormフォームまたはURLパラメータから取得する(実際には、このコメントをしなくてもuserオブジェクトを取得できる)
@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";
}
}