ServletContext介绍

news2024/11/23 19:15:17

文章目录

  • 1、ServletContext对象介绍
    • 1_方法介绍
    • 2_用例分析
  • 2、ServletContainerInitializer
    • 1_整体结构
    • 2_工作原理
    • 3_使用案例
  • 3、Spring案例源码分析
    • 1_注册DispatcherServlet
    • 2_注册配置类
    • 3_SpringServletContainerInitializer
  • 4_总结


ServletContext 表示上下文对象,属于接口,代表整个 Web 项目,可以使用定义的方法与 S e r v l e t Servlet Servlet容器进行通信。例如,获取文件的MIME类型、分发请求或写入日志文件。

能够共享数据的对象:

  1. request:只能在一次请求一次响应中进行数据的共享 ===》请求转发
  2. session:只能在一次会话过程中,可以有多次请求和响应
  3. ServletContext:只要项目存在就可以共享数据,多次会话,多次请求和响应都可以共享数据:操作整个项目的配置文件

范围大小ServletContext > session > request


1、ServletContext对象介绍


t o m c a t tomcat tomcat 服务器启动的时候,会为每个 Web 项目创建一个唯一的 S e r v l e t C o n t e x t ServletContext ServletContext 对象,该对象代表当前整个 Web 应用项目。

该对象不仅封装了当前 Web 应用的所有信息,而且实现了多个 s e r v l e t servlet servlet 的数据共享。

S e r v l e t C o n t e x t ServletContext ServletContext 中可以存放共享数据, S e r v l e t C o n t e x t ServletContext ServletContext 对象是真正的一个全局对象,凡是 Web 容器中的 S e r v l e t Servlet Servlet 都可以访问。

在每个项目中可以有多个 S e r v l e t Servlet Servlet 程序,每个 S e r v l e t Servlet Servlet 程序都是独立的。当前这个项目的配置信息,必须使用描述这个项目的 S e r v l e t C o n t e x t ServletContext ServletContext 对象获取。


1_方法介绍

在这里插入图片描述

方法名描述
setAttribute(String name, Object object) S e r v l e t C o n t e x t ServletContext ServletContext中存数据
getAttribute(String name) S e r v l e t C o n t e x t ServletContext ServletContext中取数据
removeAttribute(name) S e r v l e t C o n t e x t ServletContext ServletContext中移除数据
String getRealPath(String path)返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)
getMimeType(fileName)获取服务器中文件类型.txt text/plain .html text/html
getResourceAsStream(String path)获取某个资源的输入流
getRequestDispatcher(String path)返回一个 RequestDispatcher 对象,
可以使用它将请求转发到指定资源,或者在响应中包含资源。

S e r v l e t C o n t e x t ServletContext ServletContext 对象: t o m c a t tomcat tomcat为每一个 Web 项目单独创建的一个上下文(知上知下贯穿全文)对象。有如下功能:

  1. 可以在多个 s e r v l e t servlet servlet 之间共享数据

    • 存放:setAttribute()

    • 获得:getAttribute()

    • 删除:removeAttribute()

  2. 可以获得当前 Web 项目中的指定资源(文件)

    String path = getRealPath( String string);
    
  3. 将请求从一个 s e r v l e t servlet servlet 转发到服务器上的另一个资源。

    RequestDispatcher requestDispatcher = getRequestDispatcher("/1.jpg");
    requestDispatcher.forward(req,res);
    
  4. 将指定资源的内容包含到当前的响应中。

    requestDispatcher.include(req,res);
    
  5. 读取 Web 应用中的资源文件

    InputStream resourceStream = context.getResourceAsStream("/WEB-INF/config.properties");
    

S e r v l e t C o n t e x t ServletContext ServletContext 还提供了如下方法动态注册 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener以及及初始化参数信息:

方法名描述
addServlet(String servletName, Servlet servlet)动态注册 S e r v l e t Servlet Servlet
addFilter(String filterName, Filter filter)动态注册 F i l t e r Filter Filter
addListener(String className)动态注册 L i s t e n e r Listener Listener
setInitParameter(String name, String value)Web 应用设置初始化参数。

2_用例分析

需求1:如何获取上下文 S e r v l e t C o n t e x t ServletContext ServletContext 对象。

  • 使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
  • 通过实现 ServletContextListener 来获取(详见监听器博文)。

代码如下:

/*
    获取上下文ServletContext对象:
    使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();
*/
ServletContext servletContext = getServletContext();

需求2:如何获取服务器中每个文件的路径 ?例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。

@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        //如何获取服务器中每个文件的路径。
        // 例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。
        String realPath = servletContext.getRealPath("/1.jpg");
        /*
            输出结果:
            realPath = 	E:\WorkAndClass\maven_war_pro\src\main\webapp\1.jpg
            说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。
            所以这里获取的真实路径是这个war包下的1.jpg所在的路径。
         */
        System.out.println("realPath = " + realPath);
    }
}

需求3:获取当前项目下的1.jpg在服务器中的文件类型。

/*
    需求3:获取当前项目下的1.jpg在服务器中的文件类型。
    getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可
*/
String mimeType = servletContext.getMimeType("1.jpg");
System.out.println("mimeType = " + mimeType);//mimeType = image/jpeg

需求4:请求转发,将发往ServletContextDemoServlet的请求转发到MyServlet中。

RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/MyServlet");
requestDispatcher.forward(request, response);

注意:对于方法 getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可


2、ServletContainerInitializer


S e r v l e t 3.0 Servlet 3.0 Servlet3.0 规范中,ServletContainerInitializer 接口被引入,用于替代传统的 web.xml 配置方式,允许开发者在 S e r v l e t Servlet Servlet 容器启动时动态地进行 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener 的注册与初始化配置。

这种通过编程来实现应用初始化过程的方式具有很大的灵活性,尤其是在现代基于注解和 Java 配置的 Web 应用中,减少了对 web.xml 配置文件的依赖,提供了更强的动态配置能力。


1_整体结构

该接口只有一个方法:

public interface ServletContainerInitializer {
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}
  • Set<Class<?>> c:此参数表示与当前 Web 应用相关联的所有类。

    通常,这些类会通过类路径扫描来识别。

    开发者可以利用这个参数进行自定义的初始化逻辑,比如扫描特定的注解。

  • ServletContext ctx:这是 S e r v l e t C o n t e x t ServletContext ServletContext 对象,不再重复介绍。


2_工作原理

ServletContainerInitializer 接口通过反射机制(SPI机制)在 Web 容器启动时进行实例化。

Web 容器(如 T o m c a t Tomcat Tomcat)启动时,它会扫描所有部署的应用程序,查找是否有 META-INF/services/javax.servlet.ServletContainerInitializer 文件,该文件中会包含一个实现类的全限定名。

如果这个文件存在,Web 容器启动时会加载其中列出的所有 ServletContainerInitializer 实现类,并调用它们的 onStartup() 方法来初始化 Web 应用。

onStartup() 方法中,可以通过 S e r v l e t C o n t e x t ServletContext ServletContext 来进行 S e r v l e t Servlet Servlet F i l t e r Filter Filter L i s t e n e r Listener Listener 等组件的注册。


3_使用案例

1、编写 ServletContainerInitializer 实现类

package com.example.sh;

import javax.servlet.*;
import java.util.EnumSet;
import java.util.Set;

public class MyServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        // 通过 ServletContext 注册 Servlet
        ServletRegistration.Dynamic myServlet = ctx.addServlet("myServlet", MyServlet.class);
        // 大于0时web容器启动时立即创建
        myServlet.setLoadOnStartup(1);
        // servlet映射路径
        myServlet.addMapping("/myServlet");

        // 通过 ServletContext 注册 Filter
        FilterRegistration.Dynamic myFilter = ctx.addFilter("myFilter", MyFilter.class);
        //REQUEST请求类型 除此之外还有 异步、转发等。。
        myFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");

        // 通过 ServletContext 注册 Listener
        ctx.addListener(MyListener.class);

        // 设置 Web 应用的初始化参数
        ctx.setInitParameter("appVersion", "1.0");
    }
}

2、注册 ServletContainerInitializer 实现类

META-INF/services/javax.servlet.ServletContainerInitializer 文件中添加如下内容:

com.example.sh.MyServletContainerInitializer

3、Spring案例源码分析


在一个典型的 S p r i n g Spring Spring MVC 应用中, S e r v l e t C o n t e x t ServletContext ServletContext 是一个重要的组件,它代表 Web 应用的上下文,提供了访问应用范围内资源和配置的能力。

DispatcherServlet S p r i n g Spring Spring MVC 的前端控制器,处理所有传入的 HTTP 请求,并负责将请求委派给适当的控制器方法。

在这个过程中, S e r v l e t C o n t e x t ServletContext ServletContext 作为 S p r i n g Spring Spring 容器的核心之一,起到了协调和管理作用。


1_注册DispatcherServlet

S e r v l e t Servlet Servlet容器配置类的继承类 AbstractDispatcherServletInitializer 中也有与ServletContainerInitializer中同名的方法onStartup():

public static final String DEFAULT_SERVLET_NAME = "dispatcher";
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
	super.onStartup(servletContext);
	registerDispatcherServlet(servletContext);
}

onStartup()中调用了registerDispatcherServlet方法,从方法名就可以看出,这个方法是用于注册 DispatcherServlet 的方法:

在这里插入图片描述


2_注册配置类

ServletContainerInitializer 的实现类需要通过配置文件来获取类的全限定名进行注册,这在 S p r i n g Spring Spring MVC 中也是一样的。

首先,我们看一下AbstractDispatcherServletInitializer的继承结构:

在这里插入图片描述

发现顶级父类是 WebApplicationInitializer 接口:

package org.springframework.web;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;

public interface WebApplicationInitializer {
    void onStartup(ServletContext servletContext) throws ServletException;
}

在此接口相关的 jar 包中就可以发现对应的配置文件了,如下图(我的版本较高, S e r v l e t 5.0 Servlet5.0 Servlet5.0 以后把javax.servlet包名改成了jakarta.servlet,所以名称会略有差别):

在这里插入图片描述

文件内容如下:

org.springframework.web.SpringServletContainerInitializer

在这里插入图片描述


3_SpringServletContainerInitializer

经过上述分析,最终找到了一个以 S p r i n g Spring Spring 开头的配置类,那么这个类的作用是什么呢?先看结构:

@HandlesTypes(WebApplicationInitializer.class)//容器可以在启动时扫描并收集所有实现了 WebApplicationInitializer 接口的类
public class SpringServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
		//略
    }

}

可以看到最重要的一点:它实现了 ServletContainerInitializer 接口,并将自己注册到了配置文件中去。

在这里插入图片描述

因此,在 Web 容器启动时,SpringServletContainerInitializer 会自动调用onStartup方法配置 S p r i n g Spring SpringWeb 环境。

在这里插入图片描述

除了配置 DispatcherServlet 外,它其实还会注册 ContextLoaderListener,用于加载 S p r i n g Spring Spring 的根应用上下文。


4_总结


S e r v l e t C o n t e x t ServletContext ServletContext 表示上下文对象,代表整个web项目, t o m c a t tomcat tomcat 一启动就会创建该接口对象,关闭 t o m c a t tomcat tomcat 就会消失

S e r v l e t C o n t e x t ServletContext ServletContext 属于对象,多次会话,多次请求限制,三个域对象范围:ServletContext > HttpSession > HttpServletRequest

S e r v l e t C o n t e x t ServletContext ServletContext 其他作用:

  • 获取文件真实路径:String getRealPath(String path) 参数 path 如果书写的是相对路径相对的是webapp

  • 获取文件的MIME类型:String getMimeType(String file) 参数 file 只书写文件名 + 后缀名即可,不会判断是否存在。

  • 获取请求分发对象:RequestDispatcher getRequestDispatcher(String path) 参数 path 书写的是资源路径。

  • 动态注册 Web 组件。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的硬盘管理

硬盘有价&#xff0c;数据无价 1. 硬盘的概念 硬盘是一种计算机的存储设备&#xff0c;通常是由一个或者多个磁性盘片组成。硬盘即可以安装在计算机的内部&#xff0c;也可以外接计算机。 保存数据 数据&#xff1a;操作系统&#xff0c;应用程序&#xff0c;文档多媒体文件…

云渲染与汽车CGI图像技术优势和劣势

在数字时代&#xff0c;云渲染技术以其独特的优势在汽车CGI图像制作中占据了重要地位。云渲染通过利用云计算的分布式处理能力&#xff0c;将渲染任务分配给云端的服务器集群进行计算&#xff0c;从而实现高效、高质量的渲染效果。 这种技术的优势主要体现在以下几个方面&#…

鸿蒙NEXT开发-学生管理系统小案例(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

《潜行者2切尔诺贝利之心》游戏引擎介绍

潜行者2切尔诺贝利之心是基于虚幻5引擎&#xff0c;所以画面效果大家不必担心。游戏目前已经跳票了很久&#xff0c;预计发售时间是2024 年 11 月 21 日&#xff0c;这次应该不会再跳票。 潜行者2切尔诺贝利之心是虚幻5吗 答&#xff1a;是虚幻5。 潜行者官方推特之前回复了…

WPF+MVVM案例实战(十八)- 自定义字体图标按钮的封装与实现(ABD类)

文章目录 1、案例效果1、按钮分类2、ABD类按钮实现描述1.文件创建与代码实现2、样式引用与控件封装3、按钮案例演示1、页面实现与文件创建2、运行效果如下3、总结4、源代码获取1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总结以下大概的按钮种类,…

在Vue和OpenLayers中使用移动传感器实现飞机航线飞行模拟

项目实现的核心代码 项目概述 该项目的目标是使用Vue.js作为前端框架&#xff0c;结合OpenLayers用于地图显示&#xff0c;实时获取来自手机传感器的数据&#xff08;如经纬度、高度、速度&#xff09;来模拟飞机在地图上的飞行轨迹。整体架构如下&#xff1a; Vue.js 用于构建…

C语言-详细讲解-洛谷P1075 [NOIP2012 普及组] 质因数分解

1.题目要求 2.题目解析 解题点在于如何分解质因数&#xff0c;这里介绍一下短除法。&#xff08;虽然解决这个问题可以不用短除法&#xff09; 3.代码实现 贴一下自己的代码 #include <stdio.h> #include <math.h>int main() {int n, i;scanf("%d",…

基于springboot的音乐网站的设计与实现(源码+lw+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…

Golang | Leetcode Golang题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; type point struct{x, y int }var dirs []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func updateMatrix(mat [][]int) [][]int {var m, n len(mat), len(mat[0])var res make([][]int, m)var visited make([][]bool, m)var queue []poin…

前端介绍|基础入门-html+css+js

文章目录 本课程有什么&#xff1f;前端是什么&#xff1f;1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么&#xff1f; 本套课程是零基础入门保姆级课程&#xff0c;课程主要内容包含&#xff1a; HTML…

自动驾驶---“火热的”时空联合规划

1 背景 早期的不少规划算法都是横纵分离的&#xff08;比如Apollo&#xff09;&#xff0c;先求解path之后&#xff0c;依赖path的结果再进行speed的求解。这种横纵解耦的规划方式具有以下特点&#xff1a; 相对较为简单&#xff0c;计算量通常较小&#xff0c;容易实现实时性…

龙蜥副理事长张东:加速推进 AI+OS 深度融合,打造最 AI 的服务器操作系统

AI 原生时代&#xff0c;操作系统厂商要全面优先拥抱 AI&#xff0c;深度融合 AI 能力&#xff0c;发挥关键生态位作用&#xff0c;做好上游芯片与下游 AI 应用开发商之间的纽带&#xff0c;打造最 AI 的服务器操作系统&#xff0c;实现 AI 能力的快速价值转化。 AI 原生趋势下…

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议&#xff0c;但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的…

【金融风控】相关业务介绍及代码详解

金融风控相关业务介绍 【了解】项目整体介绍 1.风控业务和风控报表</span> 零售金融产品 相关的指标 风控建模流程 ​ #2.特征工程 特征构造 特征筛选 ​ 3.评分卡模型构建 逻辑回归 集成学习 XGBoost LightGBM 模型评估 ​ #4.样本不均衡问题/异常点检测 【了解】今日…

了解数据库设计中的反规范化

反规范化是指通过增加冗余数据来提高数据库的读取效率。也就是说,反规范化通过在表中增加冗余字段来减少数据库中的表连接,以提高查询速度。规范化和反规范化是关系型数据库设计中的两个重要方面,它们分别代表了数据组织方式上的两个不同方向。规范化是为了减少数据冗余和提…

Perforce《2024游戏技术现状报告》Part2:游戏引擎、版本控制、IDE及项目管理等多种开发工具的应用分析

游戏开发者一直处于创新前沿。他们的实践、工具和技术受到各行各业的广泛关注&#xff0c;正在改变着组织进行数字创作的方式。 近期&#xff0c;Perforce发布了《2024游戏技术现状报告》&#xff0c;通过收集来自游戏、媒体与娱乐、汽车和制造业等高增长行业的从业者、管理人…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

通过 SSH 连接远程 Ubuntu 服务器

目录 安装 SSH 服务器允许 SSH 通过防火墙远程 SSH 连接&#xff08;选&#xff09;重启向日葵 安装 SSH 服务器 更新软件包列表 sudo apt update安装 OpenSSH 服务器 sudo apt install openssh-server检查 SSH 服务器状态 sudo systemctl status ssh如果 SSH 服务器正在运…

http请求响应详解

http介绍 http协议&#xff1a; Http”协议称为是“超文本传输协议”&#xff08;HTTP-Hypertext transfer protocol&#xff09;。它定义了浏览器怎么向万维网服务器请求万维网文档&#xff0c;以及服务器怎么样把文档传送给浏览器。 https协议&#xff1a; 传统的HTTP协议…