JavaWeb-ServletContext应用域接口
文章目录
- ServletContext接口简介
- 获取一个ServletContext对象
- ServletContext接口中的相关方法
- 获取应用域配置参数
- 关于应用域参数的配置要求
- getContextPath获取项目路径
- getRealPath获取真实路径
- log系列方法添加相关日志
- 增删查应用域属性
ServletContext接口简介
ServletContext接口和Servlet和ServletConfig接口一样, 都是位于jakarta.servlet这个包下的接口, 其中Servlet接口的实现对象, 代表着提供服务的类的对象, ServletConfig接口对应的相应的Servlet对象的一些配置信息(位于web.xml文件下的servlet标签中的信息)
ServletContext 对象, 代表的是应用域 信息,
每一个webapp项目, 有且仅有一个ServletContext对象
关于上面三个接口之间的关系, 我想我们可以通过下面的视图来简单描述一下

学校与班级的例子:
对于一个Tomcat服务器(Servlet容器)来说, 相当于一个学校, 其中管理许多不同的webapp我们类比为班级, 每个班级的相关规定所对应的对象, 也就是ServletContext对象, 他对班级中的所有对象都生效, 也就是应用域的概念, 班里有许多的同学, 这些对象我们称之为一个个的Servlet对象, 每一个同学都对应一个独属于自己的信息对象, 也就是ServletConfig对象, 通过这样的类比, 我们对这三个接口所对应的对象的体会应该就更深了…
获取一个ServletContext对象
上一节我们说了, ServletConfig接口中有一个getServletContext方法, 这个方法就是返回一个ServletContext对象, 下面是代码信息
// 获取一个 ServletContext 对象// 第一种方法是通过 this.ServletConfig 获取 ServletConfig 对象, // 然后再通过这个对象中的 getServletContext 获取到...ServletContext servletContext = this.getServletConfig().getServletContext();// 第二种方法是直接通过 this.getServletContext 直接获得(底层和上面的机制一样)ServletContext servletContext1 = this.getServletContext();
我们输出一下关于实现ServletContext接口的类的信息


其实查看相关源码就可以发现, 这个类其中存在的许多map的结构(好多保存的就是关于全局的映射信息)
ServletContext接口中的相关方法
我们这个章节只简单介绍其中的部分方法, 大多数方法我们下面的章节会介绍
获取应用域配置参数
以下的方法和ServletConfig中的功能是一样的, 我们不再多说

下面是我们的全局配置, 全局配置对所有的Servlet对象都可见

执行下面的代码逻辑, 获得web.xml中的关于全局配置的相关信息
response.setContentType("text/html");PrintWriter out = response.getWriter();// 获取全局配置的参数(和ServletConfig中的方法意义是一样的)ServletContext application = this.getServletContext();// 获得全局的配置集合名称(name)Enumeration<String> initParameterNames = application.getInitParameterNames();while (initParameterNames.hasMoreElements()) {// 获得nameString initParameterName = initParameterNames.nextElement();// 获得valueString initParameterValue = application.getInitParameter(initParameterName);out.print("<h1>" + initParameterName + " : " + initParameterValue + "</h1>");out.print("<br/>");}
在浏览器上获得信息如下

关于应用域参数的配置要求
- 共享 : 最基本的要求, 只有需要共享的内容才建议放到应用域配置文件中
- 小 & 少 : 只有数据量小的数据才建议放到应用域中配置, 因为应用域参数相当于一种缓存机制, 如果大量的内容都在应用域会增加系统对相关参数的处理负担
- 不修改 & 很少修改: 因为是全局的变量配置, 就必然存在并发修改的线程安全问题, 所以我们存放在应用域的参数应该不修改或者很少修改以减少并发造成的线程安全问题
getContextPath获取项目路径

下面是项目配置的路径

我们使用getContextPath获取项目配置的路径
执行下面的逻辑
response.setContentType("text/html");PrintWriter out = response.getWriter();// 在idea中, 我们的项目路径是自己配置在 Tomcat 服务器上面的, 所以我们要是想要获取真实的项目路径根目录// 可以通过 getContextPath 方法获得ServletContext application = this.getServletContext();String contextPath = application.getContextPath();out.print("<h1>" + contextPath + "</h1>");
输出结果

getRealPath获取真实路径

通过一个方法getRealPath可以查看文件的真实的路径(根节点是web目录)
我们在web目录下创建一个文件如下

我们执行下面的代码逻辑
response.setContentType("text/html");PrintWriter out = response.getWriter();// 使用getRealPath获取文件的真实路径(以web文件为根路径)ServletContext application = this.getServletConfig().getServletContext();// 传递一个字符串, 获取这个字符串所对应的项目的真实的路径(以 / 开头代表 web 这个文件的根路径)String realPath = application.getRealPath("/path.html");out.println(realPath);
在浏览器中输出的内容如下

这个就是我们path.html文件在该计算机上真实存储的文件的路径
log系列方法添加相关日志

关于日志的存储位置
在先前的章节中, 我们介绍了在 Tomcat服务器的根节点 有一个logs 目录文件

这个是正常情况下,
我们不使用 idea 开发工具, 使用最原始的开发方式(之前有介绍), 创建的项目生成的日志就会存放到这个位置
但是使用 idea 创建项目的目录文件不在 Tomcat服务器 这些目录下, 实际上是通过某些方式对项目进行托管…(启动Tomcat的时候会有相关路径信息
启动Tomcat
观察日志信息如下, 我们发现这才是真实的日志等项目信息的托管路径

打开这个地址查看

观察日志信息分为三种

catalina日志: 在控制台上输出的日志信息(比如我们启动Tomcat控制台上加载的相关配置信息localhost日志: 通过ServletContext对象的log方法生成的日志信息localhost_access_log: 浏览器访问服务器的相关日志信息
上面我们了解到, 只有localhost日志才是通过log方法 生成的日志, 所以我们执行下面的代码逻辑生成日志 简单测试一下
// 测试使用 log 方法生成日志信息ServletContext application = this.getServletConfig().getServletContext();application.log("关于日志的测试信息");application.log("关于日志抛出异常的测试信息", new RuntimeException("抛出一个异常"));

可以查看在指定目录下已经生成了相关的日志信息…
而且, 我们刚才抛出一个异常, 但是Tomcat服务器并没有因为抛出异常而终止…

增删查应用域属性


执行下面的代码逻辑
response.setContentType("text/html");PrintWriter out = response.getWriter();// 增删改 相关的应用域属性ServletContext application = this.getServletConfig().getServletContext();// 1. 增加应用域属性application.setAttribute("test_name", "huahua");application.setAttribute("test_age", 18);// 2. 获取应用域属性(两种方法)out.print(application.getAttribute("test_name") + " = " +application.getAttribute("test_age"));out.print("<br/>");Enumeration<String> attributeNames = application.getAttributeNames();while (attributeNames.hasMoreElements()) {String attributeName = attributeNames.nextElement();out.print(attributeName + " = " + application.getAttribute(attributeName));out.print("<br/>");}// 3. 删除应用域属性application.removeAttribute("test_name");// 4. 简单测试一下还有没有 test_name 属性Object name = application.getAttribute("test_name");out.print("test_name = " + name);
即可分析出应用域的成分都是什么, 如果在该webapp 的其他类中访问 应用域参数 也会访问成功, 因为应用域的作用范围是全局的…
相关文章:
JavaWeb-ServletContext应用域接口
文章目录 ServletContext接口简介获取一个ServletContext对象ServletContext接口中的相关方法获取应用域配置参数关于应用域参数的配置要求getContextPath获取项目路径getRealPath获取真实路径log系列方法添加相关日志增删查应用域属性 ServletContext接口简介 ServletContext…...
为什么@Autowired 在属性上被警告,在 setter 方法上不被警告
在 Spring 开发中,Autowired 注解常用于实现依赖注入。它可以应用于类的 属性、构造器 或 setter 方法 上。然而,当 Autowired 注解在 属性 上使用时,IntelliJ IDEA 等 IDE 会给出 Field injection is not recommended 的警告,而在…...
SQL命令详解之操作数据表
操作数据表 操作数据表是数据库管理系统中用于存储、管理和操作数据的核心结构。数据表通常由行和列组成,每一列代表一种数据类型(例如,整数、字符、日期等),而每一行代表一条记录(即数据项&a…...
Linux 下使用tracepath进行网络诊断分析
简介 tracepath 命令是 Linux 中的一个网络诊断工具,类似于 traceroute ,但专门用于跟踪到目标主机的网络路径,同时自动处理路径MTU发现。这是一种简单的方法,可以找出机器和远程目的地之间的跃点,同时还可以识别沿途…...
四、表关系与复杂查询
一、表关系设计与约束 1. 表关系类型与实现 关系类型实现方式示例场景一对一共享主键 或 外键唯一约束用户 ↔ 用户详细信息一对多外键约束部门 ↔ 员工多对多中间表 联合主键学生 ↔ 课程 2. 核心约束类型 -- 完整表创建示例(含约束) CREATE TABLE…...
Qt 中,**信号与槽(Signals Slots)机制
在 Qt 中,信号与槽(Signals & Slots)机制 是实现对象间通信的核心模式,通常也被视为一种高效的“通知者模式”。它允许对象在特定事件发生时通知其他对象,且完全解耦。 核心概念 信号(Signal࿰…...
Javaweb后端数据库多表关系一对多,外键,一对一
多表关系 一对多 多的表里,要有一表里的主键 外键 多的表上,添加外键 一对一 多对多 案例...
使用Apache Lucene构建高效的全文搜索服务
使用Apache Lucene构建高效的全文搜索服务 在现代应用程序中,全文搜索功能是不可或缺的一部分。无论是电子商务网站、内容管理系统,还是数据分析平台,快速、准确地搜索大量数据是提升用户体验的关键。Apache Lucene 是一个强大的全文搜索引擎…...
VScode在Windows11中配置MSVC
因为MSVC编译器在vs当中,所以我们首先要安装vs的一部分组件。如果只是需要MSVC的话,工作负荷一个都不需要勾选,在单个组件里面搜索MSVC和windows11 SDK,其中一个是编译器,一个是头文件然后右下角安装即可。搜索Develop…...
【洛谷贪心算法题】P2240部分背包问题
【解题思路】 贪心策略选择 对于部分背包问题,关键在于如何选择物品放入背包以达到最大价值。由于物品可以分割,遍历排序后的物品数组,根据物品重量和背包剩余容量的关系,决定是将整个物品放入背包还是分割物品放入背包ÿ…...
DevOps原理和实现面试题及参考答案
解释 DevOps 的核心目标与文化价值观,如何理解 “CAMS” 模型? DevOps 的核心目标是打破开发(Development)和运维(Operations)之间的壁垒,通过自动化、协作和持续反馈,实现软件的快速、可靠交付,以更好地满足业务需求和客户期望。具体来说,DevOps 旨在缩短软件的交付…...
《Somewhat Practical Fully Homomorphic Encryption》笔记 (BFV 源于这篇文章)
文章目录 一、摘要二、引言1、FHE 一般分为三个逻辑部分2、噪声的管理3. 贡献点4. 文章思路 三、基础数学知识四、基于 RLWE 的加密1. LWE 问题2. RLWE 问题3. RLWE 问题的难度和安全性 五、加密方案1. LPR.ES 加密方案2. Lemma 1 (引理 1)3. Optimisation/Assumption 1 (优化/…...
SpringBoot 2 后端通用开发模板搭建(异常处理,请求响应)
目录 一、环境准备 二、新建项目 三、整合依赖 1、MyBatis Plus 数据库操作 2、Hutool 工具库 3、Knife4j 接口文档 4、其他依赖 四、通用基础代码 1、自定义异常 2、响应包装类 3、全局异常处理器 4、请求包装类 5、全局跨域配置 补充:设置新建类/接…...
DeepSeek本地部署与Dify结合创建私有知识库指南
python调用本地deepseek+Dify的API使用--测试WX自动发送信息-CSDN博客 DeepSeek,一家在人工智能领域具有显著技术实力的公司,凭借其千亿参数规模的AI大模型,以及仅需0.5元人民币即可进行百万tokens的API调用成本,已经取得了令人瞩目的成就。不仅如此,DeepSeek的模…...
Nginx 报错:413 Request Entity Too Large
做web开发时,对于上传附件的功能,如果nginx没有调整配置,上传大一点的文件就会发生下面这种错误: 要解决上面的问题,只需要调整Nginx配置文件中的 client_max_body_size 参数即可,这个配置参数一般在http配…...
Arduino项目实战:使用MQ-2气体传感器与OLED屏幕监测环境气体
概述 在这个项目中,MQ-2气体传感器是一个多功能的气体检测设备,能够感知多种常见气体,如甲烷、丁烷、丙烷、酒精和烟雾等。你可以把它想象成一个超级灵敏的“嗅觉”,能够帮助你实时检测环境中的各种有害气体。与Arduino板连接后,MQ-2传感器把捕捉到的气体浓度数据传送给A…...
泛微Ecode新增Button调用服务器中的JSP页面里的方法
前言 前端Ecode调用 后端接口编写 JSP文件方法 总结 前言 因为我们是从之前E8版本升级到E9的,所以会有一些接口是通过jsp文件来实现前后端调用的,这里介绍的就是如果你有接口是写在jsp文件里面调用的,但是你又想在Ecode中调用的对应的接…...
C#实现本地Deepseek模型及其他模型的对话
前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址: https://ollama.org.cn Ollama模型下载地址…...
【ESP32S3接入讯飞在线语音识别】
视频地址: 【ESP32S3接入讯飞在线语音识别】 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入讯飞实现在线语音识别。自带麦克风模块用做语音输入,通过串口发送字符“1”来控制数据的采集和上传。 语音识别对比 平台api教程评分百度...
【51单片机】快速入门
动手实践 > 理论空谈!从点亮LED开始,逐步扩展功能,2周可入门基础。 一、51单片机基础概念 什么是51单片机? 基于Intel 8051架构的8位微控制器,广泛用于嵌入式开发。 核心特性:4KB ROM、128B RAM、32个…...
leetcode707----设计链表【链表增删改打印等操作】
目录 一、题目介绍 二、单链表 2.1 创建链表类 2.1.1 定义链表节点结构体代码块 2.1.2 MyLinkedList类的构造函数 2.1.3 私有成员变量 2.2 接口1:获取第下标为index的节点的值 2.3 接口2:头部插入节点 2.4 接口3:尾部插入节点 2.5 接…...
【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝
【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝 问题展示解决办法 问题展示 在使用docker中的consul服务的时候,通过命令行注册相应的服务(比如cloudwego项目的demo_proto以及user服务)失败。 解决办法 经过分析,是…...
【缓存】缓存雪崩与缓存穿透:高并发系统的隐形杀手
缓存雪崩与缓存穿透:高并发系统的隐形杀手 在高并发系统中,缓存是提升性能的重要手段。然而,缓存使用不当也会带来一系列问题,其中最常见的就是缓存雪崩和缓存穿透。这两个问题如果不加以解决,可能会导致系统崩溃&…...
网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…...
DeepSeek实现FunctionCalling调用API查询天气
什么是FunctionCalling Function Calling(函数调用)是大型语言模型(如 OpenAI 的 GPT 系列)提供的一种能力,允许模型在生成文本的过程中调用外部函数或工具,以完成更复杂的任务。通过 Function Calling&am…...
从 Spring Boot 2 升级到 Spring Boot 3 的终极指南
一、升级前的核心准备 1. JDK 版本升级 Spring Boot 3 强制要求 Java 17 及以上版本。若当前项目使用 Java 8 或 11,需按以下步骤操作: 安装 JDK 17:从 Oracle 或 OpenJDK 官网下载,配置环境变量(如 JAVA_HOME&…...
C#设计模式深度解析:经典实现与现代演进 ——基于《设计模式》的.NET技术实践
一、设计模式与C#语言特性融合 C#凭借其面向对象特性、泛型、委托/事件、LINQ等能力,为设计模式提供了更优雅的实现方式。以下通过典型模式展现其技术融合: 1. 工厂方法模式 泛型约束 public interface IProduct<T> where T : new() {void O…...
原子性(Atomicity)和一致性(Consistency)的区别?
原子性(Atomicity)和一致性(Consistency)是数据库事务ACID特性中的两个核心概念,虽然它们密切相关,但解决的问题和侧重点完全不同。原子性关注事务的操作完整性,而一致性关注数据的逻辑正确性。…...
windows设置暂停更新时长
windows设置暂停更新时长 win11与win10修改注册表操作一致 ,系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值,名称为FlightSettingsMaxPauseDays 根据需求填写数…...
【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费
【Kimi】免费生成PPT并免费下载 用了好几个大模型,有些能生成PPT内容; 有些能生成PPT,但下载需要付费; 目前只有Kimi生成的PPT,能选择模板、能在线编辑、能下载,关键全部免费! 一、用kimi生成PP…...
