Servlet線程安全ConfigContext

Servlet線程安全

多個客戶端併發訪問同一個Servlet時,web服務器會爲每一個客戶端的訪問請求創建一個線程,並調用service方法,如果service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題

操作共享資源纔有線程安全問題

static修飾屬於類,類加載即初始化,被類對象共享,併發訪問會有線程安全問題,內存崩潰

慎用靜態

將可能發生線程安全的代碼放進同步代碼塊中synchronized(){}會等前一個訪問結束再處理第二個訪問(不能同步訪問)

 

如果實現了SingleThreadModel接口,Servlet引擎將以單線程模式來調用service方法

SingleThreadModel接口沒有定義任何方法

(標記接口比如Serializable可序列化Cloneable可被克隆)

 

實現了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程併發訪問,其採用的方式是產生多個Servlet實例對象,併發的每個線程分別調用一個獨立的Servlet實例對象

 

並不能真正的解決線程安全問題,真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題

在Servlet API 2.4中, SingleThreadModel被標記爲Deprecated過時的

 

子類覆寫父類的方法時,不能拋出比父類更多的異常

 

ServletConfig對象

在Servlet配置文件中,可以使用一個或多個<init-param>標籤爲servlet配置一些初始化參數

 

當servlet配置了初始化參數後,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息

得到名字爲name的指定value值

String value =this.getServletConfig().getInitParameter(“name”);

得到所有的

Enumeration e =this.getServletConfig().getInitParameterNames();

While(e.hasMoreElements()){

       Stringname = (String)e.nextElement();

       Stringvalue = this.getServletConfig().getInitParameter(name);

}

 

閱讀ServletConfig API舉例說明該對象的作用

不適合在servlet程序中寫死的東西,這類數據就可以通過配置方式配給servlet例如

獲得字符集編碼

獲得數據庫連接信息

獲得配置文件,查看struts案例的web.xml文件

ServletContext

WEB容器在啓動時,會爲每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用
接口Interface ServletContext

ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象

查看ServletContext API文檔,瞭解ServletContext對象的功能

ServletContext方法的應用

由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,所以多個Servlet通過ServletContext對象實現數據共享,ServletContext對象通常也被稱之爲context域對象(request session page)(聊天室)

ServletContext域:
1.這是一個容器
2.作用整個應用程序範圍(實現數據共享)

獲取WEB應用的初始化參數

<context-param>裏面寫的初始化參數作用於web應用的所有servlet</context-param>

實現Servlet的轉發

利用ServletContext對象讀取資源文件

1.得到文件路徑
2.讀取資源文件的三種方式
3.配置文件方式:數據沒關係 properties文件(屬性文件)
                  數據有關係 xml文件
properties文件資源的讀取:
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//這裏要看db.properties文件的資源路徑 
Properties props = new Properties();
props.load(in); //用Properties對象讀入
String url = props.getProperty("url"); //key-value對讀取value值
讀取資源文件的問題
web工程 發佈都是發佈到服務器上,服務器上沒有src,src下會發布到/WEB-INF/classes文件夾下
傳統方式路徑默認是相對路徑 讀取配置文件是相對java虛擬機的啓動目錄 會找不到對應的配置文件 最好採用ServletContext方式去讀取配置文件 

如果要用傳統流讀取資源文件 用getRealPath("/絕對路徑")來獲取

WEB應用中的普通Java程序如何讀取資源文件

如果讀取資源文件的程序不是servlet的話,只能通過類裝載器去讀取
InputStreanm in = UserDao.class.getClassLoader().getResourceAsStream("db.properties");
整個資源文件只讀取一次即可
一般放入靜態代碼塊static{裏面異常要try-catch 拋初始化錯誤}
注意:讀取的資源文件不能太大(以類的方式讀取,直接放入內存,只裝載一次無法獲得更新後的數據)
如果想讀取到更新的數據

String path = UserDao.classgetClassLoader().getResource("db.properties").getPath();
//先通過類裝載的方式得到文件的位置
FileInputStream in = new FileInputStream(path);
//再通過傳統方式讀取資源文件的數據,這樣更新後數據能被讀取

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