@ModelAttribute注解只支持一個屬性value,類型是為String,代表綁定的屬性名稱。
@ModelAttribute會優先於@RequestMapping執行,也會在Controller中每個方法執行前被執行,所以當一個Controller中有映射到多個Url時,需要謹慎使用
@ModelAttribute的注解方法大致有五種,下面總結一下
1.
@Controller public class ModelAttributeController{ @ModelAttribute("loginname") public String userModelfirst(@ResquestParam("loginname") String loginname){ //返回的參數賦值給value變量 return loginname; } @RequestMapping(vaule="/loginfirst") public String loginfirst(){ //返回到結果界面 return "resultfirst"; } }
這里注解@ModelAttribute注解默認vaule值為“loginname”,指定model的屬性名稱,屬性的值就是@ModelAttribute注解的方法的返回值。
他把請求參數loginname的值通過@ResquestParam賦值給變量loginname,然后再設置一個名為loginname的屬性到Model中,屬性值就是變量loginname的值
因為@ModelAttribute優先於@RequestMapping執行,所以當訪問URL“/loginfirst”時會先執行@ModelAttribute注解的方法
在resultfirst.jsp中用EL表達式得到${resquestScope.loginname}獲取
2.
@Controller public class ModelAttributeController{ @ModelAttribute public void userModelsecond(@ResquestParam("loginname") String loginname,Model model){ model.addAttribute("loginname",loginname); } @RequestMapping(vaule="/loginsecond") public String loginsecond(){ //返回到結果界面 return "resultsecond"; } }
這里@ModelAttribute注解的方法void返回值,將請求參數通過@ResquestParam賦值給變量,再通過model.addAttribute()方法實現model屬性名稱和屬性值。
在resultsecond.jsp中用EL表達式得到${resquestScope.loginname}獲取傳遞的值
3
@Controller public class ModelAttributeController{ @RequestMapping(vaule="/loginthird") @ModelAttribute(vaule="uesrname") public String loginthird{ return "admin"; } } }
@RequestMapping和@ModelAttribute注釋同一個方法時,此方法返回的不是一個視圖名稱,而是model的值,視圖名稱是"/loginthird",Model的屬性名稱value已經在注解中指定,所以,
可以理解為username(key)= admin(value)
4
@Controller public class ModelAttributeController{ @ModelAttribute("user") public String userModelfourth(@ResquestParam("loginname") String loginname){ User user = new User(); user.setLoginame(loginname); return user; } @RequestMapping(vaule="/loginfourth") public String loginfourth( @ModelAttribute("user") User user){ //返回到結果界面 user.setUsername("test"); return "resultfourth"; } }
在這里user就是model的value值,返回的user賦值給了value,在下面方法用了@ModelAttribute("user") User user注釋參數,意思就是參數user的值就是userModelfourth()的model屬性;
5
@Controller public class ModelAttributeController{ @ModelAttributepublic User UseruserModelfifth(@ResquestParam("loginname") String loginname,
@ResquestParam("password") String password){ User user = new User(); user.setLoginame(loginname);
user,setLoginame(password);
//方法返回的是user或null return find(loginname,password); } @RequestMapping(vaule="/loginfifth") public String loginfifth(){return "resultfifth"; } }
在這里model的屬性名稱沒有被指定,也沒有傳入Model類型的參數,由於@ModelAttribute先於loginfifth()方法調用,所以@ModelAttribute注解的方法返回類型隱含表示,
就是說如果find(loginname,password)返回的類型是User,那么model的屬性名稱就是user。
未經允許,不得轉發,后果自負