因为对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"; }