码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解

时间:2016-07-21 19:30:46      阅读:6679      评论:0      收藏:0      [点我收藏+]

标签:

因为对modelattribute这个注解不了解,所以在网上搜寻一些答案,感觉还是似懂非懂的,所以便自己测试,同时还结合网上别人的答案;最后得出我自己的见解和结果,不知道正确否。同时还进行了一些注入参数的测试.

本人也是菜鸟一枚,在学习springmvc,下面的结果都是我自己测试得出来的,我也不能保证准确性,所以你发现有错误,欢迎指出。

user是我创建的一个类,用于测试的,就四个属性,id、username、password、time

@ModelAttribute

1.    modelattribute注解在方法的前面

因为有modelattribute注解,会创建对象放入model。最后这个user会放入作用域

如果注解后面跟(名字),那么创建的对象,名字会是注解后面指定的名字。

//每次在调用这个controller的其他的方法前,这个方法都会先执行
    @ModelAttribute
    public User hello(){
        return new User(1,"a","b",new Date());
    }

 

2.  modelattribute注解在参数前面

这样的注解,首先springmvc,会先去model找有没有user2这个对象,如果有,注入到user这个参数中,并且最后返回jsp的时候,user这个对象,会以名字user2放入作用域。

    public String test6(@ModelAttribute("user2") User user){

  

 3.  sessionAttributes和modelattribute 同时使用,而且名字一样,

比如都是user2的话,那么sessionAttributes会去session找user2,找不到就会报错。(如果没有user2的话,会报错,解决办法:创建一个方法,return new user,并且方法上面使用modelattribute注解。)

如果找到了user2,就注入到user参数中。

最后的user会以user2的名字,放入session,而不是request作用域。

 

 

SpringMVC注入参数

springmvc在注入参数方面很智能。

一般参数提交有 form表单提交方式和url后跟?加参数的形式。还有ajax提交的数据。(不论何种形式提交的参数,都是 名字 = 值,键值对的形式,springmvc就是根据key去进行匹配,匹配到进行注入

如下面的这个代码测试。我发起请求,url是:http://localhost/springmvc/upload/test4?username=天气&password=123&str=aaaaa。

测试结果是,username和password都注入到了user中,和str也对应的注入到了str中。

注:这个测试中,我发现,对象user会被springmvc自动存入作用域request,而str这不会。

    @RequestMapping(value = "/test4")
    public String test4(User user,String str){
        user.setUsername("啊啊");
        System.out.println(str);
        return "upload";
    }

就这个上面测试的结果,我感觉已经足够平时开发中的大多数提交参数的需求了。

 

有时候比如,我们想隐藏后台真实参数的名字,就可以用注解@RequestParam来注入参数。

如下代码测试,我请求的url是:http://localhost/springmvc/upload/test4?username=天天&password=123&min=1

结果是:username和password都注入user了,min注入max了。   required的意思是,这个参数是否必须,如果是true的话,同时前台并没有传递这个参数,那么会报错。

    @RequestMapping(value = "/test4")
    public String test4(User user,@RequestParam(value = "min",required = true)String max){
        user.setUsername("啊啊");
        System.out.println(max);
        return "upload";
    }

  

有时候,我们想让参数不要跟在?的后面,保持url链接的干净。就可以使用@PathVariable来注入参数

如下代码测试,我请求的url是:http://localhost/springmvc/upload/test2/aaaaaa

结果是,test2后面的值(aaaaaa)注入abc中。

注:这个代码返回的页面上,有个${str},本来这个${str}是我做另外的测试用的,但是我发现在这个测试中,url中的值aaaaa,也同时放入了request中,在前台jsp页面是能够显示的。但是我在方法中通过request.getParameter和getAttribute尝试去取这个str,却显示结果为空。不明白springmvc是怎么做的。。。。。。  不过我还是需要记住这一点:PathVariable的值也会被放入作用域request中。

    @RequestMapping("/test2/{str}")
    public String test2(@PathVariable("str")String abc) {
        System.out.println(abc);
        return "upload";
    }

  

SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解

标签:

原文地址:http://www.cnblogs.com/yanqin/p/5692583.html

(0)
(4)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!