Spring mvc@ModelAttribute注記の使用
@ModelAttribute使用の詳細
1.@ModelAttributeコメントメソッド 例(1),(2),(3)と同様に,@ModelAttributeによって注釈される方法は,このコントローラの各方法の実行前に実行されるので,1つのコントローラが複数のURLをマッピングする使い方には慎重に用いる. (1)@ModelAttributeコメントvoid戻り値のメソッド
[java] view plain
copy
print ?
@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メソッドの前に呼び出され、リクエストパラメータ(/helloWorld?abc=text)attributeNameというmodelプロパティに追加すると、実行後にhelloWorldが呼び出され、戻りビュー名helloWorldとmodelが@ModelAttributeメソッドによって生成されます.この例ではmodelプロパティ名とmodelプロパティオブジェクトにはmodel.addAttribute()が実装されていますが、メソッドにModelタイプのパラメータを追加することを前提としています. URLやpostにサブパラメータが含まれていない場合は、エラーが報告されますが、このメソッドは必要ありません.リクエストのメソッドを完全に書くことができます.このパラメータが欠けてもエラーはありません.
[java] view plain
copy
print ?
@RequestMapping(value = "/helloWorld")
public String helloWorld(String abc) {
return "helloWorld";
}
(2)@ModelAttributeコメント特定のクラスを返す方法
[java] view plain
copy
print ?
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
この場合、モデル属性の名前は指定されず、このメソッドがAccountタイプを返すように、戻りタイプによって暗黙的に表されます.このモデル属性の名前はaccountです. この例では、モデル属性名には戻りオブジェクトタイプの暗黙的な表現があり、モデル属性オブジェクトはメソッドの戻り値です.特定のパラメータは必要ありません. (3)@ModelAttribute(value=")コメント特定のクラスを返す方法
[java] view plain
copy
print ?
@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プロパティの名前を指定します.modelプロパティオブジェクトはメソッドの戻り値です.特定のパラメータは必要ありません. (4)@ModelAttributeと@RequestMappingが同時に1つのメソッドを注釈する
[java] view plain
copy
print ?
@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)モデルから取得
[java] view plain
copy
print ?
@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オブジェクトを取得できる)
[java] view plain
copy
print ?
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
このときこのUserクラスには必ずパラメータのないコンストラクション関数があることに注意してください.
(3)取得できるだけでなく、隠しモデルオブジェクトにない場合は、隠しモデルオブジェクトに追加することもできます.
1.@ModelAttributeコメントメソッド 例(1),(2),(3)と同様に,@ModelAttributeによって注釈される方法は,このコントローラの各方法の実行前に実行されるので,1つのコントローラが複数のURLをマッピングする使い方には慎重に用いる. (1)@ModelAttributeコメントvoid戻り値のメソッド
[java] view plain
copy
print ?
@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メソッドの前に呼び出され、リクエストパラメータ(/helloWorld?abc=text)attributeNameというmodelプロパティに追加すると、実行後にhelloWorldが呼び出され、戻りビュー名helloWorldとmodelが@ModelAttributeメソッドによって生成されます.この例ではmodelプロパティ名とmodelプロパティオブジェクトにはmodel.addAttribute()が実装されていますが、メソッドにModelタイプのパラメータを追加することを前提としています. URLやpostにサブパラメータが含まれていない場合は、エラーが報告されますが、このメソッドは必要ありません.リクエストのメソッドを完全に書くことができます.このパラメータが欠けてもエラーはありません.
[java] view plain
copy
print ?
@RequestMapping(value = "/helloWorld")
public String helloWorld(String abc) {
return "helloWorld";
}
(2)@ModelAttributeコメント特定のクラスを返す方法
[java] view plain
copy
print ?
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
この場合、モデル属性の名前は指定されず、このメソッドがAccountタイプを返すように、戻りタイプによって暗黙的に表されます.このモデル属性の名前はaccountです. この例では、モデル属性名には戻りオブジェクトタイプの暗黙的な表現があり、モデル属性オブジェクトはメソッドの戻り値です.特定のパラメータは必要ありません. (3)@ModelAttribute(value=")コメント特定のクラスを返す方法
[java] view plain
copy
print ?
@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プロパティの名前を指定します.modelプロパティオブジェクトはメソッドの戻り値です.特定のパラメータは必要ありません. (4)@ModelAttributeと@RequestMappingが同時に1つのメソッドを注釈する
[java] view plain
copy
print ?
@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)モデルから取得
[java] view plain
copy
print ?
@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オブジェクトを取得できる)
[java] view plain
copy
print ?
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
このときこのUserクラスには必ずパラメータのないコンストラクション関数があることに注意してください.
(3)取得できるだけでなく、隠しモデルオブジェクトにない場合は、隠しモデルオブジェクトに追加することもできます.
@RequestMapping(value="/create/success")
public String createSuccess(@ModelAttribute("message") String message,@ModelAttribute("aaa") String aaa){
return "index";
}
@ModelAttribute("aaa") String aaa 。