ServletContext

本文围绕ServletContext展开,介绍其概念,即每个应用有且仅有一个,代表整个web应用,生命周期与服务器一致。还阐述了获取方法,以及其功能,包括获取MIME类型、作为域对象共享数据、获取文件真实路径等,并给出了相关实现代码和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、概念

每个应用都会有且一个ServletContext对象与之关联,该对象代表整个web应用,可以和程序的容器(服务器)通信。
它的生命周期:服务器启动就会被创建,服务器关闭会被销毁

二、获取ServletContext

获取该对象的方法:

public ServletContext getServletContext();

实现代码:

@WebServlet("/servletcontext1")
public class Demo1_ServletContext extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// 1. 通过HttpServletRequest对象获取
        ServletContext servletContext1 = request.getServletContext();
		// 2. 通过HttpServlet获取
        ServletContext servletContext2 = this.getServletContext();

        System.out.println(servletContext1);
        System.out.println(servletContext2);
        
		// true
        System.out.println(servletContext1 == servletContext2);
    }
}

三、功能

3.1 获取MIME类型

格式:大类型/小类型
例如:text/html、image/jpeg

获取MIME类型的方法:

String getMimeType(String filename);

实现代码:

// 1. 获取ServletContext
ServletContext servletContext = this.getServletContext();

// 2. 定义文件名称
String filename = "a.jpg";

// 3. 获取MIME类型【常用】
String mimeType = servletContext.getMimeType(filename);

// 输出结果:image/jpeg。
// 也就是说,jpg类型对应的MIME类型是image/jpeg
System.out.println(mimeType);

为什么可以根据文件名后缀获取到该后缀对应的MIME类型??
是因为整个MIME类型所有的对应关系都在服务器中存储着。存储路径:/Library/apache-tomcat-9.0.16/conf/web.xml,所有项目web.xml都是继承自该web.xml。该文件中有近五千行代码,其中四千多行都是记录的整个MIME类型所有的对应关系。

3.2 域对象,共享数据

说到共享数据,我们就能想到HttpServletRequest也具备共享数据的功能,但是这两个对象共享数据的范围是大不相同的。

ServletContext 对象的范围:所有用户所有请求的数据(可以共享所有用户的数据)
该对象的生命周期很长:服务器启动就会被创建,服务器关闭会被销毁。所以我们尽量不要存储必须要的数据,因为存储数据过多,会造成占用不必要的内存。

共享数据的方法:

void setAttribute(String var1, Object var2);
Object getAttribute(String var1);
void removeAttribute(String var1);

我们创建Demo3_ServletContext,再创建Demo4_ServletContext,这俩对象都继承于HttpServlet。先在Demo3中存储数据,在Demo4中尝试获取Demo3中存储的数据。然后在浏览器中先访问Demo3,然后访问Demo4,我们就能获取到Demo3中存储的数据。实现代码:
Demo3_ServletContext:

@WebServlet("/servletcontext3")
public class Demo3_ServletContext extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取ServletContext
        ServletContext servletContext = this.getServletContext();

        // 2. 设置数据
        servletContext.setAttribute("msg", "pppppppp");
    }

Demo4_ServletContext:

@WebServlet("/servletcontext4")
public class Demo4_ServletContext extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取ServletContext
        ServletContext servletContext = this.getServletContext();

        // 获取数据
        Object msg = servletContext.getAttribute("msg");
		
		// 输出结果:pppppppp
        System.out.println(msg);
    }
3.3 获取文件的真实(服务器)路径

获取方法:

String getRealPath(String var1);

在这里插入图片描述
如上图,我们
src目录下创建了文件test1.text
web目录下,创建了WEB-INF文件夹;
web目录下,创建了test3.text
WEB-INF目录下,创建了test2.text;
我们应该注意,获取不同目录下的文件的真实路径,传入的参数是不同的。

第一种,获取web目录下资源的真实路径:/资源名称
就是获取test3.text文件的真实路径。
其中,/,对应web目录。

// 第一:/test3,对应的是web目录下资源访问:/资源名称
String test3 = servletContext.getRealPath("/test3.text");
System.out.println("test3=" + test3);

输出结果:

test3=/Users/Kingdev/Desktop/JavaWebDemo/05_response/out/artifacts/05_response_war_exploded/test3.text

第二:获取WEB-INF目录下的资源的真实路径:/WEB-INF/资源名称
就是获取test2.text文件的真实路径。

String test2 = servletContext.getRealPath("/WEB-INF/test2.text");
System.out.println("test2=" + test2);

输出结果:

test2=/Users/Kingdev/Desktop/JavaWebDemo/05_response/out/artifacts/05_response_war_exploded/WEB-INF/test2.text

第三:获取src目录下的资源真实路径:/WEB-INF/classes/资源名称
也就是获取 test1.text 文件的真实路径。
我们都知道,src目录中的文件,会被放到 /WEB-INF/classes 文件下。

String test1 = servletContext.getRealPath("WEB-INF/classes/test1.text");
System.out.println("test1=" + test1);

输出结果:

test1=/Users/Kingdev/Desktop/JavaWebDemo/05_response/out/artifacts/05_response_war_exploded/WEB-INF/classes/test1.text

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值