Servlet和Servlet容器理解(轉)

1、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.() 
    Javax.servlet.jsp.PageContext.getServletContext() 
    Javax.servlet.ServletConfig.getServletContext()

2、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中:java

  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

3、兩者區別

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

  首先從做用範圍來講,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>app

  若是一個參數僅爲一個Servlet所用,那麼就應該配置爲ServletConfig參數,以下所示:jsp

  <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>this

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

  public class TestServletConfig extends HttpServlet { 
  ServletConfig config;spa

  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

相關文章
相關標籤/搜索