@ModelAttribute使用详解

 

@ModelAttribute可以作用在方法或者方法的参数

注:被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

一、作用在方法上

1.@ModelAttribute注释void返回值的方法

此时给@ModelAttribute设置value是没作用的,他用在有返回值的情况下

    @ModelAttribute
    public void getColor(Model model){
        model.addAttribute("yello");//这句将给model中添加一条key:string  value:yello
     model.addAttribute(1);//这句将给model中添加一条key:integer value:1
  }

 2.@ModelAttribute注释返回具体类的方法

  @ModelAttribute("name")
    public String getColor(Model model){
        model.addAttribute("yello");//这句将给model中添加一条key:string  value:yello
        return "color"; 
}

解释:若@ModelAttribute没有设置value=name,那么return "color";这句将给model中添加一条key:string value=color,这个key是根据返回值类型来的

   若@ModelAttribute设置value=name,那么return "color";这句将给model中添加一条key:name value=color

 二、作用在方法的参数上

1.对象合并

复制代码
    @ModelAttribute
    public User getUser(){
        User user = new User();
        user.setName("winclpt");
        user.setSex("男");
        user.setAge(25);
        return user;
    }
    @RequestMapping("update")
    public void update(User user){//此处的user来自上面
        user.setSex("女");
        System.out.println(user.toString());
    }
  结果:User [name=winclpt, sex=女, age=25]
复制代码

2.对象合并指定对象名称

复制代码
    @ModelAttribute("MyUser")
    public User getUser(){
        User user = new User();
        user.setName("winclpt");
        user.setSex("男");
        user.setAge(25);
        return user;
    }
    @RequestMapping("update")
    public void update(@ModelAttribute("MyUser") User user){
        System.out.println(user.toString());
    }
    结果:User [name=winclpt, sex=女, age=25]

复制代码

3.如果你的方法参数里带有@ModelAttribute的参数.表示从JSP Page传回的参数并自动的转化为java对象 ,在转换的时候先匹配@ModelAttribute生成的model中匹配属性进行java对象转换,最后再将JSP Page传过来的参数匹配后赋值给java对象属性

Controller代码如下:

复制代码
@Controller
@RequestMapping("test")
public class TestController {
    @ModelAttribute("MyUser")
    public User getUser(){
        User user = new User();
        user.setName("winclpt");
        user.setSex("男");
        user.setAge(25);
        return user;
    }
    @RequestMapping("update")
    public void update(@ModelAttribute("MyUser") User user){
        System.out.println(user.toString());
    }
    @RequestMapping("index")
    public String index(){
        return "index";
    }
}
复制代码

index.jsp

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE>
<html>
  <head>
    <title>spring mvc</title>
  </head>
  <body>
           <h3>modelattrubie</h3>
           <form method="post" action="/springweb/test/update">
               <label>年龄:</label><input type="text" name="age" value="${user.age }"/>
               <input type="submit" value="更改"/>
           </form>
  </body>
</html>
复制代码

当表单提交的时候,进入/springweb/test/update,参数中的user来自@ModelAttribute("MyUser"),页面传过来的age属性覆盖原有的user.age

所以结果如下:User [name=winclpt, sex=男, age=334]

三、ModelAttribute和RequestMapping同时作用在一个方法

复制代码
@Controller
@RequestMapping("test")
public class TestController {
    @RequestMapping("winclpt")
    @ModelAttribute
    public String doTest(){
        return "winclpt";
}
复制代码

这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/test/winclpt"转换为逻辑视图/test/winclpt.jsp

 
分类: Spring
 
 
« 上一篇:多数据源事物管理浅谈
» 下一篇:@SessionAttribute使用详解
原文地址:https://www.cnblogs.com/kelelipeng/p/10169597.html