详解Java四大作用域

2023-11-16

四大作用域

凡是作用域都有如下方法

setAttribute(name,value);name是String类型,value是Object类型; 往域对象里面添加数据,添加时以key-value形式添加
getAttribute(name); 根据指定的key读取域对象里面的数据
removeAttribute(name); 根据指定的key从域对象里面删除数据

1.pageContext

1.1定义:

pageContext对象是JSP中很重要的一个内置对象,不过在一般的JSP程序中,很少用到它。它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。

详细解释:

  • jsp内置对象:JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。在JSP页面中,可以通过存取JSP内置对象实现与JSP页面和Servlet环境的相互访问。每个内部对象均有对应所属的ServletAPI类型。

    JSP内置对象包括request对象、response对象、session对象、out对象、application对象、page对象、exception对象、pageContext对象、config对象。这些对象在客户端和服务器端交互的过程中分别完成不同的功能。

范围最小的一个域,可以获取其他八大内置对象,能够获取其他所有域中的数据。能跳转到其他资源它旨在当前页面有效,也就是用户请求的页面有效,当前页面跳转、重定向、定时刷新、关闭的时候,page对象将在响应回馈给客户端之后就释放(销毁)。


2.request(详解)

2.1定义

request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request

request的功能可以分为以下几种:

  • 封装了请求头数据
  • 封装了请求正文数据,如果是GET请求,那么就没有正文
  • request是一个域对象,可以把它当成Map来添加获取数据
  • request提供了请求转发和请求包含功能

2.2 request域对象的使用

一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。前一个Servlet来setAttribute传值,后一个Servlet来getAttribute获取值

void setAttribute(String name, Object value) 用来存储一个对象,也可以称之为存储一个域属性

例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

Object getAttribute(String name) 用来获取request中的数据,当前在获取之前需要先去存储才行

例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

void removeAttribute(String name) 用来移除request中的域属性

如果参数name指定的域属性不存在,那么本方法什么都不做

Enumeration getAttributeNames() 获取所有域属性的名称

它在当前请求中有效。作用域一次HTTP请求到服务器处理结束,返回响应的整个过程。request可以通过 setAttribute() 方法实现页面中的信息传递,也可以通过 forward() 方法进行页面间的转跳到多个jsp页面中,一旦刷新页面,它们将重新计算。


2.3生命周期

  1. 当请求来时创建request对象
  2. 当请求结束时,request就销毁。
  3. 每次请求都是一个新的request对象。
    request域对象,是建议使用,并被频繁使用的域对象,因为它声明周期比较短,也就代表着,它效率比较高,释放资源比较及时。

2.4 获取请求头数据

request与请求头相关的方法有:
    String getHeader(String name):获取指定名称的请求头;
    Enumeration getHeaderNames():获取所有请求头名称;
    int getIntHeader(String name):获取值为int类型的请求头。

request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。

int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
  String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
  String getMethod():返回请求方法,例如:GET
  Locale getLocale():返回当前客户端浏览器的Localejava.util.Locale表示国家和言语,这个东西在国际化中很有用;
  String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
  void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
  String getContextPath():返回上下文路径,例如:/hello
  String getQueryString():返回请求URL中的参数,例如:name=zhangSan
  String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
  StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
  String getServletPath():返回Servlet路径,例如:/oneServlet
  String getRemoteAddr():返回当前客户端的IP地址;
  String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
  String getScheme():返回请求协议,例如:http;
  String getServerName():返回主机名,例如:localhost
  int getServerPort():返回服务器端口号,例如:8080

3.session(详解)


3.1定义

服务器为了保存用户状态而创建的一个特殊的对象

当浏览器第一次访问服务器时,服务器会创建一个session对象(该对象会拥有一个唯一id,一般称作sessionId),服务器会将sessionid以cookie的方式发送给浏览器.当浏览器再次访问服务器的时候,服务器会将session对象发送过来,服务器根据sessionId就可以找到session对象。

3.2 获取session对象

HttpSession s = request.getSession(boolean flag);

注: HttpSession是一个接口。

当flag为true时:先查看请求当中是否有sessionId,如果没有, 则创建一个session对象。

如果有,则依据sessionId查找对应的session对象,如果找到了,则返回该对象,

如果找不到,创建一个新的session对象。

当flag为false时:先查找请求当中是否有sessionId,如果没有,返回null。

如果有,则依据sessionId查找对应的session 对象,如果找到了,则返回该对象,如果找不到,返回null。

HttpSession s = request.getSession();

3.3 Session常用方法

resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
setAttribute(String s, Object o):在session存放属性
getAttribute(String s):从session中得到s所对应的属性
removeAttribute(String s):从session中删除s对应的属性
getId():得到session所对应的id
invalidate():使session立即无效
setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。

4.application

第四个作用域是application,它所在的所有应用程序中都有效,如果不进行手工删除,它们将一直可以使用,也就是当服务器开始到服务器结束的这段时间,application作用域中存储的数据都是有效的,所有用户均可使用。同样,可以通过 setAttribute() 赋值和 getAttribute() 取值。

ServletContext 与application的异同

相同:两者其实是一样的,相当于一个类创建了两个不同名称的变量

servlet中ServletContext就是application对象。

不同:两者的区别就是application用在jsp中,servletContext用在servlet中。application和page request session 都是JSP中的内置对象,在后台用ServletContext存储的属性数据可以用 application对象获得。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Java四大作用域 的相关文章

  • SLF4J - Logback:如何在运行时配置记录器?

    我们在项目中使用 LogBack 我想根据一些数据库值配置记录器 即如果某个数据库值设置为 true 则记录器应同时使用文件和数据库附加程序 如果为 false 则记录器必须仅使用数据库附加程序 我还想保留使用静态最终记录器 因此我不会在每
  • 将用户库添加到 Ant Builder 类路径

    我在为 Eclipse 项目设置 Ant Builder 时遇到问题 我确实在 Eclipse 中将几个第 3 方库配置为用户库 这些库已添加到我的项目的构建路径中 一切正常 我的问题是 如果我想从 Eclipse 使用 Ant Build
  • H2 - 多个应用程序访问同一个 H2 数据库

    我正在使用嵌入式数据库H2在 2 个网络应用程序中说WebApp1 and WebApp2 我运行 WebApp1 并执行一些查询来访问 H2 数据库 同时我运行 WebApp2 但它抛出异常H2 当前已被另一个进程使用 我的需求是 我应该
  • Java:BufferedReader readLine() 中的 IOEXception 有何用途?

    我可以使用 try catch 循环 修复 以下异常 但我无法理解原因 为什么 in readLine 部分会不断引发IOExceptions 抛出此类异常的真正目的是什么 目标可能不仅仅是更多副作用 代码和 IOException jav
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • Spring @Transactional 并发

    class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • 根据结果​​重试方法(而不是异常)

    我有一个具有以下签名的方法 public Optional
  • Spring Data elasticsearch @Query 注解嵌套对象

    我有两节课 Document public class PracticeQuestion private int userId private List
  • 使用JPanel绘制直线并获取点坐标

    我现在完全不知所措 我没有太多用 Java 构建 GUI 我一直在阅读有关 swing 和 JPanel 的所有内容 我认为我想做的事情是可能的 我只是还没有弄清楚how 我正在尝试构建一个 GUI 您可以在其中在某个绘图区域内绘制直线 我
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • 如何根据服务器/环境动态加载服务器配置?

    目前 我设置了 Maven 配置文件 以便能够为不同的环境 开发 演示 暂存 生产等 部署我的项目 并且它工作得很好 但问题是 对于我拥有的每个模块 Web 应用程序 我需要复制 粘贴此配置文件 它们都是属性文件 当我需要更改环境 服务器配
  • 如何避免连续“重置偏移量”和“寻找最新偏移量”?

    我正在尝试遵循本指南 https spark apache org docs latest structed streaming kafka integration html https spark apache org docs late
  • Hive NVL 不适用于列的日期类型 - NullpointerException

    我正在使用 HDFS 上的 MapR Hive 发行版并面临以下问题 如果表的列类型是 日期 类型 则NVL https cwiki apache org confluence display Hive LanguageManual UDF
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • 如何使用SAXReader解析GPX文件?

    我正在尝试解析GPX file http en wikipedia org wiki GPS eXchange Format 我用 JDOM 尝试过 但效果不太好 SAXBuilder builder new SAXBuilder Docu
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • 动态规划之01背包问题(最易理解的讲解)

    01背包问题 是用来介绍动态规划算法最经典的例子 网上关于01背包问题的讲解也很多 我写这篇文章力争做到用最简单的方式 最少的公式把01背包问题讲解透彻 01背包的状态转换方程 f i j Max f i 1 j Wi Pi j gt Wi
  • 使用Qt开发VxWorks应用程序

    使用Qt开发VxWorks应用程序 在嵌入式系统开发中 VxWorks是一款广泛使用的实时操作系统 而Qt则是一款跨平台的GUI开发框架 可以帮助开发者快速创建漂亮的用户界面和交互式应用程序 本文介绍如何使用Qt在VxWorks上开发应用程
  • IEEE latex会议模版中 通讯作者的标注不显示解决方法

    在模版备注里有一段说明 conference papers do not typically use thanks and this command is locked out in conference mode If really ne
  • construct2--仿超级马里奥platform游戏

    construct2作为一个简单的游戏制作工具 能为你们带来制作游戏的快乐 接下来我将讲述一下有关construct中platform游戏的制作 学习platform游戏的制作 我们就可以轻松的做出类似超级马里奥的游戏了 下面我将带来一个制
  • python3callable使用_Python callable()函数用法实例分析

    本文实例讲述了Python callable 函数用法 分享给大家供大家参考 具体如下 python中的内建函数callable 可以检查一个对象是否是可调用的 对于函数 方法 lambda 函数式 类 以及实现了 call 方法的类实例
  • AllenNLP框架学习笔记(数据篇之tokenizers)

    tokenizers是数据模块中的一个子模块 在里面主要包含了token与tokenizer的定义和使用 现在做一个简单的介绍 描述字符串是如何载入到TextFields中的 Token 简单的token抽象 其属性包括文本 偏移量 pos
  • 单链表的原地逆置—适用于O(1)空间复杂度

    单链表的原地逆置 一 代码 二 分析 三 验证 一 代码 先放出代码 注 表尾指针 r 按需设置 在单链表的逆置过程中并不重要 void ReverseList LinkList L LNode r L gt next 建立表尾指针 其实可
  • python中怎样将字符转换成asc编码_Python字符和字符值(ASCII或Unicode码值)转换方法...

    这篇文章主要介绍了Python字符和字符值 ASCII或Unicode码值 转换方法 即把字符串在ASCII值或者Unicode值之间相与转换的方法 需要的朋友可以参考下 目的 将一个字符转化为相应的ASCII或Unicode码 或相反的操
  • 【因果推断与机器学习】Causal Inference:Chapter_4_instrument_variables

    Instrument Variables Introduction 我们在因果识别中的目标是找到一种方法 用可观察的统计关系来表达两个特征之间的因果关系 在许多情况下 我们可以使用图形假设和do calculus来理清我们对统计关系的观察
  • 如何在Linux下配置nginx以及docker环境

    nginx环境的配置 环境准备 编译 php fpm环境的搭建 docker环境的配置 什么是docker 在linux中安装docker nginx环境的配置 环境准备 我这里使用的是 centos7 以下操作都是在这个环境下进行执行的
  • JavaScript 逆向调试常用技巧

    1 断点调试 接下来介绍一个非常重要的功能 断点调试 在调试代码的时候 我们可以在需要的位置上打断点 当对应事件触发时 浏览器就会自动停在断点的位置等待调试 此时我们可以选择单步调试 在面板中观察调用栈 变量值 以更好地追踪对应位置的执行逻
  • 100个python算法超详细讲解:分糖果

    1 问题描述 10个小孩围成一圈分糖果 老师分给第1个小孩10块 第2个小孩2块 第3个小 孩8块 第4个小孩22块 第5个小孩16块 第6个小孩4块 第7个小孩10块 第8个小 孩6块 第9个小孩14块 第10个小孩20块 然后所有的小孩
  • 【AI视野·今日CV 计算机视觉论文速览 第215期】Tue, 8 Jun 2021

    AI视野 今日CS CV 计算机视觉论文速览 Tue 8 Jun 2021 showing first 100 of 133 entries Totally 100 papers 上期速览 更多精彩请移步主页 Daily Computer
  • 一文了解语音合成技术(TTS)

    TTS是Text To Speech的缩写 即 从文本到语音 它将计算机自己产生的 或外部输入的文字信息转变为可以听得懂的 流利的汉语口语 或者其他语言语音 输出的技术 隶属于语音合成 SpeechSynthesis 语音 在人类的发展过程
  • 关于深度残差网络(Deep residual network, ResNet)

    深度残差网络 深度残差网络的设计就是为了克服这种由于网络深度加深而产生的学习效率变低 准确率无法有效提升的问题 也称为网络退化 甚至在一些场景下 网络层数的增加反而会降低正确率 这种本质问题是由于出现了信息丢失而产生的过拟合问题 overf
  • conda --init 问题

    初始化编译软件出现下面问题 vscode Windows Visual Studio 2017 Developer Command Prompt v15 9 45 Copyright c 2017 Microsoft Corporation
  • vue2项目window.open打开一个新窗口刷新总回到首页(重定向页面)

    问题描述 使用window open打开新窗口跳转本系统的某一个页面 如 http 192 168 1 206 9529 previewScreen idx 1653966398075965442 刷新总是回到首页 找了很久也没找到解决办法
  • QLExpression学习使用教程

    文章目录 QLExpress 简介 支持特性 Maven引入 例子github源码 图分解 提示 例子 初次使用 Runner执行器设置 执行器执行命令的设置 支持普通的Java语法执行 运算符支持 运算符分类 示例 部分运算符列举 样例使
  • 远控与文件传输

    由于目前工作用到了win10 win7 ubuntu kali等系统 而且考虑到之后出差或者远程办公等 所以打算用我最新的ipad pro连接计算机 这样尽量减少每次背着电脑和ipad等一堆设备 远控与文件传输 1 局域网下电脑文件互传 2
  • 详解Java四大作用域

    文章目录 四大作用域 1 pageContext 1 1定义 2 request 详解 2 1定义 2 2 request域对象的使用 2 3生命周期 2 4 获取请求头数据 3 session 详解 3 1定义 3 2 获取session