从局部到全局:深入理解Java Web的作用域机制

 前言

Servlet的四个作用域是Page、Request、Session和Application,它们各自具有不同的作用范围、生命周期和用途。

四大作用域

1. Page作用域

作用范围:  

  • 局限于当前JSP页面或Servlet的响应中。
  • 当请求到达时开始,响应结束时销毁。

生命周期

  • 从JSP页面或Servlet的service方法被调用开始,到响应结束并返回给客户端时结束。

作用

  • 主要用于在当前页面或响应中存储和访问数据,这些数据对其他页面或请求不可见。

2. Request作用域

作用范围

  • 覆盖整个请求链,包括请求转发(Forward)和包含(Include)操作。
  • 从客户端发送请求到服务器开始,到服务器处理完请求并返回响应给客户端结束。

生命周期

  • 在service方法调用前由服务器创建,传入service方法。
  • 整个请求结束,request对象的生命周期也随之结束。

作用

  • 用于在多个页面或Servlet之间共享数据,尤其是在请求转发或包含操作中。
  • 常用于存储请求过程中的临时数据,如表单数据或错误信息。

3. Session作用域

作用范围

  • 在浏览器会话期间有效,即从用户打开浏览器访问Web应用到关闭浏览器结束。
  • 可以跨多个请求共享数据。

生命周期

  • 在第一次调用request.getSession()方法时,如果会话不存在,则创建新的会话。
  • 会话结束时(如浏览器关闭、会话超时或服务器强制结束会话),session对象被销毁。

作用

  • 保存用户的会话信息,如用户登录状态、购物车数据等。
  • 允许在用户的整个会话过程中跨多个页面和请求访问和修改数据。

4. Application作用域

作用范围

  • 贯穿整个Web应用,从Web应用启动到停止。
  • 在Web应用的所有用户之间共享数据。

生命周期

  • 当Web应用被加载进容器时创建,代表整个Web应用的application对象。
  • 当服务器关闭或Web应用被移除时,application对象销毁。

作用

  • 存储公共数据,如Web应用的配置信息、计数器等。
  • 允许在Web应用的所有用户之间共享数据,但需注意数据的安全性和隔离性。

总结

作用域作用范围生命周期作用
Page当前JSP页面或Servlet的响应中从请求开始到响应结束在当前页面或响应中存储和访问数据
Request覆盖整个请求链从请求开始到响应结束在多个页面或Servlet之间共享数据
Session浏览器会话期间从会话开始到会话结束保存用户的会话信息,跨多个请求共享数据
Application贯穿整个Web应用从Web应用启动到停止存储公共数据,在Web应用的所有用户之间共享数据

这四个作用域在Servlet和JSP开发中扮演着重要角色,它们提供了在不同范围内共享和访问数据的能力,从而支持构建复杂和动态的Web应用程序。

案例1:使用Session跟踪用户登陆状态

 使用session演示Session作用域的范围

 LoginServlet.java(处理登录逻辑)

import javax.servlet.*;  
import javax.servlet.http.*;  
import java.io.IOException;  public class LoginServlet extends HttpServlet {  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  String username = request.getParameter("username");  String password = request.getParameter("password");  // 这里应该是与数据库验证的逻辑,这里简化为直接判断  if ("admin".equals(username) && "password".equals(password)) {  HttpSession session = request.getSession();  session.setAttribute("userLoggedIn", true);  response.sendRedirect("welcome.jsp");  } else {  response.sendRedirect("login.jsp?error=true");  }  }  
}

welcome.jsp(显示欢迎信息,基于Session状态)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  
<html>  
<head>  <title>Welcome</title>  
</head>  
<body>  
<%  HttpSession session = request.getSession(false);  if (session != null && session.getAttribute("userLoggedIn") != null) {  out.println("<h1>Welcome, User!</h1>");  } else {  response.sendRedirect("login.jsp");  }  
%>  
</body>  
</html>

请注意,这些示例是简化的,并且没有包括完整的错误处理、安全性措施(如密码加密、防止SQL注入等)或更高级的功能。在实际应用中,您应该根据需要进行适当的扩展和增强。

案例2:基于request转发请求案例

当然,我们可以将案例中的重定向(response.sendRedirect())替换为请求转发(RequestDispatcher),这样可以在服务器内部将请求从一个组件(如Servlet)转发到另一个组件(如JSP页面),而不需要客户端(浏览器)发出新的请求。

 SubmitFormServlet.java

import javax.servlet.*;  
import javax.servlet.http.*;  
import java.io.IOException;  public class SubmitFormServlet extends HttpServlet {  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  String name = request.getParameter("name");  String email = request.getParameter("email");  // 将表单数据添加到请求属性中,以便在JSP页面中使用  request.setAttribute("name", name);  request.setAttribute("email", email);  // 请求转发到result.jsp页面  RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp");  dispatcher.forward(request, response);  }  
}

然后,我们需要创建一个result.jsp页面来显示表单提交的结果。

result.jsp

<!DOCTYPE html>  
<html>  
<head>  <title>Form Submission Result</title>  
</head>  
<body>  <h1>Form Submission Result</h1>  <p>Name: ${name}</p>  <p>Email: ${email}</p>  
</body>  
</html>

在这个JSP页面中,我们使用了EL表达式(${name} 和 ${email})来访问在SubmitFormServlet中添加到请求属性中的值。

总结

Servlet的四大作用域是Java Web开发中至关重要的概念,它们分别是页面作用域(PageContext)、请求作用域(Request)、会话作用域(Session)和应用程序作用域(Application)。

  • 页面作用域限定了数据仅在当前JSP页面中有效,适用于页面内的数据共享;
  • 请求作用域则确保数据在一次HTTP请求与响应的周期内可用,常用于请求转发、重定向等场景中的信息传递;
  • 会话作用域跨越了多个请求,用于在用户会话期间保持用户状态和数据,如登录信息、购物车内容等;
  • 应用程序作用域则是全局性的,数据在整个Web应用程序的生命周期内有效,适用于存储全局配置、共享资源等。

  • 这些作用域为开发者提供了灵活的数据管理和共享机制,使得Java Web应用能够更加高效地处理请求、维护用户状态并优化资源利用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32S3的链接大语言模型对话模块

本实物模块从实物外观、模块组成、API申请及功能说明四部分来介绍这款基于ESP32S3的大语言模型对话模块。 1、实物外观 2、模块介绍 本硬件平台主要由三个模块组成&#xff0c;包括MAX9814录音模块、MAX98357音频功放模块和ESP32S3模块。如下图所示。 MAX9814录音模块&#…

C#程序员的堕落从nuget开始:将自己的代码发布到nuget

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

房产销售系统:SpringBoot技术应用案例

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…

伪工厂模式制造敌人

实现效果 1.敌人方实现 敌人代码 using UnityEngine; using UnityEngine.UI;public class EnemyBasics : MonoBehaviour {public int EnemySpeed { get; internal set; }public int EnemyAttackDistance { get; internal set; }public int EnemyChaseDistance { get; interna…

初识 C++ ( 1 )

引言&#xff1a;大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言&#xff0c;而C是面向对象语言&#xff0c;说C和C的区别&#xff0c;也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…

WebGL系列教程九(动画)

目录 1 前言2 绘制立方体并进行纹理映射3 动画思路4 开始绘制4.1 在顶点着色器中声明旋转矩阵4.2 获取旋转矩阵变量并进行赋值4.3 计算角度4.4 每一帧都去绘制4.5 效果4.6 完整代码 5 总结 1 前言 上一篇我们讲了WebGL中的基础语法&#xff0c;现在我们已经讲过了三维物体的绘制…

TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准

随着时序数据库&#xff08;Time Series Database&#xff09;的日益普及&#xff0c;越来越多的工业自动化控制&#xff08;工控&#xff09;人员开始认识到其强大能力。然而&#xff0c;时序数据库在传统实时数据库应用领域&#xff0c;特别是在过程监控层的推广仍面临挑战&a…

【数据结构】排序算法---冒泡排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序&#xff08;英语&#xff1a;Bubble sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

ipython里如何用?快速查阅帮助

1、&#xff1f;用于查询函数帮助文档&#xff0c;??用于查询带源码的帮助文档 ?用于搜索内容&#xff0c;*作为通配符。

C++调用C# DLL之踩坑记录

C是非托管代码&#xff0c;C#则是托管代码&#xff0c;无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术&#xff1a;CLR Interop和COM Interop 后者要将C# 类库注册为COM组件&#xff0c;本文只探讨CLR&#xff0c;要通过C CLR写中间层代码 方式一&…

IDEA 通义灵码 插件使用体验

目录 前言 主要功能 演示代码 解释代码 生成单元测试 生成代码注释 生成优化建议 代码片段补全 总结 前言 自从 AI 技术开始大规模应用&#xff0c;老板就想让下面的牛马借助 AI 工具来提高编码效率&#xff0c;由于团队都没有在实际编码中深度使用过 AI 工具&#x…

Miracast/WifiDisplay开发相关的深入调研分析-android投屏实战开发

Miracast/WifiDisplay概念介绍 Miracast Miracast是由Wi-Fi联盟于2012年所制定&#xff0c;以Wi-Fi直连&#xff08;Wi-Fi Direct&#xff09;为基础的无线显示标准。支持此标准的消费性电子产品&#xff08;又称3C设备&#xff09;可透过无线方式分享视频画面&#xff0c;例如…

VirtualBox 克隆已有的虚拟机

【前提】已经存在一个CentOS 7 虚拟机 【需求】克隆出来一个虚拟机,用于本机 【操作】 1.右击已有的虚拟机 -> 选择克隆 2.给新虚拟机起个名称 以及 生成新的MAC地址 3.克隆 4.修改网络和主机名称 # 修改网络编辑以下2个文件 vi /etc/sysconfig/network-scripts/ifcfg-enp…

Java之内部类

目录 实例内部类 静态内部类 局部内部类 匿名内部类 下面将讲解实例内部类&#xff0c;静态内部类&#xff0c;局部内部类和匿名内部类。 实例内部类 实例内部类&#xff08;也称为非静态内部类&#xff09;依赖于外部类的实例。这意味着&#xff0c;要创建实例内部类的实…

Kubernetes从零到精通(12-Ingress、Gateway API)

Ingress和Gateway API都是Kubernetes中用于管理外部访问集群服务的机制&#xff0c;但它们有不同的设计理念和适用场景。它们的基本原理是通过配置规则&#xff0c;将来自外部的网络流量路由到Kubernetes集群内部的服务上。 Ingress/Gateway API和Service Ingress/Gateway API…

Qt窗口——QToolBar

文章目录 工具栏创建工具栏设置toolTip工具栏配合菜单栏工具栏浮动状态 工具栏 QToolBar工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。 可以有多个&#xff0c;也可以没有。 创建工具栏 #include "mainwindow.h" #include "ui_mainwindow.h&qu…

ARM 工业边缘计算机与 C# 编程的完美融合

在工业领域&#xff0c;随着智能化和数字化的不断推进&#xff0c;ARM 工业边缘计算机凭借其出色的性能和低功耗等优势&#xff0c;逐渐成为众多应用场景的重要支撑。而 C# 编程语言的强大功能和广泛适用性&#xff0c;使其在与 ARM 工业边缘计算机的结合中展现出了巨大的潜力。…