org.springframework.web.bind.annotation.ModelAttribute注释类型将请求参数绑定到Model对象.
@ModelAttribute注释只支持一个属性value,类型为String,表示绑定的属性名称.
@ModelAttribute注释的使用方式有很多种:
<a href="/springTest/modelAttributeForm/Form1">测试@ModelAttribute(value="")注释返回具体类的方法</a><br/> <a href="/springTest/modelAttributeForm/Form2">测试@ModelAttribute注释void返回值的方法</a><br/> <a href="/springTest/modelAttributeForm/Form3">测试@ModelAttribute注释返回具体类的方法</a><br/> <a href="/springTest/modelAttributeForm/Form4">测试@ModelAttribute和@RequestMapping同时注释一个方法</a><br/> <a href="/springTest/modelAttributeForm/Form5">测试@ModelAttribute注释一个方法的参数</a><br/>
1.测试@ModelAttribute(value=””)注释返回具体类的方法
(1)建立一个表单
<h2>测试@ModelAttribute(value="")注释返回具体类的方法</h2> <form action="/springTest/modelAttributeLogin/login1" methos="post"> <input type="text" name="loginname" /> <input type="submit" /> </form>
(2)接收表单提交数据的控制器
@Controller public class LoginController { @ModelAttribute("loginname") public String userModel1( @RequestParam("loginname") String loginname ) { System.out.println("model1"); return loginname; } @RequestMapping(value="/modelAttributeLogin/login1") public String login1() { System.out.println("login1"); return "result1"; } }
控制器除了@RequestMapping映射的login1方法之外,还提供了一个userMode1方法,该方法有一个@ModelAttribute注释,此处@ModelAttribute注释默认的value值为loginname,用来指定model属性的名称,而model属性的值就是userModel1方法的返回值.被@ModelAttribute注释的userModel1方法会先于login1调用,他把请求参数loginname的值赋予loginname变量,并设置一个属性loginname到Model当中,而属性的值就是loginname变量的值.
(3)视图显示loginname的值
<h3>requestScope.loginname=${requestScope.loginname}</h3>
2.测试@ModelAttribute注释void返回值的方法
(1)表单
<h2>测试@ModelAttribute注释void返回值的方法</h2> <form action="/springTest/modelAttributeLogin/login2" methos="post"> loginname:<input type="text" name="loginname" /><br> password:<input type="text" name="password" /><br> <input type="submit" /> </form>
(2)控制器
@Controller public class Login2Controller { @ModelAttribute public void userModel2( @RequestParam("loginname") String loginname, @RequestParam("password") String password, Model model ) { System.out.println("model2"); model.addAttribute("loginname", loginname); model.addAttribute("password", password); } @RequestMapping(value="/modelAttributeLogin/login2") public String login2() { System.out.println("login2"); return "result2"; } }
这个控制器除了@RequestMapping映射的login2方法之外,还提供了一个userMode2的方法,该方法有一个@ModelAttribute注释,userMode2方法会先于login2调用,他把请求参数值赋予对应变量,model属性名称和值由model.addAttribute()方法实现,前提是要在方法中加入一个Model类型的参数
(3)视图
<h2>测试@ModelAttribute注释void返回值的方法</h2> <h3>requestScope.loginname=${requestScope.loginname}</h3> <h3>requestScope.password=${requestScope.password}</h3>
3.测试@ModelAttribute注释返回具体类的方法
(1)表单
<form action="/springTest/modelAttributeLogin/login3" methos="post"> loginname:<input type="text" name="loginname" /><br> password:<input type="text" name="password" /><br> <input type="submit" /> </form>
(2)User对象
public class User implements Serializable { private String loginname; private String password; private String role; public User() { super(); } ... }
(3)控制器
@Controller public class Login3Controller { //静态List<User>集合,此处代替数据库用来保存注册的用户信息 private static List<User> userList; //UserController类的构造器 初始化List<User>集合 public Login3Controller() { super(); userList = new ArrayList<User>(); User user1 = new User(); user1.setLoginname("test"); user1.setPassword("123456"); user1.setRole("测试用户"); User user2 = new User(); user2.setLoginname("admin"); user2.setPassword("123456"); user2.setRole("管理员"); //存储User用户用于模拟数据库 userList.add(user1); userList.add(user2); } //根据登录名和密码查询用户,用户存在则返回用户信息,不存在返回null public User find(String loginname,String password) { for(User user:userList) { if(user.getLoginname().equals(loginname) && user.getPassword().equals(password)) { return user; } } return null; } //model属性的名称没有被指定,他由返回类型隐含表示,如这个方法返回User类型,那么这个model属性名称是user @ModelAttribute public User userModel3( @RequestParam("loginname") String loginname, @RequestParam("password") String password ) { return find(loginname,password); } @RequestMapping(value="/modelAttributeLogin/login3") public String login3() { return "result3"; } }
除了@RequestMapping映射的login3方法之外,还提供了一个userModel3方法,该方法上有一个@ModelAttribute注释.userModel3方法会先于login3方法调用,这里model属性的名称没有被指定,他由@ModelAttribute注释的userModel3方法的返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称就是user.此处find方法是模拟数据库根据登录名和密码查询用户功能实现.
4.测试@ModelAttribute和@RequestMapping同时注释一个方法
(1)表单
<form action="/springTest/modelAttributeLogin/login4" methos="post"> loginname:<input type="text" name="loginname" /><br> password:<input type="text" name="password" /><br> <input type="submit" /> </form>
(2)控制器
@Controller public class Login4Controller { @RequestMapping(value="/modelAttributeLogin/login4") @ModelAttribute(value="loginname") public String login4() { return "admin"; } }
在ModelAttribute中,@ModelAtribute和@RequestMapping同时注释一个方法,此时login4方法的返回值并不是一个视图名称,而是model属性的值,视图名称是@RequstMapping的value值/modelAttribute/login4.Model的属性名称由@ModelAttribute的value值指定,这相当于在request中封装了loginname=admin
(3)视图
<h3>loginname=${requestScope.loginname}</h3>
5.测试@ModelAttribute注释一个方法的参数
(1)表单
<form action="/springTest/modelAttributeLogin/login5" methos="post"> loginname:<input type="text" name="loginname" /><br> password:<input type="text" name="password" /><br> <input type="submit" /> </form>
(2)控制器
@Controller public class Login5Controller { @ModelAttribute(value="user") public User userModel5( @RequestParam("loginname") String loginname, @RequestParam("password") String password ) { User user = new User(); user.setLoginname(loginname); user.setPassword(password); return user; } @RequestMapping(value="/modelAttributeLogin/login5") public String login5( @ModelAttribute("user") User user ) { user.setRole("unknow"); return "result5"; } }
除了@RequestMapping映射的login5方法之外,还提供了一个userModel5方法,该方法上有一个@ModelAttribute(“user”)注释.userModel5方法会先于login5调用,这里model属性名称就是value值,model属性对象就是userModel5方法的返回值User
(3)视图
<h3>loginname=${requestScope.user.loginname}</h3> <h3>role=${requestScope.user.role}</h3>