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]
注意:本方法必須以「 /」開頭!!!