ServletContext
一. 概念
代表整个 web 应用,可以和程序的容器(服务器)通信。
二. 获取
- 通过 request 对象获取:
request.getServletContext();
- 通过 HttpServlet 获取:
this.getServletContext();
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 获取 ServletContext 对象
*/
@WebServlet("/servletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过 request 对象获取 ServletContext
ServletContext context1 = request.getServletContext();
// 通过 HttpServlet 获取 ServletContext
ServletContext context2 = this.getServletContext();
System.out.println(context1);
System.out.println(context2);
System.out.println(context1 == context2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
三. 功能
1. 获取 MIME 类型
- MIME 类型:在互联网通信过程中定义的一种文件数据类型
- 格式:大类型/小类型,e.g. text/html、image/jpeg
- 获取:
String getMimeType(String file)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 获取 MIME 类型
*/
@WebServlet("/servletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 通过 HttpServlet 获取 ServletContext
ServletContext context = this.getServletContext();
// 2. 定义文件名称
String filename = "a.jpg";
// 3. 获取 MIME 类型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2. 域对象:共享数据
- 方法
setAttribute(String name, Object value)
getAttribute(String name)
removeAttribute(String name)
- ServletContext 对象范围:所有用户所有请求的数据(范围大,所以要谨慎使用 ServletContext)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 域对象:共享数据
*/
@WebServlet("/servletContextDemo3")
public class ServletContextDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过 HttpServlet 获取 ServletContext
ServletContext context = this.getServletContext();
// 设置数据
context.setAttribute("msg", "hello");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 域对象:共享数据
*/
@WebServlet("/servletContextDemo4")
public class ServletContextDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过 HttpServlet 获取 ServletContext
ServletContext context = this.getServletContext();
// 获取数据
System.out.println(context.getAttribute("msg"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3. 获取文件的真实(服务器)路径
String getRealPath(String path)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
/**
* 获取文件的真实(服务器)路径
*/
@WebServlet("/servletContextDemo5")
public class ServletContextDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过 HttpServlet 获取 ServletContext
ServletContext context = this.getServletContext();
// 获取文件的真实(服务器)路径
String realPathA = context.getRealPath("/WEB-INF/classes/a.txt"); // src 目录下的资源路径
System.out.println(realPathA);
String realPathB = context.getRealPath("/b.txt"); // web 目录下的资源路径
System.out.println(realPathB);
// File file = new File(realPath);
String realPathC = context.getRealPath("/WEB-INF/c.txt"); // web -> WEB-INF 目录下的资源路径
System.out.println(realPathC);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
// Output
/Users/hjplz/idea-workspace/servletContext_demo/out/artifacts/servletContext_demo_war_exploded/WEB-INF/classes/a.txt
/Users/hjplz/idea-workspace/servletContext_demo/out/artifacts/servletContext_demo_war_exploded/b.txt
/Users/hjplz/idea-workspace/servletContext_demo/out/artifacts/servletContext_demo_war_exploded/WEB-INF/c.txt