一、没有使用@ModelAttribute的Controller方法.

    @RequestMapping("/save")
public String save(User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
  • 其中User包含id和username两个私有属性,含有公共setter和getter方法.
    执行此方法时会将key为"user"(参数类型首字母小写),value为user的对象加入到model中.在jsp页面可以通过${user.id}和${user.name}得到值的,即上面方法和下面方法是相当的.

        @RequestMapping("/save")
    public String save(Model model,int id,String username) {
    User user=new User();
    //这里是通过反射从request里面拿值再set到user
    user.setId(id);
    user.setUsername(username);
    model.addAttribute("user",user); user.setUsername("U love me");
    userService.save(user);
    return "result";
    }

二、在方法上使用@ModelAttribute

    @ModelAttribute("user1")
public User addUser(User user) {
return new User(520,"I love U");
}
  • 执行UserController内带有@RequestMapping的方法之前,都会先执行此addUser方法.并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute("user1")引起的).这样model中就有两个User的对象,一个对象名为user1值为new User(520,"I love U"),另一个对象名为“user”(形参对象类型首字母小写)值为jsp页面传过来的值set到user中。

三、在方法参数上使用@ModelAttribute

    @RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
  • 此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中key为"user").
    使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.

四、在方法和方法参数上结合使用@ModelAttribute

    @ModelAttribute("user1")
public User addUser(User user) {
return new User(520,"I love U");
}
@RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
  • 假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.
    再来个小小假设,将上面@ModelAttribute("user1")的user1改为user,其它不变.虽然执行了addUser方法,那么执行到save方法内,user对象的字段值还是来源于请求,最后返回到jsp页面,model里也只有一个User类型对象

五、另类

    @ModelAttribute
@RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
  • 此种情况,会添加一个key为"user"的User对象到model,还会添加一个key为"string",value为"result"的对象到model,而视图名称则变为了"save"而不是"result".相信一般开发者都不会这样用.

(七)springmvc之ModelAttribute注解的更多相关文章

  1. SpringMVC的@ModelAttribute注解简单使用(用户修改信息)

    例如有一个User对象,我们要修改他的值,但是不能修改他的密码!通过表单提交数据之后,password为null,会把原对象的passwod覆盖掉.这时候可以用@ModelAttribute注解处理. ...

  2. SpringMvc中@ModelAttribute注解的使用

    一.绑定请求参数到指定对象 public String test1(@ModelAttribute("user") UserModel user) 只是此处多了一个注解@Model ...

  3. springmvc的ModelAttribute注解

    先看一个没有使用@ModelAttribute的Controller方法. @RequestMapping("/save") public String save(User use ...

  4. springmvc中ModelAttribute注解应用在参数中

    可以用@ModelAttribute来注解方法参数或方法.带@ModelAttribute创建的参数对象会被添加到Model对象中.注解在参数上时,可以从Form表单或URL参数中获取参数并绑定到mo ...

  5. SpringMVC @ModelAttribute注解

    /**     * 1. 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用!      * 2. @ModelAttribute 注解也可以来修饰 ...

  6. 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

    从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...

  7. SpringMVC(十七-二十) ModelAttribute 注解

    有点难理解. 修饰方法是表示在该控制器的所有目标方法执行前都执行该modelattribute注解的方法. 修饰参数是表示什么?修饰参数时@modelattributes(value="xx ...

  8. @ModelAttribute注解(SpringMVC)

    在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法. 在方法的入参前使用 @Mod ...

  9. springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)

    springmvc在获取Request和Response有很多方式:具体请看:https://www.cnblogs.com/wade-luffy/p/8867144.html 产生线程问题的代码如下 ...

随机推荐

  1. 一键分享QQ、微信、微博等

    github上找到的,合并了一个二维码在线支持API,直接修改样式可用. 二维码API说明网址:http://www.liantu.com/pingtai/ <html> <head ...

  2. wcf 错误提示

    wcf 不弹出错误提示,只显示“服务器处理请求时遇到错误.有关构造有效服务请求的内容,请参阅服务帮助页”,添加以下节点可以弹出错误提示. <serviceDebug includeExcepti ...

  3. Angular 执行 css3 简单的动画

    <div class="content"> 内容区域 <button (click)="showAside()">弹出侧边栏</b ...

  4. ubuntu 12.04 nfs-server/client安装配置

    由于opennebula的共享存储的方式需要nfs,为了opennebula 3.8在ubuntu 12.04上搭建做铺垫,先介绍下nfs server和client端的安装和配置.   1. nfs ...

  5. memcache安装与简单介绍

    本文参考自菜鸟教程中的内容. 安装 安装memcache的时候,请切换为root用户 root@centos # wget http://www.memcached.org/files/memcach ...

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_18-微服务之间认证-需求分析

    4.1 需求分析 前边章节已经实现了用户携带身份令牌和JWT令牌访问微服务,微服务获取jwt并完成授权. 当微服务访问微服务,此时如果没有携带JWT则微服务会在授权时报错. 测试课程预览: 1.将课程 ...

  7. php关于文件上传的两个配置项说明

    ; Maximum allowed size for uploaded files.; http://php.net/upload-max-filesizeupload_max_filesize = ...

  8. excel自学笔记 from av50264533

    1.函数公式 MINUTE(serial_number)  函数解读 Serial_number 表示一个时间值,其中包含要查找的分钟  函数公式 NOW()  函数解读 显示出现在的时间 计算通话时 ...

  9. xml 数组 互相转换方法

    public function xmlToArray($xml) { //将XML转为array $array_data = json_decode(json_encode(simplexml_loa ...

  10. 最新 珍岛java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.珍岛等10家互联网公司的校招Offer,因为某些自身原因最终选择了珍岛.6.7月主要是做系统复习.项目复盘.LeetCode ...