一、@ModelAttribute
在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。
使模型对象的特定属性具有 Session 范围的作用域
package com.baobaotao.web;
…
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@RequestMapping("/bbtForum.do")
@SessionAttributes("currUser") //①将ModelMap中属性名为currUser的属性
//放到Session属性列表中,以便这个属性可以跨请求访问
public class BbtForumController {
…
@RequestMapping(params = "method=listBoardTopic")
public String listBoardTopic(@RequestParam("id")int topicId, User user,
ModelMap model) {
bbtForumService.getBoardTopics(topicId);
System.out.println("topicId:" + topicId);
System.out.println("user:" + user);
model.addAttribute("currUser",user); //②向ModelMap中添加一个属性
return "listTopic";
}
}
我们在 ② 处添加了一个 ModelMap 属性,其属性名为 currUser,而 ① 处通过 @SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 Session 中,所以我们不但可以在 listBoardTopic() 请求所对应的 JSP 视图页面中通过 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 获取 user 对象,还可以在下一个请求所对应的 JSP 视图页面中通过 session.getAttribute(“currUser”) 或 ModelMap#get(“currUser”) 访问到这个属性。
这里我们仅将一个 ModelMap 的属性放入 Session 中,其实 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。
二、@ModelAttribute
我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。
@Controller
@SessionAttributes("currentUser")
public class GreetingController{
@RequestMapping
public void hello(@ModelAttribute("currentUser") User user){
//user.sayHello()
}
}
分享到:
相关推荐
通过这种方式,`@SessionAttributes`和`@ModelAttribute`协同工作,使得我们能够方便地在多个请求间共享和恢复数据,而无需手动处理Session管理。这对于提高代码的可读性和减少重复代码是很有帮助的。 总的来说,`@...
- **通过注解的value属性和方法返回值**:推荐的做法是通过`@ModelAttribute`的`value`属性指定一个键,并返回对应的对象。这样,Spring MVC会将方法的返回值作为模型中的键值对存储。例如,`@ModelAttribute(...
通过ModelAndView、Map与Model、@SessionAttributes和@ModelAttribute注解来处理模型数据;其中,@ModelAttribute是重点,说明其运行流程并进行代码分析,最终给出SpringMVC目标方法的POJO类型参数的入参全过程,并...
5. **@SessionAttributes 和 @ModelAttribute** `@SessionAttributes` 注解用于声明需要在 HTTP 会话中存储的属性,而 `@ModelAttribute` 通常用于从请求参数或会话中创建或更新模型对象。例如: ```java @...
### SpringMVC 处理模型数据详解 #### 模型数据类型 在SpringMVC框架中,模型数据是指从控制器传递到视图层的数据。这些数据可以被用来填充页面,或者进行...而`@ModelAttribute`则为对象的传递和预填充提供了便利。
在Spring MVC框架中,`@ModelAttribute`是一个非常重要的注解,它主要用于数据绑定和模型对象的处理。在本文中,我们将深入探讨`@ModelAttribute`的使用及其在控制器(Controller)中的作用。 首先,`@...
它通常与`@ModelAttribute`配合使用,`@ModelAttribute`注解用于将方法的返回值或参数绑定到模型(Model)中,以便在视图解析时可用。 ### `@ModelAttribute` 的作用 `@ModelAttribute` 有以下两个主要用途: 1. **...
访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析...
在Java Web开发中,Spring框架提供了`@SessionAttributes`和`@ModelAttribute`注解,可以结合自定义拦截器实现防重复提交。 1. **@SessionAttributes**:这个注解用于将模型属性存储在Session中。当我们处理表单...
访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 ...
SpringMVC 3.1.1版本的源码中,Controller接口和相关注解(如@RequestMapping、@SessionAttributes、@ModelAttribute)的实现提供了上述功能的基础。通过阅读源码,我们可以更深入地理解这些特性的内部工作原理。 ...
总结来说,ModelAndView、ModelAttribute和SessionAttributes是SpringMVC处理模型数据的关键工具。ModelAndView用于封装模型数据和视图信息;ModelAttribute简化了将请求参数转化为模型对象的过程;而...
SpringMVC框架提供了多种方式来处理模型数据,包括使用ModelAndView、Map及Model、@SessionAttributes和ModelAttribute等。下面我们将详细介绍SpringMVC处理模型数据ModelAndView过程。 一、使用ModelAndView处理...
15. `@ModelAttribute("attrName")`:配合`@SessionAttributes`使用,可以从HttpSession中获取或向其中添加属性。 通过深入理解并熟练运用这些注解,开发者可以有效地构建和维护Spring MVC应用程序,提高开发效率和...
- `@ModelAttribute` 通常与表单绑定和模型属性结合使用,它可以从请求参数中获取数据并创建一个对象实例,或者将对象添加到模型中。例如: ```java @PostMapping("/submitForm") public String submitForm(@...
- `@ModelAttribute`和`@SessionAttributes`:在Spring MVC中,`@ModelAttribute`用于将请求参数绑定到模型对象,`@SessionAttributes`则用于在HTTP会话中存储模型对象。 - `@PathVariable`:从URL路径中提取参数...
它可以应用于类级别和方法级别,分别表示类级别的基本映射和方法级别的精确映射。例如,类级别上定义了一个URL前缀,方法级别上再定义具体的路径,两者结合即可完成完整的URL映射。 2. **@Controller** 注解 - `@...
SpringMVC通过@ModelAttribute注解帮助模型和视图间的数据传递。 3. **Controller接口和@RequestMapping**:Controller接口定义了处理请求的方法,而@RequestMapping注解用于指定URL映射,可以基于HTTP方法(GET, ...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。...学习和熟练掌握这些注解对于理解和使用 Spring MVC 框架至关重要。
1. `@ModelAttribute`:用于绑定请求参数到模型对象。通常与`@RequestMapping`结合使用,将请求参数转化为模型对象。 2. `@SessionAttributes`:用于指定需要存储在HttpSession中的模型属性,可以在多个请求间共享...