日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Servlet----ServletContext

發布時間:2023/11/28 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet----ServletContext 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在正式講解之前,先讓大家有一個整體印象。
之前講過ServletConfig,我發現他們有兩個共同的方法,我對他們的區別做了小小的總結

JavaWeb系列的其他教程,持續更新中

JavaWeb系列教程
JavaWeb—Servlet
模擬Servlet本質
使用IDEA開發Servlet程序
Servlet對象的生命周期
適配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
HTTP協議,get和post的區別
web站點歡迎頁
一篇學會HttpServletRequest

上面的思維導圖是對下面內容的總結,大家可以先看看,對等會的內容有一個大概印象,看完后,可以再回頭看看這個思維導圖。

如果大家覺得有幫助的話,不妨動動小手,點贊收藏一波,也方便后面的復習哈

ServletContext是什么

  • ServletContext是一個接口,是Servlet規范中的一員,

  • ServletContext對象的創建也是Tomcat服務器來完成的。啟動webapp的時候創建的。

  • ServletContext是誰實現的

    Tomcat服務器(WEB服務器)實現了ServletContext接口
    public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext{}

  • Servlet對象是誰創建的,在什么時候創建的

ServletContext對象是WEB服務器啟動的時候創建的
ServletContext對象是WEB服務器創建的

ServletContext的生命周期

  • 對于一個WEBAPP來說,ServletContext對象只有一個

  • 一個web應用對應一個ServletContext實例,這個實例是應用部署啟動后,servlet容器為應用創建的。

  • 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 servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext對象:"+servletContext+"<br>");

一個webapp應用共享一個ServletContext對象

        ServletContext servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext對象:"+servletContext+"<br>");



  • ServletContext被稱為Servlet上下文對象。(Servlet對象的四周環境對象。)

  • 一個ServletContext對象通常對應的是一個web.xml文件。

  • ServletContext對應顯示生活中的什么例子呢?

    • 一個教室里有多個學生,那么每一個學生就是一個Servlet,這些學生都在同一個教室當中,那么我們可以把這個教室叫做ServletContext對象。那么也就是說放在這個ServletContext對象(環境)當中的數據,在同一個教室當中,物品都是共享的。比如:教室中有一個空調,所有的學生都可以操作。可見,空調是共享的。因為空調放在教室當中。教室就是ServletContext對象。

    • Tomcat是一個容器,一個容器可以放多個webapp,一個webapp對應一個ServletContext對象

    • ServletContext接口中常用的方法

public String getInitParameter(String name); // 通過初始化參數的name獲取value
public Enumeration<String> getInitParameterNames(); // 獲取所有的初始化參數的name
        ServletContext servletContext = this.getServletContext();response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("ServletContext對象:"+servletContext+"<br>");String initParameter = servletContext.getInitParameter("pageSize");writer.println("pageSize=  "+initParameter);
  Enumeration<String> names = servletContext.getInitParameterNames();while (names.hasMoreElements()){String s = names.nextElement();//通過name獲取valueString initParameter = servletContext.getInitParameter(s);writer.println(s+"--->"+initParameter+"<br>");}


<!--以上兩個方法是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源碼當中,不要將應用的根路徑寫死,因為你永遠都不知道這個應用在最終部署的時候,起一個什么名字。

 獲取項目的根路徑獲取應用的根路徑(非常重要),因為在java源代碼當中有一些地方可能會需要應用的根路徑,這個方法可以動態獲取應用的根路徑在java源碼當中,不要將應用的根路徑寫死,因為你永遠都不知道這個應用在最終部署的時候,起一個什么名字。writer.print("獲取項目的根路徑:");String contextPath = servletContext.getContextPath();//  /servlet04writer.println(contextPath+"<br>");

獲取文件的絕對路徑String realPath = servletContext.getRealPath("AServlet.java");writer.println(realPath+"<br>");

  通過ServletContext對象也是可以記錄日志的
public void log(String message);
public void log(String message, Throwable t);這些日志信息記錄到哪里了?localhost.2022-03-12.logTomcat服務器的logs目錄下都有哪些日志文件?catalina.2022-03-12.log 服務器端的java程序運行的控制臺信息。localhost.2022-03-12.log ServletContext對象的log方法記錄的日志信息存儲到這個文件中。localhost_access_log.2022-03-12.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當中了。

本次內容到這里就結束了,感謝大家的支持,javaweb系列的教程正在持續更新

希望得到大家的支持

總結

以上是生活随笔為你收集整理的Servlet----ServletContext的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。