ServletContext上下文对象。---->解耦合(经过它实现Servlet之间的传递数据)java
一个项目只有一个ServletContext对象!web
咱们能够在N多个Servlet中来获取这个惟一的对象,使用它能够给多个Servlet传递数据!apache
与天地同寿!!!这个对象在Tomcat启动时就建立,在Tomcat关闭时才会死去!浏览器
服务器会为每一个应用建立一个ServletContext对象;tomcat
*ServletContext对象的建立是在服务器启动时完成的;服务器
*ServletContext对象的销毁是在服务器关闭时完成的。app
ServletContext对象的做用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,而后在BServlet中就能够获取这个值,这就是共享数据了。webapp
ServletConfig#getServletContext();this
GenericServlet#getServletContext();spa
HttpSession#getServletContext();------>先不着急学
ServletContextEvent#getServletContext();------>先不着急学
在Servlet中获取ServletContext对象:
*在void init(ServletConfig config)中:ServletContext context=config.getServletContext();,
ServletConfig类的getServletContext()方法能够用来获取ServletContext对象;
在GenericServlet或HttpServlet中获取ServletContext对象:
*GenericServlet类有getServletContext()方法,因此能够直接使用this.getServletContext()来获取;
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,能够从中读数据。
*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.1获取(任意资源的)真实路径
还可使用ServletContext对象来获取web应用下的资源,例如在hello应用的根目录下建立a.txt文件,如今想在Servlet中获取这个资源,就可使用ServletContext来获取。
*获取a.txt的真实路径:String realPath=ServletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:G:\Tomcat\apache-tomcat-8.0.28\webapps\XJS_Servlet2\a.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:\Tomcat\apache-tomcat-8.0.28\webapps\XJS_Servlet2\a.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]
注意:本方法必须以“ /”开头!!!