一、modelattribute注解
@ModelAttribute注解的方法有兩種,一種無返回值,一種有返回值,方法的可以用@RequestParam注解來獲取請求的參數,如果不獲取參數,可以不用此注解
1)無返回值,用Map中的對象放入ImpliciteModel中,key就是map中存儲的key.
@ModelAttribute
public void setUser(@RequestParam(value="name",required=false) String name, Map<String,Object> map)
{
Address ad=new Address();
ad.setCity("beijing");
ad.setProvince("china");
User u=new User();
u.setAge(15);
u.setAddress(ad);
if(name.equals("xp")){
u.setWork("huajia");
}
else {
u.setWork("gongchengshi");
}
map.put("user", u);
System.out.println(u);
}
2)有返回值 把返回值對象放入ImpliciteModel中,key就是ModelAttribute定義的key:"user"
@ModelAttribute("user")
public User setUser(@RequestParam(value="name",required=false) String name)
{
Address ad=new Address();
ad.setCity("beijing");
ad.setProvince("china");
User u=new User();
u.setAge(15);
u.setAddress(ad);
if(name.equals("xp")){
u.setWork("huajia");
}
else {
u.setWork("gongchengshi");
}
System.out.println("用戶"+u);
return u;
}
總結: @ModelAttribute("user")指定key為"user"時,若方法有返回值,則返回值會以指定的key,放入ImpliciteModel中;若方法沒有返回值,但是方法中有相同key的map,則存入ImpliciteModel中key的為map中存的對象,若沒有相同key的map,則存入ImpliciteModel中key對應的對象為null.若方法有返回值且方法中也有相同key的map,則以map對象優先。
@ModelAttribute沒有指定key時,只能用Map將對象存入ImpliciteModel中。
ImpliciteModel中的對象,可以認同為Request域中對象。
二、 POJO入參過程
1,檢查implicite中是否存在相同key(默認為pojo類名小寫,可以用@modelattribute指定)的值,有則傳入,並用請求的參數值替換對應的值。
2,若implicite中沒有,則檢查sessionattribute中是否相同key的值,有則同一,沒有則拋異常(可以通過配置,避免異常)。
3,若1、2中都沒有,則通過反射創建對象,並用請求的參數值替換對應的值。最后再把對象存入implicite中。