ServletContext介绍

文章目录

  • 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 {@Overridepublic void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {// 通过 ServletContext 注册 ServletServletRegistration.Dynamic myServlet = ctx.addServlet("myServlet", MyServlet.class);// 大于0时web容器启动时立即创建myServlet.setLoadOnStartup(1);// servlet映射路径myServlet.addMapping("/myServlet");// 通过 ServletContext 注册 FilterFilterRegistration.Dynamic myFilter = ctx.addFilter("myFilter", MyFilter.class);//REQUEST请求类型 除此之外还有 异步、转发等。。myFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");// 通过 ServletContext 注册 Listenerctx.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 {@Overridepublic 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.rhkb.cn/news/468096.html

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

相关文章

聚观早报 | 比亚迪腾势D9登陆泰国;苹果 iOS 18.2 将发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 11月5日消息 比亚迪腾势D9登陆泰国 苹果 iOS 18.2 将发布 真我GT7 Pro防尘防水细节 小米15 Ultra最快明年登场 …

【Linux系统编程】第四十四弹---从TID到线程封装:全面掌握线程管理的核心技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、tid是什么 1.1、理解库 1.2、理解tid 1.3、tid中线程局部存储 2、封装线程 2.1、基本结构 2.2、函数实现 2.3、使用…

智慧城市路面垃圾识别系统产品介绍方案

方案介绍 智慧城市中的路面垃圾识别算法通常基于深度学习框架&#xff0c;这些算法因其在速度和精度上的优势而被广泛采用。这些模型能够通过训练识别多种类型的垃圾&#xff0c;包括塑料袋、纸屑、玻璃瓶等。系统通过训练深度学习模型&#xff0c;使其能够识别并定位多种类型…

大模型人工智能课程全栈完整学习路径

嘿&#xff0c;朋友们&#xff0c;今天我们聊点高级的——大模型人工智能课程的全栈学习路径。不过别慌&#xff0c;虽然听起来高大上&#xff0c;但咱们慢慢来。从零开始&#xff0c;一步步带你走进这个神奇的世界。喝杯咖啡&#xff0c;穿上最舒适的拖鞋&#xff0c;准备好踏…

「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用

本篇将带你实现一个番茄钟倒计时应用&#xff0c;用户可以设置专注时间和休息时间的时长&#xff0c;点击“开始专注”或“开始休息”按钮启动计时&#xff0c;应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助&#xff0c;并且还会加入猫咪图片…

STM32H503开发(1)----开发板测试

STM32H503开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32H503 & SENSOR是一款基于STM32H5系列微控制器的评估套件。该微控制器采用了40nm工艺制造&#xff0c;具有更…

HTB:Perfection[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of OpenSSH is running? 使用nmap对靶机TCP端口进行开放扫描 2.What programming language is the web application written in? 使用浏览器访问靶机80端口页面&#xff0c;并通过Wappalyzer查看页面脚本语言 3.Which e…

SDL打开YUV视频

文章目录 问题1&#xff1a;如何控制帧率&#xff1f;问题2&#xff1a;如何触发退出事件&#xff1f;问题3&#xff1a;如何实时调整视频窗口的大小问题4&#xff1a;YUV如何一次读取一帧的数据&#xff1f; 问题1&#xff1a;如何控制帧率&#xff1f; 单独用一个子线程给主线…

Android V 挂起线程超时导致system_server挂掉

问题背景 最近Android v的平台频繁爆monkey异常停止的问题,分析到根因不是频繁dump堆栈导致system_server挂掉就是三方应用进程内部死锁导致anr,然后system_server挂起线程超时,system_server就崩了。 解决方案 先来看看anr导致死锁的场景如何分析 从log来看确认为syste…

下载mysql的jar,添加至jmeter中,编写jdbc协议脚本1106

下载jar包&#xff1a; 步骤1&#xff1a;进入maven仓库官网https://mvnrepository.com/ 步骤2&#xff1a;搜索实际的数据库 步骤3&#xff1a;点击 Mysql connnector/J 步骤5、查看数据库的版本号&#xff0c;选择具体版本&#xff0c;我的是mysql 8.0.16,下图&#xff0c;…

【分布式】分布式锁设计与Redisson源码解析

分布式锁 分布式锁是一种在分布式计算环境中用于控制多个节点&#xff08;或多个进程&#xff09;对共享资源的访问的机制。在分布式系统中&#xff0c;多个节点可能需要协调对共享资源的访问&#xff0c;以防止数据的不一致性或冲突。分布式锁允许多个节点在竞争访问共享资源…

CAD 图元 动一下消失

Z.ed.DrawVector(Point3d.Origin, new Point3d(100, 100, 0), 1, true);

【计网】实现reactor反应堆模型 --- 处理数据发回问题 ,异常处理问题

没有一颗星&#xff0c; 会因为追求梦想而受伤&#xff0c; 当你真心渴望某样东西时&#xff0c; 整个宇宙都会来帮忙。 --- 保罗・戈埃罗 《牧羊少年奇幻之旅》--- 实现Reactor反应堆模型 1 数据处理2 数据发回问题3 异常处理问题4 运行效果 1 数据处理 在上一篇文章中我…

Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!

在地球46亿年的漫长历史长河中&#xff0c;生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌&#xff1f;如何理解关键演化节点的具体过程&#xff1f;10月23日&#xff0c;Science Robotics发表重磅综述&#xff0c;首次系统性提出"古生物启发…

string接口的深度理解(内附思维导图)

1. 为什么学习string类&#xff1f; C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

jsp+sevlet+mysql实现用户登陆和增删改查功能

jspsevletmysql实现用户登陆和增删改查功能 一、系统介绍二、功能展示1.用户登陆2.用户列表3.查询用户信息4.添加用户信息5.修改用户信息6.删除用户信息 四、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a; 用户登陆、添加用户、查询用户、修改用户、删除用户 二…

Python小白学习教程从入门到入坑------第二十九课 访问模式文件定位操作(语法进阶)

一、访问模式 模式可做操作若文件不存在是否覆盖r只能读报错-r可读可写报错是w只能写创建是w可读可写创建是a只能写创建否&#xff0c;追加写a可读可写创建否&#xff0c;追加写 1.1 r r&#xff1a;只读模式(默认模式)&#xff0c;文件必须存在&#xff0c;不存在就会报错…

TIOBE 编程指数 11 月排行榜公布 VB.Net第九

IT之家 11 月 9 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 11 月的编程语言排行榜&#xff0c;IT之家整理如下&#xff1a; P…

聚合联盟的优势

聚合广告联盟对比其他平台优势&#xff1a; 数据透明&#xff0c;自己去平台查看不存在扣量问题。对OVHM做策略优化&#xff0c;帮助开发者做多重点击和下载&#xff0c;使开发者利益最大化。为开发者提供app各大市场上架&#xff0c;隐私协议等指导。 最大的优势就是数据公开…