189 8069 5689

七、SpringMVC之ModelAttribute-创新互联

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

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的平顶山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

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

七、Spring MVC之ModelAttribute

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

@RequestMapping("/testModelAttribute") public String testModelAttribute(User user){     System.out.println(user);     return "success"; }

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

User{userName='lxy', password='null', email='test@126.com',  age=20, createTime=null, address=null}

,user对象只有userName、age、emai有值,其它的都是null:

    userName: 
    age: 
    email: 
    

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

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

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

@ModelAttribute public void getUserById(@RequestParam(value = "userName", required = false)     String userName, Map map) {     System.out.println("任何时候我都会被调用");     if(userName != null) {         //模拟读取数据库中的数据         User user = new User();         user.setUserName("lxy");         user.setAge(18);         user.setPassword("123456");         user.setEmail("lxy@126.com");         user.setCreateTime(new Date());         map.put("user", user);     } }

此时,再次运行项目,可以看到后台的输出为:email和age是前台传递过来的参数,而password和createTime都是从数据库中读取出来的数据,这就可以直接根据user实体,更新数据库了。

User{userName='lxy', password='123456', email='test@126.com', age=20,  createTime=Mon Mar 20 18:03:31 CST 2017, address=null}

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

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

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

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

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

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

User user = new User(); user.setUserName("lxy"); user.setAge(18); user.setPassword("123456"); user.setEmail("lxy@126.com"); user.setCreateTime(new Date()); //如果设置的key为temp,则目标方法上必须要有相应的注解声明,才能起到效果 map.put("temp", user);@RequestMapping("/testModelAttribute2") public String testModelAttribute2(@ModelAttribute("temp")User user){     //这里的temp与被ModelAttribute注解修饰的方法的存放的key一致     System.out.println(user);     return "success"; }

项目源代码:

https://git.oschina.net/acesdream/spring-mvc

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:七、SpringMVC之ModelAttribute-创新互联
分享链接:http://cdxtjz.cn/article/ddhghs.html

其他资讯