@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。
未经允许,不得转发,后果自负