z.cn/wangzhan/weihu/"> 网站运营维护
  • 案例

  • 方案

  • 电商网站开发

  • 微信小程序

  • 我们

  • 联系

  • 资讯

    精准传达 • 有效沟通

    从品牌网站建设到网络营销策划,从策略到执行的一站式服务

    七、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


    网站题目:七、SpringMVC之ModelAttribute
    本文路径:http://cdkjz.cn/article/pcggdj.html
    多年建站经验

    多一份参考,总有益处

    联系快上网,免费获得专属《策划方案》及报价

    咨询相关问题或预约面谈,可以通过以下方式与我们联系

    大客户专线   成都:13518219792   座机:028-86922220