七、Spring MVC之ModelAttribute

  

,,,前面几篇文章分别说了spring mvc如何传参数到后台,如何返回参数到前台。今天来说一下,spring mvc的ModelAttribute注解,这个注解有什么作用,什么场景下使用?


,,,, 1,应用场景:数据更新。例如有一个实体用户,其中有id、用户名、年龄、电子邮件、createTime等属性,createTime定义了用户的创建时间,一般都是后台自动获取并赋值。除了id和createTime之外的用户的其他属性,都是可以编辑修改的,如下图所示。

七,spring mvc之ModelAttribute


而此时我们的后台,一般会使用对象进行接收参数,如下所示:

@RequestMapping (“/testModelAttribute”)   public  String  testModelAttribute (User 用户){   ,,,System.out.println(用户);   ,,,return “成功”;   }

测试代码,设定用户的默认值,可以看到后台的输出

用户{userName=發xy”,密码=恪?,邮件=皌est@126.com”,,=20岁,createTime=零,,地址=零}

,用户对象只有用户名,年龄,emai有值,其它的都是零:

& lt; form  action="/testModelAttribute/testModelAttribute”,方法=皃ost”比;   ,,,用户名:& lt; input  type=" text ", name="用户名",value=" https://www.yisu.com/zixun/lxy "/祝辞,& lt; br/比;   ,,,年龄:& lt; input  type=" text ", name="时代”,价值=" https://www.yisu.com/zixun/20 "/祝辞,& lt; br/比;   ,,,电子邮件:& lt; input 类型=拔谋尽?name="电子邮件",value=" https://www.yisu.com/zixun/test@126.com "/祝辞,& lt; br/比;   ,,,& lt; input 类型=疤峤弧?value=" https://www.yisu.com/zixun/submit ",/比;   & lt;/form>


如果我们这个时候更新数据库的话,就需要先查询一下数据库,读出来之前用户对象的值,然后把前台传递过来的参数设置到用户上,否则就会导致部分数据丢失。

另一种解决方案是在编辑之前,先把数据查询出来,然后在页面上使用隐藏域,把其它的值放在隐藏域中,然后使用在提交形式表单的时候,把隐藏域的数据一并提交到后台。


2,配合使用ModelAttribute注解,这里根据参数用户名、模拟从数据库中读取数据

@ModelAttribute   public  void  getUserById (@RequestParam (value =,“用户名”,required =,假)   ,,,String 用户名,Map<字符串,Object>,地图),{   ,,,System.out.println(“任何时候我都会被调用”);   ,,,如果(userName  !=, null), {   ,,,,,,,//模拟读取数据库中的数据   ,,,,,,,User  User =, new 用户();   ,,,,,,,user.setUserName (“lxy ");   ,,,,,,,user.setAge (18);   ,,,,,,,user.setPassword (“123456”);   ,,,,,,,user.setEmail (“lxy@126.com”);   ,,,,,,,user.setCreateTime (new 日期());   ,,,,,,,map.put(“用户”,用户);   ,,,}   }

此时,再次运行项目,可以看到后台的输出为:电子邮件和年龄是前台传递过来的参数,而密码和createTime都是从数据库中读取出来的数据,这就可以直接根据用户实体,更新数据库了。

用户{userName=發xy”,密码=?23456’,,邮件=test@126.com,,=20岁,   createTime=Mon  Mar  20, 18:03:31  CST  2017年,地址=零}


3注意,访问控制器中的任意的方法,都会调用被ModelAttribute注解的方法,所以说这个注解要慎用,在适用在注解之前,需要认真考虑是否真的合适。

@RequestMapping (“/testRun”)   public  String  testRun () {   ,,,System.out.println(”我就看看会不会调用ModelAttribute注解修饰的方法”);   ,,,return “成功”;   }

访问上面的方法,可以看到下面的输出,被ModelAttribute注解修饰的方法,会先于目标方法执行:

任何时候我都会被调用   我就看看会不会调用ModelAttribute注解修饰的方法


4,在目标方法的参数上使用ModelAttribute注解

上面我们看到在被ModelAttribute注解修饰的方法上,如果要想被取到值,在方法中必须要这样设置,

User  User =, new 用户();   user.setUserName (“lxy ");   user.setAge (18);   user.setPassword (“123456”);   user.setEmail (“lxy@126.com”);   user.setCreateTime (new 日期());//如果设置的关键为临时,则目标方法上必须要有相应的注解声明,才能起到效果   map.put(“临时工”,用户);

七、Spring MVC之ModelAttribute