JaveWeb學習之Servlet(二):ServletConfig和ServletContext
ServletConfig
繼續檢視ServletConfig原始碼:
package javax.servlet; public interface ServletConfig { public String getServletName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }
getServletName();
getServletName方法用於獲取當前Servlet名稱,這個是在xml中配置的:<servlet-name>springmvcdemo</servlet-name>;
getServletContext();
getServletContext方法用於獲取代表當前web應用的ServletContext物件;
getInitParameter(String name);
getInitParameter方法用於獲取當前Servlet指定名稱的初始化引數的值;
getInitParameterNames();
getInitParameterNames獲取當前Servlet所有初始化引數的名字列舉集合;
Servlet容器初始化時每一個Servlet物件時,會為其建立一個ServletConfig物件,通過Servlet的init方法,會把ServletContext物件傳遞給當前Servlet:
public void init(ServletConfig config) throws ServletException;
之後使用this.getServletConfig()物件獲取當前Servlet的ServletConfig物件;
ServletConfig servletConfig = getServletConfig();
我們在xml中配置Servlet時,還可以配置Servlet初始化引數資訊:
<servlet> <servlet-name>Servlet_1</servlet-name> <servlet-class>com.guitu.servlet.Servlet_1</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhangkuan</param-value> </init-param> </servlet>
之後可以通過servletConfig獲取InitParameter引數;
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
獲得的是一個引數名字的列舉集合,在呼叫getInitParameter(String name)即可獲得引數的值:
String initParameter = servletConfig.getInitParameter(parameterName);
ServletContext
Servlet容器啟動後,會為每一個獨立的Web應用建立一個ServletContext例項,代表當前Web應用;
ServletContext由所有Servlet共享,所以ServletContext中的引數所有Servlet都能夠獲取,多個web元件之間使用它實現資料共享;
ServletContext常用方法:
getAttribute(String name);
獲取ServletContext中儲存的資料;
setAttribute(String name, Object obj);
向ServletContext中儲存資料;
getInitParameter(String name);
獲取<context-param>標籤中為整個Web應用配置的初始化引數;
getInitParameterNames();
一次性獲取<context-param>裡所有的初始化引數名的列舉;
getRealPath(String path);
獲取應用程式內指定資源的絕對路徑;
getResource(String parh);
path必須是/開頭,代表當前web應用程式的根目錄。返回一個代表某個資源的URL物件;
getResoutceAsStream(String parh);
可以使用相對於根目錄的路徑訪問到web目錄下的所有檔案,而不必知道絕對路徑,返回檔案流;
ServletConfig、ServletContext測試Demo
1、Servlet_1:
package com.guitu.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet_1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); Enumeration<String> initParameterNames = servletConfig.getInitParameterNames(); System.out.println("=====Servlet_1.ServletConfig.InitParameter====="); while (initParameterNames.hasMoreElements()) { String parameterName = initParameterNames.nextElement(); String initParameter = servletConfig.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====Servlet_1.ServletContext.InitParameter====="); ServletContext servletContext = getServletContext(); Enumeration<String> contextInitParameters = servletContext.getInitParameterNames(); while (contextInitParameters.hasMoreElements()) { String parameterName = contextInitParameters.nextElement(); String initParameter = servletContext.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } servletContext.setAttribute("message", "Hello World !"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2、Servlet_2:
package com.guitu.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet_2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); Enumeration<String> initParameterNames = servletConfig.getInitParameterNames(); System.out.println("=====Servlet_2.ServletConfig.InitParameter======"); while (initParameterNames.hasMoreElements()) { String parameterName = initParameterNames.nextElement(); String initParameter = servletConfig.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====Servlet_2.ServletContext.InitParameter====="); ServletContext servletContext = getServletContext(); Enumeration<String> contextInitParameters = servletContext.getInitParameterNames(); while (contextInitParameters.hasMoreElements()) { String parameterName = contextInitParameters.nextElement(); String initParameter = servletContext.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====servletContext.getAttribute====="); Object object = servletContext.getAttribute("message"); System.out.println("message:" + object); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3、web.xml配置:
<context-param> <param-name>domain</param-name> <param-value>guitu18.com</param-value> </context-param> <context-param> <param-name>name</param-name> <param-value>夜月歸途</param-value> </context-param> <servlet> <servlet-name>Servlet_1</servlet-name> <servlet-class>com.guitu.servlet.Servlet_1</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhangkuan</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet_1</servlet-name> <url-pattern>/Servlet_1</url-pattern> </servlet-mapping> <servlet> <servlet-name>Servlet_2</servlet-name> <servlet-class>com.guitu.servlet.Servlet_2</servlet-class> <init-param> <param-name>password</param-name> <param-value>Guitu18</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet_2</servlet-name> <url-pattern>/Servlet_2</url-pattern> </servlet-mapping>
在Servlet1和Servlet2中,分別獲得了ServletConfig物件和ServletContext物件;
在web.xml中,也分別為他們配置了不同的初始化引數,同時配置了一個context級的初始化引數;
之後分別在兩個Servlet中獲取ServletConfig和ServletContext的InitParamer引數;
在Servlet1中還通過setAttribute向ServletContext域中儲存了一條訊息message,在Servlet2中,便可以通過getAttribute獲取這條訊息;
4、訪問兩個Servlet,先訪問Servlet_1:
=====Servlet_1.ServletConfig.InitParameter===== username:zhangkuan =====Servlet_1.ServletContext.InitParameter===== domain:guitu18.com name:夜月歸途
再訪問Servlet_2:
=====Servlet_2.ServletConfig.InitParameter===== password:Guitu18 =====Servlet_2.ServletContext.InitParameter===== domain:guitu18.com name:夜月歸途 =====servletContext.getAttribute===== message:Hello World !
可以看到,每個Servlet擁有自己ServletConfig物件,資料不互通,而ServletContext中的初始化引數和context域中的引數,是所有Servlet共享的,可以使用context域實現資料共享;