這兩天剛剛回顧了一下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 作者:佇望碧落