ServletContext(重要)

ServletContext上下文对象。---->解耦合(通过它实现Servlet之间的传递数据)

  一个项目只有一个ServletContext对象!

  我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!

  与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!

1.ServletContext概述

服务器会为每个应用创建一个ServletContext对象;

*ServletContext对象的创建是在服务器启动时完成的;

*ServletContext对象的销毁是在服务器关闭时完成的。

  ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。

2.获取ServletContext

ServletConfig#getServletContext();

GenericServlet#getServletContext();

HttpSession#getServletContext();------>先不着急学

ServletContextEvent#getServletContext();------>先不着急学

Servlet中获取ServletContext对象:

  *在void init(ServletConfig  config)中:ServletContext  context=config.getServletContext();,

   ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;

GenericServletHttpServlet中获取ServletContext对象

  *GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;

3.域对象的功能

ServletContext是JavaWeb四大域对象之一:

  **PageContext;

  **ServletRequest;

  **HttpSession;

  **ServletContext;

  所有域对象都有存取数据的功能,因为域对象内部有一个Map(键不能相同),用来存取数据,下面是ServletContext对象用来操作数据的方法:

  **void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute("xxx","XXX"),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

  **Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value=(String)servletContext.getAttribute("xxx");,获取名为xxx的域属性;

  **void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

  **Enumeration getAttributeNames():获取所有域属性的名称;

代码演示:

AServlet.java向ServletContext里存入数据

 1 package one.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class AServlet extends HttpServlet {
13 
14     
15     public void doGet(HttpServletRequest request, HttpServletResponse response)
16             throws ServletException, IOException {
17         /*
18          * 1.获取ServletContext对象
19          * 2.调用其setAttribute()方法完成保存数据
20          * */
21         //直接获取,是从父类继承过来的方法
22         ServletContext application=this.getServletContext();
23         application.setAttribute("name", "张三");
24         System.out.println("存入成功");    
25     }
26 }

BServlet.java从ServletContext中读数据

 1 package one.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class BServlet extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         /*
17          * 1.获取ServletContext对象
18          * 2.然后在getAttribute();得到数据
19          * */
20         ServletContext application=this.getServletContext();
21         String value = (String)application.getAttribute("name");
22         System.out.println("我是BServlet:"+value);
23     }
24 }

先在浏览器中请求AServlet,它会存入数据;然后再请求BServlet,可以从中读数据。

4.获取应用初始化参数

  *servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个servlet只能获取自己的初始化参数,不能获取其他servlet的参数,即初始化参数只为一个Servlet准备!

  *可以配置公共的初始化参数,为所有的Servlet而用!这需要使用ServletContext才能使用!

web.xml

 1 <web-app...>
 2  <context-param>
 3     <param-name>AAA</param-name>
 4     <param-value>aaa</param-value>
 5  </context-param>
 6  <context-param>
 7     <param-name>BBB</param-name>
 8     <param-value>bbb</param-value>
 9  </context-param>
10 <web-app>

CServlet.java

 1 package one.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.util.Enumeration;
 6 
 7 import javax.servlet.ServletContext;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 public class CServlet extends HttpServlet {
14 
15     
16     public void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18         //演示得到公共的参数
19         ServletContext app=this.getServletContext();
20         String path = app.getContextPath();//返回web应用程序的上下文路径。
21         System.out.println(path);
22         String initParameter1 = app.getInitParameter("AAA");
23         String initParameter2 = app.getInitParameter("BBB");
24         Enumeration<String> initParameterNames = app.getInitParameterNames();
25         
26         System.out.println(initParameter1);
27         System.out.println(initParameter2);
28         
29         while(initParameterNames.hasMoreElements()){
30             System.out.println(initParameterNames.nextElement());
31         }
32     }
33 }

请求CServlet之后控制台的结果:

/XJS_Servlet2
aaa
bbb
BBB
AAA

  还可以使用ServletContext来获取web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同:

5.获取资源相关方法

5.1获取(任意资源的)真实路径

  还可以使用ServletContext对象来获取web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

  *获取a.txt的真实路径:String realPath=ServletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt

5.2获取资源流

  不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:

  *获取a.txt资源流:InputStream in=servletContext.getResourceAsStream("/a.txt");

  *获取b.txt资源流:InputStream in=servletContext.getResourceAsStream("/WEB-INF/b.txt");

代码示例:

 1 package one.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class DServlet extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response)
14             throws ServletException, IOException {
15         //得到这个文件的资源路径(带盘符的)    
16         String path=this.getServletContext().getRealPath("/a.txt");
17         System.out.println(path);
18         
19         //InputStream in=new FileInputStream(path);
20         //获取资源的路径后,再创建出输入流对象!
21         InputStream in=this.getServletContext().getResourceAsStream("/a.txt");
22         byte[] b=new byte[1024];
23         int n=0;
24         while((n=in.read(b))!=-1){
25             //把字节转换成String
26             String s=new String(b,0,n);//String类的一个构造方法
27             System.out.println(s);
28         }
29         in.close();//关闭文件流
30     }
31 }

请求该DServlet后控制台的结果:

G:Tomcatapache-tomcat-8.0.28webappsXJS_Servlet2a.txt
I Love IU!
dddddddddd

5.3获取指定目录下所有资源路径

  还可以使用ServletContext获取指定目录下所有资源路径,例如获取 / WEB-INF 下所有资源的路径:

Set set  = context.getResourcePaths("/WEB-INF");
System.out.println(set);
=============结果======================
[/WEB-INF/lib/ , /WEB-INF/classes/ , /WEB-INF/web.xml]

注意:本方法必须以“ /”开头!!! 

原文地址:https://www.cnblogs.com/xjs1874704478/p/10766305.html