标签:16 ModelAttribute User 注解 model 方法 public user
抄的网上的分析,但是也要用自己的话理解一遍
用法1:用在入参
运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
用在方法的入参上依次做如下操作:
- 从隐含对象中获取隐含的模型数据
- 将请求参数绑定到隐含对象中
- 将隐含对象传入到入参
- 将入参绑定到Model
- 用在参数上 就跟map没啥区别,参数会自动入参
用法2:用在方法上
被@ModelAttribute注释的方法会在此controller的每个方法执行前被执行 ,如果有返回值,则自动将该返回值加入到ModelMap中。因此对于一个controller映射多个URL的用法来说,要谨慎使用。我们编写控制器代码时,会将保存方法独立成一个控制器也是如此。
使用@ModelAttribute注解的方法和被@RequestMapping注解的处理方法由很多相似之处:
都可以通过入参接收前台提交的数据,而且对入参绑定的设置都是一样的。
入参绑定的数据如果没有设置可为空,不能接收空数据,否则会报错。
都可以将数据放入model中,而且对于一次请求,model是共享的,所以在处理方法中的model中存放了@ModelAttribute注解的方法中存放的数据。
1.@ModelAttribute注释void返回值的方法
实例1
@Controller public class HelloModelController { @ModelAttribute public void populateModel(@RequestParam String abc, Model model) { model.addAttribute("attributeName", abc); } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld.jsp"; } }
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> </head> <body> <c:out value="${attributeName}"></c:out> </body> </html>
在popu的方法上加上了@ModelAttribute 注解,所以在请求helloword时会提前触发popu方法, 比如在触发这个方法的时的url是 /helloword?abc=111,此时popu方法就会将参数放入abc,然后放入请求域中,当执行到hello方法时 返回了一个jsp,那么此时jsp中就
直接拿到请求域里的数据,不过也没这么写的,直接在hello中操作不就行了,这样只是为了理解这个注解的作用
实例2
@ModelAttribute public void getUser(@RequestParam(value="userName",required=false) String userName,Model model){ User user = new User(userName,"123456"); model.addAttribute("user", user); }
@RequestMapping("/testModelAttribute") public String testModelAttribute(ModelMap model){ System.out.println("testModelAttribute user:"+model.get("user")); return "success"; }
<form action="testModelAttribute" method="post"> 用户名:<input type="text" name="userName" value="jack"> <button type="submit">submit</button> </form>
当提交表单的时候,提前触发了@ModelAttribute下的方法, 并接收表单提交的userName,存入model中,由于test的入参请求是ModelMap ,所以get的user就是@ModelAttribute下的方法提供的user
一次请求中的ModelAttribute 和 ModelMap 是相同的
2.@ModelAttribute注释返回具体类的方法
实例1
@Controller public class Hello2ModelController { @ModelAttribute public User populateModel() { User user=new User(); user.setAccount("ray"); return user; } @RequestMapping(value = "/helloWorld2") public String helloWorld() { return "helloWorld.jsp"; } }
<c:out value="${user.account}"></c:out>
当访问helloWorld2,会触发pop方法,pop方法中new了一个user并返回了,此时并没有model添加属性,而是直接返回了,那么返回值的小写就是key值,value就是user对象,上面相当于model.addAttribute(“user”, user)。
也可以指定属性名称
@Controller public class Hello2ModelController { @ModelAttribute(value="myUser") public User populateModel() { User user=new User(); user.setAccount("ray"); return user; } @RequestMapping(value = "/helloWorld2") public String helloWorld(Model map) { return "helloWorld.jsp"; } }
<c:out value="${myUser.account}"></c:out>
对象合并:
@Controller public class Hello2ModelController { @ModelAttribute public User populateModel() { User user=new User(); user.setAccount("ray"); return user; } @RequestMapping(value = "/helloWorld2") public String helloWorld(User user) { user.setName("老王"); return "helloWorld.jsp"; } }
只要知道会先运行@ModelAttribute下的方法,并且会将返回值放入请求域中,就能知道是怎么回事了,在执行hello方法的时候 拿等会再写
11
1
标签:16,ModelAttribute,User,注解,model,方法,public,user 来源: https://www.cnblogs.com/dzs894330350/p/16656735.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。