ServletContext與ServletConfig的詳解及差異

ServletContext與ServletConfig的詳解及區別

一、ServletContext詳解
ServletContext是servlet與servlet容器之間的直接通信的接口。Servlet容器在啓動一個Web應用時,會爲它創建一個servletContext對象。每個web應用有唯一的servletContext對象。同一個web應用的所有servlet對象共享一個serveltContext,servlet對象可以通過它來訪問容器中的各種資源。
servletContext接口提供的方法分爲以下幾種類型:
用於在Web應用範圍內存取共享數據的方法。
注:web應用範圍具有以下兩層含義:
(1) 表示有web應用的生命週期構成的時間段.
(2) 表示在web應用的生命週期內所有web組件的集合。
 setAttribute(String name,java.lang.Object object):把一個java對象和一個屬性名綁定,並存放到ServletContext中,參數name指定屬性名,參數Object表示共享數據。
 getAttribute(String name):根據參數給定的屬性名,返回一個Object類型的對象。
 getAttributeNames():返回一個Enumeration對象,該對象包含了所有存放在ServletContext中的屬性名。
 removeAttribute(String name):根據參數指定的屬性名,從servletContext對象中刪除匹配的屬性。
訪問當前Web應用的資源
 getContextpath():返回當前web應用的URL入口。
 getInitParameter(String name):返回web應用方位內的匹配的初始化參數值。在web.xml中<web-app>元素中<context-param>元素表示應用範圍內的初始化參數。
 getInitParameterNames():返回一個Enumeration對象。
 getServletContextName():返回web應用的名字。即<web-app>元素中<display-name>元素的值。
 getRequestDispatcher(String path):返回一個用於向其他web組件轉發請求的RequestDispatcher對象。
訪問servlet容器的相關信息
 getContext(String uripath):根據參數指定的url,返回當前servlet容器中其他web應用的servletContext()對象。
反問web容器的相關信息
 getMajorVersion():返回servlet容器支持的java servlet API 的主板本號。
 getMinorVersion():返回servlet容器支持的java Servlet API的此版本號。
 getServerInfo():返回servlet容器的名字和版本。
訪問服務器端的文件系統資源
 getRealPath(String path):根據參數指定的虛擬路徑,返回文件系統中的一個真實的路徑。
 getResource(String path):返回一個映射到參數指定的路徑的url。
 getResourceAsStream(String path):返回一個用於讀取參數指定的文件的輸入流。(把文件讀到輸入流中去)
 getMimeType(String file):返回參數指定的文件的MIME類型。
輸出日誌
 log(String msg):想servlet的日誌文件中寫日誌。
 log(String message, java.lang.Throwable   throwable):向servlet的日誌文件中寫錯誤日誌,以及異常的堆棧信息。
ServletContext對象獲得幾種方式:
       Javax.servlet.http.HttpSession.getServletContext() 
       Javax.servlet.jsp.PageContext.getServletContext() 
       Javax.servlet.ServletConfig.getServletContext()

二、ServletConfig詳解
Servlet容器初始化一個servlet對象時,會爲這個servlet對象創建一個servletConfig對象。在servletConfig對象中包含了servlet的初始化參數信息。此外,servletConfig對象還與servletContext對象關聯。Servlet容器在調用servlet對象的init(ServletConfig config)方法時,會把servletConfig對象當做參數傳遞給servlet對象。Init(ServletConfig config)方法會使得當前servlet對象與servletConfig對象建立關聯關係。
servletConfig接口中定義了一下方法:
 getInitParameter(String   name):根據給定的初始化參數,返回匹配的初始化參數值。
 getInitParameterNmes():返回一個Enumeration對象,裏面包含了所有的初始化參數。
 getServletContext():返回一個servletContext()對象,
 getServltName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。如果沒有配置這個子元素,則返回servlet類的名字。
例子:
<servlet>
<servlet-name>actionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>0</load-on-startup>

<init-param>
   <param-name>color</param-name>
   <param-value>red</param-value>
</init-param>
<init-param>
   <param-name>size</param-name>
   <param-value>16</param-value>
</init-param>

</servlet>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如上,紅色標記處爲初始化參數,相當於公有參數。
在servlet中:

public class UserDateBaseServlet extends HttpServlet{
String color = this.getInitParameter("color");
String size = this.getInitParameter("size");
System.out.println("顏色是:"+color+"字號是:"+size);
}
注:HttpServlt類繼承了GenericServlet類,而GenericServlet類實現了ServletConfig接口,因此在HttpServlet類和GenericServlet類及子類中都可以直接調用ServletConfig接口中的方法。

三、二者區別
在看web.xml配置文件關於環境初始化參數的配置時,發現了ServletConfig與ServletContext這兩個對象的應用,於是就寫了一個Servlet來體驗了一下。

首先從作用範圍來說,ServletConfig作用於某個特定的Servlet,即從該Servlet實例化,那麼就開始有效,但是該Servlet之外的其他Servlet不能訪問;ServletContext作用於某個web應用,即在一個web應用中相當於一個全局對象,在Servlet容器啓動時就已經加載,對於不同的web應用,有不同的ServletContext。

其次,來看一下二者參數的使用。如果一個參數爲整個web應用所用,那麼就配置爲ServletContext參數,如下所示:

<context-param>
   <param-name>encoding</param-name>
   <param-value>gb2312</param-value>
</context-param>

如果一個參數僅爲一個Servlet所用,那麼就應該配置爲ServletConfig參數,如下所示:

<servlet>
   <servlet-name>affice_add</servlet-name>
   <servlet-class>servlet.Affice_add</servlet-class>
   <init-param>
      <param-name>filepath</param-name>
     <param-value>/webContent/affice</param-value>
   </init-param>
</servlet>

最後,說明一下參數的獲取。訪問ServletConfig參數,取得ServletConfig對象後,調用getInitParameter()方法;訪問ServletContext對象,只要調用現有的ServletConfig對象的getServletContext()即可,然後同樣調用getInitParamter()方法就能獲取參數。例如對於上面的參數,可以通過如下方法獲取各自參數。

public class TestServletConfig extends HttpServlet {
   ServletConfig config;

   public void init(ServletConfig config) {
       this.config=config;
   }

   public void doGet(HttpServletRequest request,HttpServletResponse response)
          throws ServletException,IOException {
       String filepath=(String)config.getInitParameter("filepath");
       System.out.println(filepath);
       String encode=(String)config.getServletContext().getInitParameter("encoding");
       System.out.println(encode);
   }

   public void destroy() {
   }
}
對上面Servlet編譯後,在瀏覽器中輸入http://localhost:8080/my/TestServletConfig(該鏈接地址與servlet在webx.xml中的配置有關)後,就可以分別對應輸出/WebContent/affice和gb2312

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章