SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解
2016-8-23修正。
因为对modelattribute这个注解不了解,所以在网上搜寻一些答案,感觉还是似懂非懂的,所以便自己测试,同时还结合网上别人的答案;最后得出我自己的见解和结果,不知道正确否。同时还进行了一些注入参数的测试.下面的结果都是我自己测试得出来的,我也不能保证准确性,所以你发现有错误,欢迎指出。
user是我创建的一个类,用于测试的,就几个常见的属性,如id username password startDate
我看不懂springmvc的源码,但是我又很奇怪前台的数据是怎么绑定到controller参数上去的。然后我就自己通过代码去测试。
Serlvet技术,前台的数据都是首先要传入httpservletrequest对象中,在springmvc中,也是一样,数据也是在HttpServletRequest中。
SpringMVC,会帮我们创建ModelMap,他会用这个来帮我们管理,传递数据回jsp。
比如前台请求url:http://localhost/LeranSpringMVC/setUser?username=abc&age=123&startDate=2015%2F1%2F2
url中含有数据。如果在url对应的controller方法的参数中,能和传过来的数据名字对应,就会被springmvc绑定。
比如:
public void setUser(User user ) {
url中的数据,便会绑定到user中,因为user的属性Username password age 和url中数据的key对应。同时,user也会放入ModelMap
如果modelmap中已经有了user,便会被覆盖。比如:
@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setUsername("name");
user.setPassword("pass");
return user;
} // System.out.println("modelAttribte注解的方法");
@RequestMapping("/setUser")
public void setUser(User user) {
System.out.println("user = " + user);
}
getUser方法被注解,那么在setUser被访问执行前会先执行。getUser会返回user放入modelmap。
但是在setUser方法执行的时候,参数user会先去modelmap去找user,找到便绑定数据,然后如果前台还有user的数据传来,参数user的数据便会被覆盖,同时放入modelmap,覆盖之前的数据(是以一个个属性去覆盖的,我猜测是因为前台传来的是一个个的键值对)。
注:只有在controller方法的参数中,有能在前台传过来的数据中找到对应的,那么这个前台数据才会被绑定到对应参数中,同时放入modelmap。
比如上面的例子,前台传过来的数据会绑定到user中,同时放入modelmap。放入modelmap时的key是类名首字母小写。
如果,controller方法,没有参数,或者没有能在前台数据找到对应的,那么modelmap中是没有数据的。
注:modelmap中数据是request级别的。
@ModelAttribute
1. modelattribute注解在方法的前面(方法前面加这个注解,那么在这个controller的其他方法被调用时,都必须要先执行这个方法。)
作用:因为有modelattribute注解,会将方法返回的对象放入modelmap。
如果被注解方法没有返回值,那么程序并不会报错,但是这样做没什么意思。比如:
@ModelAttribute
public void getUser() {
}
@ModelAttribute("user")
public void getUser() {
}
如果注解后面没指定名字,就会将返回的类型名字,首字母小写作为key去存入modelmap。比如:
@ModelAttribute
public String getUser() {
return "abcd";
}
modelmap中是 string = abcd
如果注解后面跟(名字),那么返回的对象,放入modelmap时的key会是注解后面指定的名字。
@ModelAttribute("user")
public String getUser() {
return "abcd";
}
modelmap中是 user = abcd
2. modelattribute注解在参数前面
这样的注解,首先springmvc,会先去model找有没有user2这个对象,如果有,注入到user这个参数中(同时,如果前台还传过来user的属性对应的键值对,那么前面的user2会被覆盖),并且最后返回jsp的时候,user这个对象,会以名字user2放入作用域。
public String test6(@ModelAttribute("user2") User user){
3. sessionAttributes和modelattribute 同时使用,而且名字一样,
比如都是user2的话,那么modelAttributes会去session找user2,找不到就会报错。(如果没有user2的话,会报错,解决办法:创建一个方法,return new user,并且方法上面使用modelattribute注解。)
如果找到了user2,就注入到user参数中(同时,如果user参数还被绑定了前台数据,那么会覆盖掉modelAttribute注入的数据)。
最后的user会以user2的名字,放入session,而不是request作用域。
@Controller
@SessionAttributes("user2")
public class UserController { @ModelAttribute("user2")
public User getUser() {
User user = new User();
user.setUsername("name");
user.setPassword("pass");
return user;
} @RequestMapping("/setUser")
public void setUser(@ModelAttribute("user2")User user2) {
System.out.println("user = " + user2);
}
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的见解 和 一些注入参数、返回数据的见解的更多相关文章
- springMvc源码学习之:spirngMVC获取请求参数的方法2
@RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...
- SpringMVC(三)Restful风格及实例、参数的转换
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...
- springMvc源码学习之:spirngMvc获取请求参数的方法
一. 通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMeth ...
- 【springMVC 后台跳转前台】1.使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中 ----2.前后台都没有报错,不能进入ajax回调函数
问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方 ...
- $.post({})请求springmvc -5.x 的方法,没有 返回数据的情况
转载请注明出处,毕竟调试了一天 今天用$.post({})传递参数,账号和密码来验证登录,验证成功返回1,验证不成功返回0,结果,$.post({}),的回调函数一直无法执行,但是原来是可以的,不重大 ...
- springMVC返回数据的四种方式
转自:https://blog.csdn.net/itcats_cn/article/details/82119673 springMVC返回数据的四种方式:第一种,通过request.setAttr ...
- SpringMVC参数返回给页面
springMVC将后台参数返回给前台页面 方法一:利用ModelAndView返回值 1 @RequestMapping("/returnPage.do") 2 public M ...
- springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)
springmvc在获取Request和Response有很多方式:具体请看:https://www.cnblogs.com/wade-luffy/p/8867144.html 产生线程问题的代码如下 ...
- [转载]springmvc学习之@ModelAttribute运用详解
spring学习之@ModelAttribute运用详解 链接
随机推荐
- visionpro halcon 哪个好
visionpro halcon 哪个好 很多朋友会问到visionpro和halcon这两款机器视觉软件,到底学哪个好呢,今天众寻网就给大家讲一讲: 首先比较下两者的优缺点: halcon: 提供的 ...
- php中数据类型的强制转换
1.在PHP开发种在很多的地方要涉及到数据类型的转换,尤其是涉及到金额的数据类型,一定要转换成float类型,否则在入库的时候可能会因为数据类型的不同覆盖掉之前的金额.(字符串和float类型相加) ...
- HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Let f(x) = anxn +...+ a1x +a0, in which ai (0 <= i <= n) are all known int ...
- 剑指offer:斐波那契数列
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...
- PE文件格式介绍
Useful Tools: 1. WDK安装目录下搜下depends.exe,这个工具可以查看.exe文件依赖的.dll,以及用到的dll中的api. 2.PE文件格式分析器: 有很多的PE格式分析器 ...
- CSS设计指南之伪类
伪类这个叫法源自它们与类相似,但实际上并没有类会附加到标记中的标签上.伪类分两种. UI伪类会在HTML元素处于某个状态时(比如鼠标指针位于链接上),为该元素应用CSS样式. 结构化伪类会在标记中存在 ...
- BZOJ4475 JSOI2015子集选取(动态规划)
数据范围过大说明这个题和组合一点关系也没有,答案基本上肯定是ab的形式了.暴力打表感觉不太好写,找到当年的题面发现还有个样例是6 40 401898087,于是暴力找ab=401898087的数,发现 ...
- ARC078 D.Fennec VS. Snuke(树上博弈)
题目大意: 给定一棵n个结点的树 一开始黑方占据1号结点,白方占据n号结点 其他结点都没有颜色 每次黑方可以选择黑色结点临近的未染色结点,染成黑色 白方同理. 最后谁不能走谁输. 题解: 其实简单想想 ...
- 【电影影评】梦之安魂曲-败给了BGM和豆瓣影评
首先,这部电影豆瓣8.7分,一般来说,豆瓣的打分是比较准确的.能反映一个片子的质量,而较少受到环境的影响.但是这种关系当然也不全对,比如某些片子可能特别让某一种人喜欢(如退役军人和军旅题材),而在某些 ...
- apache代理服务器配置
1. 扩展开启,httpd.conf开启一下选项 LoadModule proxy modules/proxy.so LoadModule proxy_connect modules/proxy_co ...