今天我們學習的是ServletContext的應用。
WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為context域對象。
1.多個Servlet通過ServletContext對象實現數據共享。
在InitServlet的Service方法中利用ServletContext對象存入需要共享的數據
/*獲取ServletContext對象*/
ServletContext context = this.getServletContext();
//存入共享的數據
context.setAttribute("name", "haha");
在其它的Servlet中利用ServletContext對象獲取共享的數據
/*獲取ServletContext對象*/
ServletContext context = this.getServletContext();
//獲取共享的數據
String name = context.getAttribute("name");
System.out.println("共享的內容值是:"+name);
2.獲取WEB應用的初始化參數。
在web.xml文件中配置需要初始化的參數信息。
<web-app>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/4g</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>1314qr</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
</web-app>
在DemoServlet的doPost方法中測試獲取初始化參數的步驟如下:
/*獲取ServletContext對象*/
ServletContext context = this.getServletContext();
/*獲取初始化參數*/
//獲取指定名稱的初始化參數
String url = context.getInitParameter("url");
//獲取web.xml文件中所有的初始化應用參數
Enumeration<String> enumer = context.getInitParameterNames();
while(enumer.hasMoreElements()){
String name = enumer.nextElement();
String value = context.getInitParameter(name);
System.out.println(name+"=========="+value);
}
2.實現Servlet的轉發:
在測試的Servlet中實現轉發的步驟如下:
/*要利用ServletContext對象實現轉發獲取對象*/
ServletContext context = this.getServletContext();
//在request對象中存入name屬性
request.setAttribute("name", "haha");
/*根據轉發的地址獲取 RequestDispatcher對象*/
RequestDispatcher rd = context.getRequestDispatcher("/index.jsp");
//調用轉發方法 以下采用任意方法即可
rd.forward(request, response);
//rd.include(request, response);
注意:forward與include的區別
forward方法是把請求的內容轉發到另外的一個servlet.而include是把另一個servlet處理過后的內容拿過來.
(forward方法調用后在響應中的沒有提交的內容被自動消除。將請求轉發給其他的Servlet后,由
被調用的Servlet負責對請求做出響應,而原先Servlet的執行則終止。
include方法使原先的Servlet和轉發到的Servlet都可以輸出響應信息,即原先的Servlet還可以繼續輸出響應信息)
3.利用ServletContext對象讀取資源文件。
讀取資源文件(properties文件(屬性文件))的三種方式
配置的properties的內容如下:
url=jdbc\:mysql\://localhost\:3306/3g ;
user=root;
password=root;
獲取實現的代碼如下:
/*獲取ServletContext對象*/
ServletContext context = this.getServletContext();
//第一種方式
URL url = context.getResource("WEB-INF/classes/db.properties");
InputStream is = url.openStream();
//第二種方式
/*讀取db.properties文件*/
String path =context.getRealPath("WEB-INF/classes/db.properties");
/*根據文件的路徑 構建文件對象*/
File file = new File(path);
/*根據file文件對象 創建輸入流*/
InputStream is = new FileInputStream(file);
//第三種方式
InputStream is = context.getResourceAsStream("WEB-INF/classes/db.properties ");
以三種方式任意一種可以:
/*解析properties的文件*/
Properties prop = new Properties();
//從輸入流中讀取屬性列表(鍵和元素對)。
prop.load(is);
Set<String> set = prop.stringPropertyNames();
//遍歷set集合
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
String value = prop.getProperty(key);
System.out.println(key+"-----"+value);
}