JavaWeb-ServletContext应用域接口

ops/2025/2/28 3:10:30/

文章目录

  • 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对象, 下面是代码信息

java">		// 获取一个 ServletContext 对象// 第一种方法是通过 this.ServletConfig 获取 ServletConfig 对象, // 然后再通过这个对象中的 getServletContext 获取到...ServletContext servletContext = this.getServletConfig().getServletContext();// 第二种方法是直接通过 this.getServletContext 直接获得(底层和上面的机制一样)ServletContext servletContext1 = this.getServletContext();

我们输出一下关于实现ServletContext接口的类的信息

在这里插入图片描述

其实查看相关源码就可以发现, 这个类其中存在的许多map的结构(好多保存的就是关于全局的映射信息)

ServletContext接口中的相关方法

我们这个章节只简单介绍其中的部分方法, 大多数方法我们下面的章节会介绍

获取应用域配置参数

以下的方法和ServletConfig中的功能是一样的, 我们不再多说

在这里插入图片描述

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

在这里插入图片描述

执行下面的代码逻辑, 获得web.xml中的关于全局配置的相关信息

java"> 		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获取项目配置的路径
执行下面的逻辑

java">		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目录下创建一个文件如下

在这里插入图片描述

我们执行下面的代码逻辑

java">		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方法 生成的日志, 所以我们执行下面的代码逻辑生成日志 简单测试一下

java">		// 测试使用 log 方法生成日志信息ServletContext application = this.getServletConfig().getServletContext();application.log("关于日志的测试信息");application.log("关于日志抛出异常的测试信息", new RuntimeException("抛出一个异常"));

在这里插入图片描述

可以查看在指定目录下已经生成了相关的日志信息…

而且, 我们刚才抛出一个异常, 但是Tomcat服务器并没有因为抛出异常而终止…

在这里插入图片描述


增删查应用域属性

在这里插入图片描述

在这里插入图片描述

执行下面的代码逻辑

java">		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 的其他类中访问 应用域参数 也会访问成功, 因为应用域的作用范围是全局的…


http://www.ppmy.cn/ops/161839.html

相关文章

C语言【指针篇】(三)

C语言【指针篇】&#xff08;三&#xff09; 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握&#xff0c;进一步学习&#xff1a;数组名的理解、使用指针…

分布式服务注册与发现

目录 核心概念 常见实现方式 常见工具与框架 优点 挑战 应用场景 总结 分布式服务注册与发现是微服务架构中的关键组件,用于动态管理服务的注册、发现和调用。它帮助服务在分布式环境中自动找到彼此,确保系统的高可用性和可扩展性。 核心概念 服务注册: 服务启动时向…

服务器间迁移conda环境

注意&#xff1a;可使用迁移miniconda文件 or 迁移yaml文件两种方式&#xff0c;推荐前者&#xff0c;基本无bug&#xff01; 一、迁移miniconda文件&#xff1a; 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…

Qt——使用QtConcurrent::run开启的线程,程序退出后仍在后台运行的解决方法(QFutureWatcher监视线程)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实

物联网通信应用案例之《智慧农业》

案例概述 在智慧农业方面&#xff0c;一般的应用场景为可以自动检测温度湿度等一系列环境情况并且可以自动做出相应的处理措施如简单的浇水和温度控制等&#xff0c;且数据情况可远程查看&#xff0c;以及用户可以实现远程控制。 基本实现原理 传感器通过串口将数据传递到Wi…

【数据处理】COCO 数据集掩码 Run-Length Encoding (RLE) 编码转二进制掩码

输入&#xff1a;结果.json 输出&#xff1a;mask.jpg json内容示例如下&#xff1a; {"labels":[ # class_id 1,2,3,...],"scores":[ # 置信度0.2,0.7,0.3,...],"bboxes":[[1244.0,161.0,1335.0,178.0],[1243.0,161.0,1336.0,178.0],[1242.0,1…

线性回归(一)基于Scikit-Learn的简单线性回归

主要参考学习资料&#xff1a; 《机器学习算法的数学解析与Python实现》莫凡 著 前置知识&#xff1a;线性代数-Python 目录 问题背景数学模型假设函数损失函数优化方法训练步骤 代码实现特点 问题背景 回归问题是一类预测连续值的问题&#xff0c;满足这样要求的数学模型称作…

HW面试经验分享 | 北京蓝中研判岗

目录&#xff1a; 所面试的公司介绍 面试官的问题&#xff1a; 1、面试官先就是很常态化的让我做了一个自我介绍 2、自我介绍不错&#xff0c;听你讲熟悉TOP10漏洞&#xff0c;可以讲下自己熟悉哪些方面吗&#xff1f; 3、sql注入原理可以讲下吗&#xff1f; 4、sql注入绕WAF有…