Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute、@SessionAttributes以及Model的使用介绍

本文详细介绍了Spring MVC中数据如何通过Model、@ModelAttribute和@SessionAttributes进行传递的过程,包括向Model添加数据的不同方法及如何在Controller类间共享数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Model:存储数据的作用域对象,相当于request

向model中添加数据,方式一,通过addAttribute方法:

@RequestMapping("/save")  
public String save(Model model,int id,String username) {  
    User user=new User();  
    //这里是通过反射从request里面拿值再set到user  
    user.setId(id);  
    user.setUsername(username);  
    model.addAttribute("user",user);  

    return "result";  
} 

向model中添加数据,方式二,通过@ModelAttribute注解的方式

2、@ModelAttribute:作用于方法或参数上的注解,把数据或对象添加进Model对象

作用于方法上:向model中set值。

在一个到达的request中,任何被@ModelAttribute注解的方法都会在controller handler method之前调用,返回值作为数据被添加进model对象中

//如果@ModelAttribute()未指定key,则key默认为方法返回类型名称的首字母小写形式
@ModelAttribute("userKey")
public User getUser(){
    User u =new User();
    p.setName("小明");
    return u;
}


@RequestMapping("/save")  
public String save(Model model) {  

    //后台使用model中的数据
    User user = model.asMap().get("userKey");//拿到name为小明的user对象

    return "result";  
} 

//前台使用model中数据的方式:
var userName = ${userKey.name};

作用于参数上:从model中get值并绑定到参数上。

通过名称对应,把model对象中相应的属性值绑定到注解的参数上,如果model对象中没有此属性,则把request中按名称对应的方式把值绑定到参数上

前台发送一个请求:http://localhost/web/test?testId=123456789

@ModelAttribute("testId")
public String getTestId(){
    return "987654321";
}

@RequestMapping("/test")  
public String test(@ModelAttribute("testId") String testId) {  

    //输出 987654321,如果没有上面的getTestId方法,model对象中也就没有testId属性,则使用request中的testId属性值
    System.out.println(testId);

    return "result";  
} 

3、@SessionAttributes:作用于Controller类,让Controller所有方法共享Model对象中一个或多个属性
再解释明白一点:就是原来model中有一个属性testId,现在在Controller上添加注解@SessionAttributes(“testId”),则所有方法都可以通过model获取该testId属性值

@Controller
@SessionAttributes("testId")
public class TestController{

@ModelAttribute("testId")
public String getTestId(){
    return "987654321";
}

@RequestMapping("/test")  
public String test(Model model) {  

    String testId = model.asMap().get("testId");
    System.out.println(testId);//输出 987654321

    return "result";  
}
}

@SessionAttributes有两个属性,value和type,用于指定key和数据类型,可以多值
@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})

当需要清除通过@SessionAttributes向session当中添加的值得时候,我们只需要在controller的方法中传入一个SessionStatus的类型对象 通过调用setComplete方法就可以清除了。

@RequestMapping("/test")
public String test(SessionStatus status) {
  status.setComplete();
  return "result";
}

ps:关于ModelAttribute、SessionAttributes与RequestScope、SessionScope的关系,可以参看
理解Spring MVC Model Attribute 和 Session Attribute
,总结就是数据先被保存到model中,然后再拷贝到requestScope中,如果使用了@SessionAttributes注解,同时相应属性被拷贝到sessionScope中。

另外,文中也说了一下关于使用model而不是直接使用request的原因:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值