ServletContext
-
一個Servlet物件對應一個ServletConfig,100個Servlet物件則對應100個ServletConfig物件,
-
只要在同一個webapp當中,只要在同一個應用當中,所有的Servlet物件都是共享同一個ServletContext物件的,
-
ServletContext物件在服務器啟動階段創建,在服務器關閉的時候銷毀,這就是ServletContext物件的生命周期,ServletContext物件是應用級物件,
-
Tomcat服務器中有一個webapps,這個webapps下可以存放webapp,可以存放多個webapp,假設有100個webapp,那么就有100個ServletContext物件,但是,總之,一個應用,一個webapp肯定是只有一個ServletContext物件,
-
ServletContext被稱為Servlet背景關系物件,(Servlet物件的四周環境物件,)
-
一個ServletContext物件通常對應的是一個web.xml檔案,
-
ServletContext對應顯示生活中的什么例子呢?
- 一個教室里有多個學生,那么每一個學生就是一個Servlet,這些學生都在同一個教室當中,那么我們可以把這個教室叫做ServletContext物件,那么也就是說放在這個ServletContext物件(環境)當中的資料,在同一個教室當中,物品都是共享的,比如:教室中有一個空調,所有的學生都可以操作,可見,空調是共享的,因為空調放在教室當中,教室就是ServletContext物件,
-
ServletContext是一個介面,Tomcat服務器對ServletContext介面進行了實作,
- ServletContext物件的創建也是Tomcat服務器來完成的,啟動webapp的時候創建的,
-
ServletContext介面中有哪些常用的方法?
-
public String getInitParameter(String name); // 通過初始化引數的name獲取value public Enumeration<String> getInitParameterNames(); // 獲取所有的初始化引數的name -
<!--以上兩個方法是ServletContext物件的方法,這個方法獲取的是什么資訊?是以下的配置資訊--> <context-param> <param-name>pageSize</param-name> <param-value>10</param-value> </context-param> <context-param> <param-name>startIndex</param-name> <param-value>0</param-value> </context-param> <!--注意:以上的配置資訊屬于應用級的配置資訊,一般一個專案中共享的配置資訊會放到以上的標簽當中,--> <!--如果你的配置資訊只是想給某一個servlet作為參考,那么你配置到servlet標簽當中即可,使用ServletConfig物件來獲取,--> -
// 獲取應用的根路徑(非常重要),因為在java源代碼當中有一些地方可能會需要應用的根路徑,這個方法可以動態獲取應用的根路徑 // 在java原始碼當中,不要將應用的根路徑寫死,因為你永遠都不知道這個應用在最終部署的時候,起一個什么名字, public String getContextPath(); //String contextPath = application.getContextPath(); -
// 獲取檔案的絕對路徑(真實路徑) public String getRealPath(String path); -
// 通過ServletContext物件也是可以記錄日志的 public void log(String message); public void log(String message, Throwable t); // 這些日志資訊記錄到哪里了? // localhost.2021-11-05.log // Tomcat服務器的logs目錄下都有哪些日志檔案? //catalina.2021-11-05.log 服務器端的java程式運行的控制臺資訊, //localhost.2021-11-05.log ServletContext物件的log方法記錄的日志資訊存盤到這個檔案中, //localhost_access_log.2021-11-05.txt 訪問日志 -
// ServletContext物件還有另一個名字:應用域(后面還有其他域,例如:請求域、會話域) // 如果所有的用戶共享一份資料,并且這個資料很少的被修改,并且這個資料量很少,可以將這些資料放到ServletContext這個應用域中 // 為什么是所有用戶共享的資料? 不是共享的沒有意義,因為ServletContext這個物件只有一個,只有共享的資料放進去才有意義, // 為什么資料量要小? 因為資料量比較大的話,太占用堆記憶體,并且這個物件的生命周期比較長,服務器關閉的時候,這個物件才會被銷毀,大資料量會影響服務器的性能,占用記憶體較小的資料量可以考慮放進去, // 為什么這些共享資料很少的修改,或者說幾乎不修改? // 所有用戶共享的資料,如果涉及到修改操作,必然會存在執行緒并發所帶來的安全問題,所以放在ServletContext物件中的資料一般都是只讀的, // 資料量小、所有用戶共享、又不修改,這樣的資料放到ServletContext這個應用域當中,會大大提升效率,因為應用域相當于一個快取,放到快取中的資料,下次在用的時候,不需要從資料庫中再次獲取,大大提升執行效率, // 存(怎么向ServletContext應用域中存資料) public void setAttribute(String name, Object value); // map.put(k, v) // 取(怎么從ServletContext應用域中取資料) public Object getAttribute(String name); // Object v = map.get(k) // 刪(怎么洗掉ServletContext應用域中的資料) public void removeAttribute(String name); // map.remove(k)
-
-
注意:以后我們撰寫Servlet類的時候,實際上是不會去直接繼承GenericServlet類的,因為我們是B/S結構的系統,這種系統是基于HTTP超文本傳輸協議的,在Servlet規范當中,提供了一個類叫做HttpServlet,它是專門為HTTP協議準備的一個Servlet類,我們撰寫的Servlet類要繼承HttpServlet,(HttpServlet是HTTP協議專用的,)使用HttpServlet處理HTTP協議更便捷,但是你需要直到它的繼承結構:
-
jakarta.servlet.Servlet(介面)【爺爺】 jakarta.servlet.GenericServlet implements Servlet(抽象類)【兒子】 jakarta.servlet.http.HttpServlet extends GenericServlet(抽象類)【孫子】 我們以后撰寫的Servlet要繼承HttpServlet類,
-
-
大家到目前為止都接觸過哪些快取機制了?
- 堆記憶體當中的字串常量池,
- “abc” 先在字串常量池中查找,如果有,直接拿來用,如果沒有則新建,然后再放入字串常量池,
- 堆記憶體當中的整數型常量池,
- [-128 ~ 127] 一共256個Integer型別的參考,放在整數型常量池中,沒有超出這個范圍的話,直接從常量池中取,
- 連接池(Connection Cache)
- 這里所說的連接池中的連接是java語言連接資料庫的連接物件:java.sql.Connection物件,
- JVM是一個行程,MySQL資料庫是一個行程,行程和行程之間建立連接,打開通道是很費勁的,是很耗費資源的,怎么辦?可以提前先創建好N個Connection連接物件,將連接物件放到一個集合當中,我們把這個放有Connection物件的集合稱為連接池,每一次用戶連接的時候不需要再新建連接物件,省去了新建的環節,直接從連接池中獲取連接物件,大大提升訪問效率,
- 連接池
- 最小連接數
- 最大連接數
- 連接池可以提高用戶的訪問效率,當然也可以保證資料庫的安全性,
- 執行緒池
- Tomcat服務器本身就是支持多執行緒的,
- Tomcat服務器是在用戶發送一次請求,就新建一個Thread執行緒物件嗎?
- 當然不是,實際上是在Tomcat服務器啟動的時候,會先創建好N多個執行緒Thread物件,然后將執行緒物件放到集合當中,稱為執行緒池,用戶發送請求過來之后,需要有一個對應的執行緒來處理這個請求,這個時候執行緒物件就會直接從執行緒池中拿,效率比較高,
- 所有的WEB服務器,或者應用服務器,都是支持多執行緒的,都有執行緒池機制,
- redis
- NoSQL資料庫,非關系型資料庫,快取資料庫,
- 向ServletContext應用域中存盤資料,也等于是將資料存放到快取cache當中了,
- 堆記憶體當中的字串常量池,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397459.html
標籤:其他
上一篇:將聯系回復發送到電子郵件
下一篇:cgb2111-day03
