目录
一、概念
每个应用都会有且一个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