首页 > 编程学习 > 16.普通参数与基本注解-@ModelAttribute

16.普通参数与基本注解-@ModelAttribute

发布时间:2022/9/5 6:43:29

抄的网上的分析,但是也要用自己的话理解一遍

用法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

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号