七、Spring MVC之ModelAttribute
admin
2023-05-26 13:21:43
0

    前面几篇文章分别说了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


相关内容

热门资讯

印度缺油,快受不了了 文字 | 无刺王冠龙 制图 | 果 校对 | 朝乾 编辑 | 果最近,印度人的日子一天比一天难熬了:...
用柠檬酸清洗热水器应该配多少浓... 使用柠檬酸清洗热水器的水垢,在配对比例上应当是1:20需要注意的是具体情况还需要根据水垢的严重度来进...
告诉一下金帝集成灶最新款适合开... 最佳回答 你说的蒸箱款呢?还是蒸烤一体机?我觉得金帝集成灶的设计都非常好看,跟橱柜搭配非常和谐,吸烟...
侧吸油烟机漏油怎么回事 侧吸油烟机漏油怎么回事1、有时候在安装的时候没有调整好角度,仰角不够,或者是清洗时间过长导致油箱的堵...
侧吸油烟机漏油了怎么办 侧吸油烟机是厨房中必不可少的家电之一,可以有效地吸收油烟,保持厨房清洁和舒适。然而,如果侧吸油烟机出...
方太吸油烟机声音大 可能是里面的油烟太多了,需要进行清洗。或者是油烟机要坏掉了,需要专业人员进行维修。如果油烟机不能安装...
男子男扮女装、衣着暴露在学校周... 近日,海南省文昌市互联网信息办公室在日常巡查中发现,某短视频平台网络主播杨某某多次以男扮女装、衣着暴...
伊朗最高领袖:战争让官员肩负更... 据英国天空新闻报道,伊朗现任最高领袖穆杰塔巴·哈梅内伊近日发表书面声明,在纪念已故前总统莱希逝世两周...
雨夜坠河的皮卡,满车都是亲戚 作者 | 黄泽敏 实习生 | 黄思婷 编辑 | 向现肖逸(化名)没有等来奇迹。5月18日,肖逸告诉南...
赖清德抛0到18岁月发5000... 海峡导报综合报道 台湾地区领导人赖清德20日发表两周年就职演说,宣称台当局近日将提出所谓台湾人口对策...