一、ServletContext 接口
1、ServletContext 是什么
(1)ServletContext 是一个接口,它表示 Servlet 上下文对象(可以和程序的容器(服务器)来通信);
(2)一个 web 工程, 只有一个 ServletContext 对象实例;
(3)ServletContext 对象是一个域对象;
(4)ServletContext 是在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁
2、域对象
域对象:就是类似于 Map,可以在里面存取数据,叫域对象。
域对象的范围:指的是存取数据的操作范围。
ServletContext 范围:整个 Web 工程。
存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
二、获取 ServletContext 对象
1、通过 ServletConfig 对象获取
ServletContext servletContext = getServletConfig().getServletContext();
2、通过 getServletContext() 方法获取
ServletContext servletContext = getServletContext();
直接调用该方法,其实是调用了 GenericServlet 类中的方法,其本质还是通过 ServletConfig 对象获取的。
3、通过 ServletRequest 及其子类获取
在 ServletRequest 接口中包含了一个抽象方法来获取 ServletContext:
public ServletContext getServletContext();
HttpServletRequest 接口继承了ServletRequest 接口,其中也就包含了这个方法:
1 @Override
2 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
3 System.out.println("Hello Servlet被访问了");
4 ServletContext servletContext = req.getServletContext();
5 System.out.println("servletContext = " + servletContext);
6 }
7
8 @Override
9 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
10 super.doPost(req, resp);
11 ServletContext servletContext = req.getServletContext();
12 System.out.println("servletContext = " + servletContext);
13 }
三、ServletContext 的常用作用
1、常用作用
(1)获取 web.xml 中配置的上下文参数 context-param
(2)获取当前的工程路径,格式:/工程路径
(3)获取工程部署后在服务器硬盘上的绝对路径
(4)像 Map 一样存取数据
2、案例
(1)读取 context-param 参数
在 web.xml 中配置 context-param
1 <!--context-param 是上下文参数(它属于整个 web 工程)-->
2 <context-param>
3 <param-name>username</param-name>
4 <param-value>context</param-value>
5 </context-param>
6 <!--context-param 是上下文参数(它属于整个 web 工程)-->
7 <context-param>
8 <param-name>password</param-name>
9 <param-value>root</param-value>
10 </context-param>
注意:
① <context-param> 标签要书写在 <web-app> 里面,<servlet>的外面;
② 这里配置的参数是为整个 web 工程配置的,对所有的 servlet 都有效;而之前 <init-param> 为某一个servlet单独配置的,注意区分;
1 @Override
2 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3 ServletContext servletContext = getServletContext();
4 System.out.println(servletContext);
5
6 //1.获取 context-param 是上下文参数
7 String username = servletContext.getInitParameter("username");
8 System.out.println("username = " + username);
9 String password = servletContext.getInitParameter("password");
10 System.out.println("password = " + password);
11
12 Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
13 while (initParameterNames.hasMoreElements()) {
14 String key = initParameterNames.nextElement();
15 System.out.println(key + "=" + servletContext.getInitParameter(key));
16 }
17 }
(2)获取当前的工程路径(虚拟路径):格式:/工程路径
获取当前工程的路径(虚拟路径),格式:/工程路径
String contextPath = getServletContext().getContextPath();
(3)获取工程部署后在服务器硬盘上的绝对路径(真实路径)
获取工程绝对路径(真实路径)
String realPath = getServletContext().getRealPath("/");
Demo:
1 // 获取工程部署后在服务器硬盘上的绝对路径(真实路径)
2 /**
3 * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA/eclipse 代码的 web 目录
4 */
5 System.out.println("工程部署的路径是:" + context.getRealPath("/"));
6 System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
7 System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
8
9 String b = context.getRealPath("/b.txt");//web目录下资源访问
10 String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
11 String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
(4)作为域对象,像Map一样存取数据
(1)setAttribute(String name,Object value); 存储数据
(2)getAttribute(String name); 获取数据
(3)removeAttribute(String name); 移除数据
ServletContext 对象范围:所有用户所有请求的数据(谨慎使用)
(5)获取MIME类型
MIME 类型:在互联网通信过程中定义的一种文件数据类型。
格式:
大类型/小类型; 如:text/html、image/jpeg 等
获取一个文件的 MIME 类型:
String mimeType = getServletContext().getMimeType(String fileName);
代码测试:
HelloServlet5:
1 @Override
2 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3 ServletContext servletContext = getServletContext();
4 System.out.println(servletContext);
5
6 //1.获取 context-param 是上下文参数
7 String username = servletContext.getInitParameter("username");
8 System.out.println("username = " + username);
9 String password = servletContext.getInitParameter("password");
10 System.out.println("password = " + password);
11
12 Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
13 while (initParameterNames.hasMoreElements()) {
14 String key = initParameterNames.nextElement();
15 System.out.println(key + "=" + servletContext.getInitParameter(key));
16 }
17
18 //2. 获取当前的工程路径, 格式: /工程路径
19 String contextPath = servletContext.getContextPath();
20 System.out.println("当前工程路径 contextPath = " + contextPath);
21
22 //3. 获取工程部署后在服务器硬盘上的绝对路径
23 /**
24 * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
25 */
26 System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
27 System.out.println("工程下 css 目录的绝对路径是:" + servletContext.getRealPath("/css"));
28 System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + servletContext.getRealPath("/imgs/1.jpg"));
29
30 //4.像 Map 一样存取数据
31 System.out.println(servletContext);
32 System.out.println("保存之前: Context1 获取 key1 的值是:"+ servletContext.getAttribute("key1"));
33 servletContext.setAttribute("key1", "value1");
34 System.out.println("Context1 中获取域数据 key1 的值是:"+ servletContext.getAttribute("key1"));
35 }
HelloServlet6:
1 @Override
2 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3 System.out.println("-----------------------------");
4 ServletContext servletContext = getServletContext();
5 System.out.println(servletContext);
6
7 //1.获取 context-param 是上下文参数
8 String username = servletContext.getInitParameter("username");
9 System.out.println("username = " + username);
10 String password = servletContext.getInitParameter("password");
11 System.out.println("password = " + password);
12
13 Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
14 while (initParameterNames.hasMoreElements()) {
15 String key = initParameterNames.nextElement();
16 System.out.println(key + "=" + servletContext.getInitParameter(key));
17 }
18
19
20 System.out.println("Context2 中获取域数据 key1 的值是:"+ servletContext.getAttribute("key1"));
21 }
运行结果: