当前位置: 首页 > news >正文

request.getSession().getAttribute(Constants.ADMIN_ID)

你提出了一个非常好的问题! 确实,使用 request.getSession().getAttribute(Constants.ADMIN_ID) 也能从 Session 中获取属性,那么 @SessionAttribute 注解和这种方式到底有什么区别呢?

request.getSession().getAttribute(Constants.ADMIN_ID) 的工作方式

  1. 手动获取 Session:
    • request.getSession(): 首先,你需要通过 HttpServletRequest 对象获取 HttpSession 对象。
    • getAttribute(Constants.ADMIN_ID): 然后,你需要调用 HttpSessiongetAttribute 方法,并传入 Session 属性的名称 (这里是 Constants.ADMIN_ID)。
  2. 类型转换:
    • getAttribute 返回一个 Object 对象, 你需要手动将其强制转换为你需要的类型,例如 Integer
  3. 空值处理:
    • 你需要自己判断 getAttribute 是否返回了 null,并且做相应的处理 (例如设置默认值)。

@SessionAttribute 的工作方式

  1. 声明式 Session 获取:
    • @SessionAttribute(value = Constants.ADMIN_ID, required = false) Integer adminId: 你只需要在方法参数上添加 @SessionAttribute 注解,并指定属性名称,Spring MVC 会自动从 Session 中获取数据。
  2. 自动类型转换:
    • Spring 会自动将 Session 中的属性值转换为方法参数的类型 (Integer 在此例中)。
  3. 可选属性:
    • 你可以通过 required 属性来控制 Session 属性是否是必须的, 如果为 false, 并且 Session 中没有这个属性,则方法参数会被注入 null
  4. 简洁性: @SessionAttribute 提供一种声明式的、更加简洁的方式来获取 Session 属性, 减少了繁琐的获取和类型转换代码。

主要区别

Featurerequest.getSession().getAttribute(Constants.ADMIN_ID)@SessionAttribute(value = Constants.ADMIN_ID, required = false) Integer adminId
获取方式手动通过 HttpServletRequest 获取 HttpSession, 然后再调用 getAttribute声明式地使用注解,Spring MVC 自动处理。
代码量代码较多,需要手动处理获取 session、获取属性值、类型转换和空值判断。代码简洁,只需注解声明,Spring 自动处理。
类型转换需要手动进行类型转换。自动进行类型转换。
空值处理需要手动判断是否返回 null使用 required 属性,可以指定是否需要处理空值。
异常处理需要手动处理 getAttribute 返回 null 或类型转换失败的异常。Spring 会抛出异常如果 Session 中找不到属性或者类型转换失败 (当 required=true时)。
可读性代码较为冗长,可读性较差。代码简洁,更易读懂。
维护性需要自己编写处理 Session 属性的代码。依赖于 Spring 的注解处理,维护性更高。
测试性测试代码需要模拟 HttpServletRequestHttpSession测试代码更简洁,可以使用 MockMvc 测试 Spring MVC 控制器。

总结

  • request.getSession().getAttribute(Constants.ADMIN_ID): 是一种传统的、手动的方式来获取 Session 属性。 你需要编写很多代码来完成获取、类型转换、以及空值处理。
  • @SessionAttribute(value = Constants.ADMIN_ID, required = false) Integer adminId: 是一种声明式的、更简洁的方式来获取 Session 属性。 Spring 会帮助你自动获取,转换类型, 和处理空值问题。

通常情况下,我们 推荐使用 @SessionAttribute,因为它更加简洁、类型安全、可读性更强, 并且更加符合 Spring 的编程风格。 request.getSession().getAttribute 这种方式, 更加适合于没有使用 Spring MVC 框架的场景, 例如原生 Servlet 的场景。

简单来说, @SessionAttribute 是 Spring MVC 提供的一个语法糖,简化了从 Session 获取属性的操作。 它更符合 Spring 的编程风格, 也更简洁易维护。

在这里插入图片描述

http://www.lryc.cn/news/514100.html

相关文章:

  • 线性回归模型的构建与训练
  • 【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)
  • 【推送】主流的服务端推送技术的对比
  • 直观解读 JuiceFS 的数据和元数据设计(一)
  • nginx配置文件没有语法颜色
  • PCB层叠结构设计
  • 电子应用设计方案83:智能 AI 打印机系统设计
  • windows安装rsync Shell语句使用rsync
  • Django 模型
  • CentOS — 压缩解压
  • OpenGL变换矩阵和输入控制
  • LCS最长公共子序列C++实现
  • 深入刨析数据结构之排序(上)
  • 【无重复字符的最长子串】
  • Vue3+Element Plus的表格分页实战
  • vue项目搭建规范
  • Mac iTerm2集成DeepSeek AI
  • 检索增强生成(RAG)
  • 【第二部分--Python之基础】03 容器类型的数据
  • 【人工智能机器学习基础篇】——深入详解深度学习之复杂网络结构:卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等概念及原理
  • MySQL 入门教程
  • 【sql】CAST(GROUP_CONCAT())实现一对多对象json输出
  • QT:控件属性及常用控件(1)------核心控件及属性
  • 使用 Python结合ffmpeg 实现单线程和多线程推流
  • Linux一些问题
  • 在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库
  • HTML5实现好看的二十四节气网页源码
  • C++(9)—类和对象(上) ②实例化
  • Effective C++读书笔记——item2(const,enum,inlines取代#define)
  • 如何科学评估与选择新版本 Python 编程语言和工具