Spring MVC常用注释:@ModelAttribute注释

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>