当前位置: 首页 > 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 的编程风格, 也更简洁易维护。

在这里插入图片描述

相关文章:

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++实现

算法思路&#xff1a;动态规划 版本1&#xff1a;只输出公共长度 #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 &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 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&#xff0c;DeepSeek 2. 安装iTerm2 AI Plugin插件&#xff0c;https://iterm2.com/ai-plugin.html&#xff0c;插件解压后直接放到和iTerms相同的位置&#xff0c;默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…...

检索增强生成(RAG)

检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;是一种结合了检索机制和生成模型的先进技术&#xff0c;旨在提高自然语言处理系统的准确性和上下文相关性。本文将详细介绍如何从零开始构建一个RAG系统&#xff0c;包括数据处理、检索、生成以及部署…...

【第二部分--Python之基础】03 容器类型的数据

Python内置的数据类型如序列&#xff08;列表、元组等&#xff09;、集合和字典等可以容纳多项数据&#xff0c;我们称它们为容器类型的数据。 序列 序列&#xff08;sequence&#xff09;是一种可迭代的、元素有序的容器类型的数据。 序列包括列表&#xff08;list&#xff…...

CodeWarrior IDE文件操作与ARM开发实践

1. CodeWarrior IDE文件操作深度解析在嵌入式开发领域&#xff0c;文件操作的高效管理直接影响着开发效率和代码安全性。作为ARM开发的经典工具链组件&#xff0c;CodeWarrior IDE提供了一套完整的文件管理机制&#xff0c;特别适合处理ARM架构的嵌入式项目。我使用这套工具开发…...

告别背包焦虑!泰坦之旅终极装备管理神器完全指南

告别背包焦虑&#xff01;泰坦之旅终极装备管理神器完全指南 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 还在为《泰坦之旅》中堆积如山的传奇装备无处存放而烦恼吗&…...

卫星通信安全认证技术解析与应用实践

1. 卫星通信安全认证技术概述卫星通信作为现代通信体系的重要组成部分&#xff0c;其安全性直接关系到国家安全和经济发展。在开放的空间环境中&#xff0c;通信信号极易被截获和干扰&#xff0c;这使得安全认证技术成为卫星通信系统设计的核心环节。当前主流的卫星通信安全认证…...

从数据驱动到物理约束:盘点神经网络求解偏微分方程的三大范式与核心进展

1. 神经网络求解偏微分方程的技术背景 偏微分方程&#xff08;PDE&#xff09;是描述自然界各种现象的核心数学工具&#xff0c;从流体力学中的纳维-斯托克斯方程到量子力学中的薛定谔方程&#xff0c;再到金融工程中的布莱克-斯科尔斯方程&#xff0c;PDE的身影无处不在。但传…...

手把手教你用C#和NetToPLCSim连接西门子S7-1200仿真PLC(含虚拟网卡配置避坑)

从零实现C#与西门子S7-1200仿真PLC通信全指南 当第一次尝试用C#与西门子PLC建立通信时&#xff0c;我盯着屏幕上反复出现的连接失败提示&#xff0c;深刻理解了什么是"工控开发入门劝退三连"——IP配置玄学、端口占用谜团、虚拟网卡黑洞。本文将用真实踩坑经验&…...

基于I2C总线与ATtiny85的RGB LCD时钟:在5个GPIO上实现多设备驱动

1. 项目概述&#xff1a;当微型控制器遇上彩色显示屏几年前&#xff0c;我在为一个智能花盆项目寻找显示方案时遇到了一个经典难题&#xff1a;手头的Adafruit Trinket&#xff08;基于ATtiny85&#xff09;只有5个可用GPIO&#xff0c;而一个能显示温湿度、时间的16x2字符LCD屏…...

递归的终极形态:彻底搞懂尾递归优化 (TCO)

&#x1f504; 递归的终极形态&#xff1a;彻底搞懂尾递归优化 (TCO) &#x1f914; 为什么普通递归会“爆栈”&#xff1f; 在理解尾递归之前&#xff0c;先看看普通递归发生了什么。 通俗比喻&#xff1a; 想象你在玩一个“传话游戏”&#xff0c;需要计算 1 2 3 ... n…...

OpCore Simplify:2024年黑苹果EFI自动化配置生成工具终极指南

OpCore Simplify&#xff1a;2024年黑苹果EFI自动化配置生成工具终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾因为OpenCore配置的…...

期权量化交易基础库:模块化设计与回测实战指南

1. 项目概述&#xff1a;一个为期权交易者打造的“地基” 如果你在量化交易或者期权策略开发领域摸爬滚打过一段时间&#xff0c;大概率会和我有同样的感受&#xff1a;每次想测试一个新想法&#xff0c;都得从零开始搭建数据接口、计算希腊字母、管理仓位、回测框架……这些重…...

专业无人机日志分析工具:UAV Log Viewer 让飞行数据分析更简单高效

专业无人机日志分析工具&#xff1a;UAV Log Viewer 让飞行数据分析更简单高效 【免费下载链接】UAVLogViewer An online viewer for UAV log files 项目地址: https://gitcode.com/gh_mirrors/ua/UAVLogViewer 无人机飞行日志分析是每个飞手和专业团队必须掌握的技能&a…...