@SessionAttributes 和 @SessionAttribute的区别

Spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttribute。

我们先看下@SessionAttributes的定义:

@SessionAttributes用于在请求之间的HTTP Servlet会话中存储model属性。 它是类型级别的注解,用于声明特定控制器使用的会话属性。 这通常列出应透明地存储在会话中以供后续访问请求的模型属性的名称或模型属性的类型。

举个例子:

@SessionAttributes("user")
public class LoginController {@ModelAttribute("user")public User setUpUserForm() {return new User();}
}

我们可以看到@SessionAttributes是类注解,他用来在session中存储model。 如上面的例子,我们定义了一个名为“User”的model并把它存储在Session中。

我们再看一下@SessionAttribute的定义:

如果您需要访问全局存在(例如,在控制器外部(例如,通过过滤器)管理)并且可能存在或可能不存在的预先存在的会话属性,则可以在方法参数上使用@SessionAttribute注释,例如 以下示例显示:

@Controller
@RequestMapping("/user")
public class UserController {/** Get user from session attribute*/@GetMapping("/info")public String userInfo(@SessionAttribute("user") User user) {System.out.println("Email: " + user.getEmail());System.out.println("First Name: " + user.getFname());return "user";}
}

@SessionAttribute只是获取存储在session中的属性。如果要设置(添加删除)session的属性,则要考虑将org.springframework.web.context.request.WebRequest或javax.servlet.http.HttpSession注入到控制器方法中。

@SessionAttributes中绑定的model可以通过如下几个途径获取:

  • 在视图中通过request.getAttribute或session.getAttribute获取

  • 在后面请求返回的视图中通过session.getAttribute或者从model中获取

  • 自动将参数设置到后面请求所对应处理器的Model类型参数或者有@ModelAttribute注释的参数里面。

@SessionAttributes用户后可以调用SessionStatus.setComplete来清除,这个方法只是清除SessionAttribute里的参数,而不会应用Session中的参数。

@Controller
@SessionAttributes("pet")
public class EditPetForm {// ...@PostMapping("/pets/{id}")public String handle(Pet pet, BindingResult errors, SessionStatus status) {if (errors.hasErrors) {// ...}status.setComplete(); // ...}}
}

总结一下:

@SessionAttributes 是将model设置到session中去。

@SessionAttribute 是从session获取之前设置到session中的数据。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

@SessionAttributes 和 @SessionAttribute的区别相关推荐

  1. Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新

    文章目录 简介 Spring基础 Core核心技术 Testing测试 Data Access Web Servlet Web Reactive 总结 简介 是什么让java世界变得更好,程序员变得更 ...

  2. spring5高级编程_Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新

    简介 是什么让java世界变得更好,程序员变得更友爱,秃头率变得不是那么的高,让程序员不必再每天996,有时间找个女朋友? 是Spring. 是什么让企业级java应用变得简单易懂,降低了java程序 ...

  3. 从原理层面掌握@RequestAttribute、@SessionAttribute的使用【享学Spring MVC】

    每篇一句 改我们就改得:取其精华,去其糟粕.否则木有意义 前言 如果说知道@SessionAttributes这个注解的人已经很少了,那么不需要统计我就可以确定的说:知道@RequestAttribu ...

  4. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore

    @SessionAttribute作用于处理器类上,用于在多个请求之间传递参数,类似于Session的Attribute,但不完全一样,一般来说@SessionAttribute设置的参数只用于暂时的 ...

  5. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  6. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  7. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  8. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  9. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

最新文章

  1. Spring Boot 2.x基础教程:使用JTA实现分布式事务
  2. html表格选择一行,vue + element table表格如何默认选中第一行
  3. UtilSession failed: Prerequisite check CheckSystemSpace space(22288172004) is not availa
  4. 轻松实现突破网管限制(SoftEther实际应用)
  5. 从mysql读取图片_如何从sql数据库内读取图片
  6. MongoDB使用记录
  7. java钱_在Java中如何表示钱Money?
  8. 【GNN】一文轻松了解Graph Neural Networks
  9. 腾讯云即时通讯IM_ 小贴士
  10. jpg照片如何压缩变小?三步轻松搞定
  11. jQuery中的siblings()的用法
  12. INS防封号技巧,这些注意事项如果你不知道容易被封号停用
  13. 篮球图片html页面代码,教你用PS制作一个非常逼真的篮球图片
  14. 对交换机与路由器的认知
  15. oracle 计算当前日期是今年的第几周的计算方法
  16. Excel调整行高,鼠标右键直接选中一行进行调整了
  17. 一心多用多线程-线程的生命周期
  18. WebRTC RTCP PS Feedback
  19. 基于JAVA图书共享系统计算机毕业设计源码+数据库+lw文档+系统+部署
  20. 字典生成器crunch问题汇总(移植到Windows/字符集)

热门文章

  1. EOJ_1017_座位分配
  2. HDU4267(2012长春网络赛)
  3. Win下通过 Navica t连接Ubuntu下MySQL数据库
  4. Python 的 sys 模块常用方法
  5. kubernetes(一)kubeadm搭建k8s集群
  6. 40个Java多线程问题详解复习
  7. 2020年前必须掌握的数据库面试问题~
  8. 2019 年 8 月编程语言排行榜,Java涨幅不行!
  9. Kafka参数broker.id详解
  10. 音视频技术开发周刊 | 173