springmvc学习笔记(12)——ModelAttribute

springmvc 专栏收录该内容
34 篇文章 2 订阅

我们会遇到的问题

我们开发一个项目,最经常做的用例就是增删改查。假设这时候我们要修改一个用户的信息,他的数据库字段如下:

idnamepasswordage
1zhou12345622

用户还有其他基本信息,这里为了方便,就不一一列出。

现在来模拟一下场景:
用户打开界面,要修改个人基本信息

<form action="testModelAttribute" method="post">
    id:<input type="text" name="id">
    name:<input type="text" name="name">
    age:<input type="text" name="age">
    <input type="submit" value="submit">
</form>

你可能注意到了,在这个表单中,并没有password。那是肯定的,用户要修改的是基本信息,并不是修改密码。难道每次修改基本信息都要把密码也一起修改了吗?显然不可能。
那么问题来了,挖掘机技术到底哪家强???
I’am just kidding!
回到正题,先看看这样子修改信息会产生什么问题:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println(user);
        //执行更新操作
        return "hello";
    }

在控制台打印出要修改的User
这里写图片描述
看到了吧,打印出来的password是null。用户要修改个人信息,这时候你执行了更新操作,将user更新到数据库,那么用户的密码将被你更新为null,也就是说,用户修改了个人信息,密码却没掉了
解决这个问题,我们可以使用ModelAttribute注解。

如何使用ModelAttribute

先看代码:

@RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println(user);
        //执行更新操作
        return "hello";
    }
    /**
     * 
     * @param id 用户ID,required必须为false,否则访问其他方法时将报错
     * @param map 从数据库中读出来的user放入map中
     */
    @ModelAttribute
    public void getUser(@RequestParam(value="id",required=false)
    Integer id,Map<String, Object> map){
        if(id!=null){
            //从数据库读取Id为1的User数据,这里做一个模拟
            User user = new User(1,"zhou","123456",22);
            map.put("user", user);
        }
    }

代码解析
在控制层中加入getUser方法,加上注解ModelAttribute。
产生的效果是:当用户访问该控制层中任意一个方法时,都会先调用getUser方法。这时候,用户要更新个人信息,getUser方法调用,根据传过来的Id,从数据库中获取用户的信息,存入map(请求域),然后testModelAttribute方法被调用。从前端传来的user的属性值,一一对应填充到user对象中,而password没有传值过来也不会影响,因为password的值已经从数据库读取了。这时候执行更新操作,用户的密码就不会被置为null了。

结果截图:
这里写图片描述
这里写图片描述

#idnamepasswordage
前端传值:1jacksonnull35
数据库原值1zhou12345622
最后被更新的user1jsckson12345635

注意

  • 访问该控制层中其他方法时,都将调用ModelAttrubute注解的方法,因此入参id必须有required=false,否则访问其他方法没有传id的值就会报错。
  • 从数据库取出来的值必须放入map或者model中(即放入请求域),这样目标方法才能接收到值

运行流程

  1. 执行ModelAttribute修饰的方法:从数据库中取出对象User,把对象放入map中
  2. springmvc从map中取出对象,把表单的请求参数赋给User的对应属性
  3. springmvc把上述对象传入目标方法的参数
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值