目錄
一、ServletContext概述
二、獲取ServletContext
三、域對象的功能
四、獲取項目初始化參數
五、獲取資源相關方法
6 練習:訪問量統計
=====================================
一、ServletContext概述
服務器會爲每一個項目建立一個ServletContext對象,一個項目只有一個ServletContext上下文對象!
咱們能夠在N多個Servlet中來獲取這個惟一的對象,使用它能夠給多個Servlet傳遞數據!
與服務器同壽!!!這個對象在Tomcat啓動時就建立,在Tomcat關閉時纔會被銷燬死去!
做用: 在整個Web應用的動態資源之間共享數據!
例如:在AServlet中向ServletContext對象中保存一個值,而後在BServlet中就能夠獲取這個值,這就是共享數據了。html
二、獲取ServletContext
* ServletConfig 接口中 getServletContext()方法;
* GenericServlet 類中 getServletContext()方法;web
在Servlet接口中獲取ServletContext對象:
* 在void init(ServletConfig config)中:
ServletContext context = config.getServletContext();
ServletConfig類的getServletContext()方法能夠用來獲取ServletContext對象;
在GenericeServlet或HttpServlet中獲取ServletContext對象:
* GenericServlet類有getServletContext()方法,因此能夠直接使用this.getServletContext()來獲取;
public class MyServlet implements Servlet {
public void init(ServletConfig config) {
ServletContext context = config.getServletContext();
}
…
}
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletContext context = this.getServletContext();
}
}tomcat
三、域對象的功能
ServletContext是JavaWeb四大域對象之一:
* PageContext;
* ServletRequest;
* HttpSession;
* ServletContext;
全部域對象都有存取數據的功能,由於域對象內部有一個Map,用來存儲數據,下面是ServletContext對象用來操做數據的方法:
* void setAttribute(String name, Object value):用來存儲一個對象,也能夠稱之爲存儲一個域屬性。
* Object getAttribute(String name):用來獲取ServletContext中的數據,當前在獲取以前須要先去存儲才行。
* void removeAttribute(String name):用來移除ServletContext中的域屬性,若是參數name指定的域屬性不存在,
那麼本方法什麼都不作;
* Enumeration getAttributeNames():獲取全部域屬性的名稱;服務器
四、獲取項目初始化參數
* 一個Servlet只能獲取本身的初始化參數,不能獲取別人的,即初始化參數只爲一個Servlet準備!
* 能夠配置公共的初始化參數,爲全部Servlet而用!這須要使用ServletContext才能使用!
還可使用ServletContext來獲取在項目web.xml文件中配置的應用初始化參數!
注意,項目初始化參數與Servlet初始化參數不一樣:
web.xml
<web-app>
...
<context-param> [配置了兩個應用初始化參數]
<param-name>paramName1</param-name>
<param-value>paramValue1</param-value>
</context-param>app
<context-param>
<param-name>paramName2</param-name>
<param-value>paramValue2</param-value>
</context-param>
</web-app>
ServletContext context = this.getServletContext(); [獲取ServletContext對象]
String value1 = context.getInitParameter("paramName1");
String value2 = context.getInitParameter("paramName2");webapp
Enumeration names = context.getInitParameterNames();[獲取全部應用初始化參數名稱]
while(names.hasMoreElements()) {
System.out.println(names.nextElement()); //會獲得 paramName1,paramName2
}網站
五、獲取資源相關方法
5.一、獲取真實路徑(*****)
還可使用ServletContext對象來獲取Web應用下的資源,例如在hello應用的根目錄下建立a.txt文件,
如今想在Servlet中獲取這個資源,就可使用ServletContext來獲取。
* 獲取a.txt的真實路徑:String realPath = servletContext.getRealPath(「/a.txt」),
realPath的值爲a.txt文件的絕對路徑:F:\tomcat6\webapps\hello\a.txt;
* 獲取b.txt的真實路徑:String realPath = servletContext.getRealPath(「/WEB-INF/b.txt」);this
5.二、獲取資源流
不僅能夠獲取資源的路徑,還能夠經過ServletContext獲取資源流,即把資源以輸入流的方式獲取:
* 獲取a.txt資源流:InputStream in = servletContext.getResourceAsStream(「/a.txt」);
* 獲取b.txt資源流:InputStream in = servletContext.getResourceAsStream(「/WEB-INF/b.txt」);編碼
5.三、獲取指定目錄下全部資源路徑
還可使用ServletContext獲取指定目錄下全部資源路徑,例如獲取/WEB-INF下全部資源的路徑:
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]
注意,本方法必須以「/」開頭!!!xml
6 練習:訪問量統計
一個項目中全部的資源被訪問都要對訪問量進行累加!
建立一個int類型的變量,用來保存訪問量,而後把它保存到ServletContext的域中,這樣能夠保存全部的Servlet均可以訪問到!
相信各位必定見過不少訪問量統計的網站,即「本頁面被訪問過XXX次」。由於不管是哪一個用戶訪問指定頁面, 都會累計訪問量,因此這個訪問量統計應該是整個項目共享的!很明顯,這須要使用ServletContext來保存訪問量。 ServletContext application = this.getServletContext(); [獲取ServletContext對象] Integer count = (Integer)application.getAttribute("count") [獲取ServletContext對象中的count屬性]; if(count == null) { count = 1; [若是在ServletContext中不存在count屬性,那麼設置count的值爲1,表示第一次被訪問。] } else { count++; [若是在ServletContext中存在count屬性,說明之前被訪問過,那麼讓count在原來的基礎上加1。]; } response.setContentType("text/html;charset=utf-8"); // response.setHeader("Content-Type","text/html;charset=utf-8"); 設置頭信息(文本類型和編碼),等同於上面 response.getWriter().print("<h1>本頁面一共被訪問" + count + "次!</h1>")[向客戶端響應本頁面被訪問的次數。]; application.setAttribute("count", count);[覆蓋保存count的值到ServletContext對象中。] ---------------------