ServletContext(重要)

ServletContext上下文對象。---->解耦合(經過它實現Servlet之間的傳遞數據)java

  一個項目只有一個ServletContext對象!web

  咱們能夠在N多個Servlet中來獲取這個惟一的對象,使用它能夠給多個Servlet傳遞數據!apache

  與天地同壽!!!這個對象在Tomcat啓動時就建立,在Tomcat關閉時纔會死去!瀏覽器

1.ServletContext概述

服務器會爲每一個應用建立一個ServletContext對象;tomcat

*ServletContext對象的建立是在服務器啓動時完成的;服務器

*ServletContext對象的銷燬是在服務器關閉時完成的。app

  ServletContext對象的做用是在整個Web應用的動態資源之間共享數據!例如在AServlet中向ServletContext對象中保存一個值,而後在BServlet中就能夠獲取這個值,這就是共享數據了。webapp

2.獲取ServletContext

ServletConfig#getServletContext();this

GenericServlet#getServletContext();spa

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:\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]

注意:本方法必須以「 /」開頭!!! 

相關文章
相關標籤/搜索