Servlet容器模型(四)ServletConfig、ServletContext

來源:互聯網
上載者:User

這兩天剛剛回顧了一下servlet中的設定物件ServletConfig、內容物件ServletContext、多線程相關的知識點,做了一下筆記,如下:

一、Servlet設定物件(ServletConfig):Servlet初始化時,容器調用其init(ServletConfig)方法,傳遞該對象。

1、獲得對象方法:

(1)、直接使用getServletConfig()方法:

ServletConfig config = getServletConfig();

(2)、覆蓋Servlet的init()方法,把容器建立的ServletConfig對象儲存到一個成員變數中:

public void init(ServletConfig config){

super.init(config);

this.config = config;

}

2、ServletConfig的4個常用方法:

(1)、public String getInitParameter(String name):返回指定名稱的初始化參數值;

(2)、public Enumeration getInitParameterNames():返回一個包含所有初始化參數名的Enumeration對象;

(3)、public String getServletName():返回在DD檔案中<servlet-name>元素指定的Servlet名稱;

(4)、public ServletContext getServletContext():返回該Servlet所在的內容物件;

3、從ServletConfig對象中使用初始化參數初始化一個Servlet的過程可以實現Servlet的重用性

二、Servlet內容物件(ServletContext):每個Web應用程式在被啟動時都會建立一個唯一的內容物件,Servlet可通過其獲得Web應用程式的初始化參數或Servlet容器的版本等資訊,也可被Servlet用來與其他Servlet共用資料。

1、獲得ServletContext應用:

(1)、直接調用getServletContext()方法

ServletContext context = getServletContext();

(2)、使用ServletConfig應用,再調用它的getServletContext()方法

ServletContext context = getServletConfig.getServletContext();

2、獲得應用程式的初始化參數:

(1)、public String getInitParameter(String name):返回指定參數名的字串參數值,沒有則返回null;

(2)、public Enumeration getInitParameterNames():返回一個包含多有初始化參數名的Enumeration對象;

3、通過ServletContext對象獲得資源

(1)、public URl getResource(String path):返回由給定路徑的資源的URL對象,以“/”開頭,為相對路徑,相對於Web應用程式的主目錄;

(2)、public InputStream getResourceAsStream(String path):從資源上獲得一個InputStream對象,等價於getResource(path).oprenStream();

(3)、public String getRealPath(String path):返回給定的虛擬路徑的真實路徑;

4、登陸日誌:使用log()方法可以將指定的訊息寫到伺服器的記錄檔中

(1)、public void log(String msg):參數msg為寫入記錄檔訊息

(2)、public void log(String msg,Throwable throwable):將msg指定的訊息和異常的棧跟蹤資訊寫入記錄檔

5、使用RequestDispatcher實現請求轉寄

(1)、RequestDispatcher getRequestDiapatcher(String path):必須以"/"開頭相對於應用程式根目錄,而ServletRequest可以傳遞一個相對路徑

(2)、RequestDipatcher getNamedDiapatcher(String name):參數name為一個命名的Servlet對象

6、使用ServletContextObject Storage Service資料

(1)、public void serAttribute(String name,Object object):將給定名稱的屬性值對象綁定到內容物件上;

(2)、public Object getAttribute(String name):返回綁定到內容物件的給定名稱的屬性值;

(3)、public Enumeration getAttributeNames():返回綁定到內容物件上的所有屬性名稱的Enumeration對象;

(4)、public void removeAttribute(String name):刪除綁定到內容物件指定名稱的屬性;

ServletRequest共用的對象僅在請求的生存周期中可以被訪問;

HttpSession共用的對象僅在會話的生存周期中可以被訪問;

ServletContext共用的對象在整個Web應用程式啟動的生存周期中可以被訪問;

7、檢索Servlet容器的資訊

(1)、public String getServletInfo():返回Servlet所運行容器的名稱和版本;

(2)、public int getMajorVersion():返回容器所支援的Servlet API的主要版本號;

(3)、public int  getMinorVersion():返回容器所支援的Servlet API的次版本號碼;

(4)、public String getServletContext():返回ServletContext對應的web應用程式名稱<display-name>元素定義的名稱;

三、Servlet的多線程問題

1、當涉及到Servlet需要共用資源是,需保證Servlet是安全執行緒的

2、注意事項:

(1)、用方法的局部變數保持請求中的專有資料;

(2)、只用Servlet的成員變數來存放那些不會改變的資料;

(3)、對可能被請求修改的成員變數同步(用Synchronized關鍵字修飾);

(4)、如果Servlet訪問外部資源,那麼需要同步訪問這些資源;

3、實現SingleThreadModel介面的Servlet在被多個客戶請求時一個時刻只能有一個線程運行,不推薦使用。

4、如果必須在servlet使用同步代碼,應盡量在最小的範圍上(代碼塊)進行同步,同步代碼越少,Servlet執行才能越好,避免對doGet()或doPost()方法同步。


出處:http://blog.csdn.net/cl05300629/article/details/9362601 作者:佇望碧落

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.