16.普通参数与基本注解-@ModelAttribute
作者:互联网
抄的网上的分析,但是也要用自己的话理解一遍
用法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