request.getSession().getAttribute(Constants.ADMIN_ID)
你提出了一个非常好的问题! 确实,使用 request.getSession().getAttribute(Constants.ADMIN_ID) 也能从 Session 中获取属性,那么 @SessionAttribute 注解和这种方式到底有什么区别呢?
request.getSession().getAttribute(Constants.ADMIN_ID) 的工作方式
- 手动获取 Session:
request.getSession(): 首先,你需要通过HttpServletRequest对象获取HttpSession对象。getAttribute(Constants.ADMIN_ID): 然后,你需要调用HttpSession的getAttribute方法,并传入 Session 属性的名称 (这里是Constants.ADMIN_ID)。
- 类型转换:
getAttribute返回一个Object对象, 你需要手动将其强制转换为你需要的类型,例如Integer。
- 空值处理:
- 你需要自己判断
getAttribute是否返回了null,并且做相应的处理 (例如设置默认值)。
- 你需要自己判断
@SessionAttribute 的工作方式
- 声明式 Session 获取:
@SessionAttribute(value = Constants.ADMIN_ID, required = false) Integer adminId: 你只需要在方法参数上添加@SessionAttribute注解,并指定属性名称,Spring MVC 会自动从 Session 中获取数据。
- 自动类型转换:
- Spring 会自动将 Session 中的属性值转换为方法参数的类型 (
Integer在此例中)。
- Spring 会自动将 Session 中的属性值转换为方法参数的类型 (
- 可选属性:
- 你可以通过
required属性来控制 Session 属性是否是必须的, 如果为false, 并且 Session 中没有这个属性,则方法参数会被注入null。
- 你可以通过
- 简洁性:
@SessionAttribute提供一种声明式的、更加简洁的方式来获取 Session 属性, 减少了繁琐的获取和类型转换代码。
主要区别
| Feature | request.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 的注解处理,维护性更高。 |
| 测试性 | 测试代码需要模拟 HttpServletRequest 和 HttpSession。 | 测试代码更简洁,可以使用 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 的编程风格, 也更简洁易维护。

相关文章:
request.getSession().getAttribute(Constants.ADMIN_ID)
你提出了一个非常好的问题! 确实,使用 request.getSession().getAttribute(Constants.ADMIN_ID) 也能从 Session 中获取属性,那么 SessionAttribute 注解和这种方式到底有什么区别呢? request.getSession().getAttribute(Constan…...
线性回归模型的构建与训练
1.基本的导入与配置 # To support both python 2 and python 3 from __future__ import division, print_function, unicode_literals# Common imports import numpy as np import pandas as pd import os# to make this notebooks output stable across runs np.random.seed(4…...
【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)
MySQL函数 1、字符串函数2、数值函数3、日期函数4、流程函数 1、字符串函数 函数说明concat(s1, s2, …, sn)字符串拼接,将 s1, s2, …, sn 拼接成一个字符串lower(str)将字符串 str 全部转为小写upper(str)将字符串 str 全部转为大写lpad(str, n, pad)左填充&…...
【推送】主流的服务端推送技术的对比
推送技术的对比 以下是主流的服务端推送技术的对比表格,涵盖WebSocket、Server-Sent Events (SSE)、Long Polling、HTTP/2 Push和Comet: 特性WebSocketServer-Sent Events (SSE)Long PollingHTTP/2 PushComet通信方向双向单向(服务器到客户…...
直观解读 JuiceFS 的数据和元数据设计(一)
大家读完觉得有意义和帮助记得关注和点赞!!! 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储(MinIO) 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…...
nginx配置文件没有语法颜色
第一种办法: nginx-1.26.2这个目录是通过解压 nginx-1.26.2.tar.gz,nginx官网下的 将这四个目录复制到/usr/share/vim/vimfiles/目录下 cp -ar ./* /usr/share/vim/vimfiles/ 再次进入nginx配置文件可以看到已经有颜色了 第二种方法: …...
PCB层叠结构设计
PCB层叠结构设计 层叠结构设计不合理完整性相关案例:在构成回流路径时,由于反焊盘的存在,使高速信号回流路径增长,造成信号回流路径阻抗不连续,对信号质量造成影响。 PCB层叠结构实物:由Core 和 Prepreg&a…...
电子应用设计方案83:智能 AI 打印机系统设计
智能 AI 打印机系统设计 一、引言 智能 AI 打印机系统旨在提供更高效、便捷和个性化的打印服务,融合了人工智能技术,以满足不断变化的用户需求。 二、系统概述 1. 系统目标 - 实现自动纸张检测、调整打印参数,适应不同纸张类型和尺寸。 - 具…...
windows安装rsync Shell语句使用rsync
sh脚本里使用 rsync功能,需要提前布置rsync环境 第一步,下载 libxxhash-0.8.2-1-x86_64.pkg.tar 下载压缩包地址 Index of /msys/x86_64/https://repo.msys2.org/msys/x86_64/ 下载对应版本,没特殊需求下载最高版本就行了 解压缩压缩包 …...
Django 模型
Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…...
CentOS — 压缩解压
文章目录 一、tar二、zip、unzip三、gzip、gunzip四、bzip2、bunzip2 一、tar 文件格式:.tar 压缩格式:tar [-参数] *.tar 目录|文件 解压格式:tar [-参数] *.tar [-C 目标目录] 参数 -c:create,创建,创…...
OpenGL变换矩阵和输入控制
在前面的文章当中我们已经成功播放了动画,让我们的角色动了起来,这一切变得比较有意思了起来。不过我们发现,角色虽然说是动了起来,不过只是在不停地原地踏步而已,而且我们也没有办法通过键盘来控制这个角色来进行移动…...
LCS最长公共子序列C++实现
算法思路:动态规划 版本1:只输出公共长度 #include <iostream> #include <string> using namespace std;int c[1000][1000]; //c[i][j]用来存储 Xi到Yj的最长公共子序列长度 void MaxLength(int m, int n, string x, string y) { //m&#x…...
深入刨析数据结构之排序(上)
目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…...
【无重复字符的最长子串】
一、题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: …...
Vue3+Element Plus的表格分页实战
Element Plus 是一个基于 Vue 3 的现代化 UI 组件库,旨在帮助开发者快速构建美观且功能丰富的 Web 应用程序。它提供了大量的 UI 组件,如按钮、表单、表格、弹出框、标签页、树形控件等,涵盖了 Web 应用开发中常见的大多数场景。本文通过一个实例来说明vue3+elementplus查询…...
vue项目搭建规范
项目搭建规范 一. 代码规范1.1. 集成editorconfig配置1.2. 使用prettier工具1.3. 使用ESLint检测1.4. git Husky和eslint1.5. git commit规范1.5.1. 代码提交风格1.5.2. 代码提交验证 二. 第三方库集成2.1. vue.config.js配置2.2. vue-router集成2.3. vuex集成2.4. element-plu…...
Mac iTerm2集成DeepSeek AI
1. 去deepseek官网申请api key,DeepSeek 2. 安装iTerm2 AI Plugin插件,https://iterm2.com/ai-plugin.html,插件解压后直接放到和iTerms相同的位置,默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…...
检索增强生成(RAG)
检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索机制和生成模型的先进技术,旨在提高自然语言处理系统的准确性和上下文相关性。本文将详细介绍如何从零开始构建一个RAG系统,包括数据处理、检索、生成以及部署…...
【第二部分--Python之基础】03 容器类型的数据
Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列(sequence)是一种可迭代的、元素有序的容器类型的数据。 序列包括列表(listÿ…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
