天天看點

一文搞懂紹Servlet規範。

目錄

  • ​​一、Servlet規範介紹:​​
  • ​​二、Servlet接口實作類:​​
  • ​​三、Servlet接口實作類開發步驟:​​
  • ​​四、Servlet對象的生命周期:​​
  • ​​五、HttpServletResponse接口:​​
  • ​​六、HttpServletRequest接口:​​
  • ​​七、請求對象和響應對象生命周期​​
  • ​​八、歡迎資源檔案​​
  • ​​1.預設歡迎資源檔案:​​
  • ​​2.Tomcat對于預設歡迎資源檔案定位規則​​
  • ​​3.設定目前網站的預設歡迎資源檔案規則​​
  • ​​九、Http狀态碼​​
  • ​​十、多個servlet之間調用規則:​​
  • ​​1. 重定向解決方案:​​
  • ​​2.請求轉發解決方案:​​
  • ​​十一、多個Servlet之間資料共享實作方案:​​
  • ​​1.ServletContext接口​​
  • ​​2.Cookie​​
  • ​​3.HttpSession接口:​​
  • ​​4.HttpServletRequest接口實作資料共享:​​
  • ​​十二、監聽器接口​​
  • ​​十三、Filter接口(過濾器接口)​​

一、Servlet規範介紹:

1.JavaEE規範中的一種。

2.作用:

1)在servlet規範中,指定【動态資源檔案】開發步驟

2)在servlet規範中,指定Http伺服器調用動态資源檔案的規則

3)在servlet規範中,指定Http伺服器管理動态資源檔案執行個體對象規則

二、Servlet接口實作類:

1.Servlet接口是Servlet規範下的一個接口,這個接口存在Http伺服器jar包

2.Tomcat伺服器下lib檔案中有Servlet規範的jar包 (javax.servlet.Servlet接口)

3.Servlet規範中,http伺服器能調用的【動态資源檔案】必須為一個servlet接口實作類。

三、Servlet接口實作類開發步驟:

第一步:建立一個java類繼承于HttpServlet父類,使其成為Servlet接口的實作類

第二步:重寫HttpServlet中兩個方法,doGet和doPost

浏覽器----------->oneServle.doGet();

第三步:将Servlet接口實作類資訊【注冊】到Tomcat伺服器。

【網站】---------->【web】--------->【WEB-INF】--------->web.xml
<!---将Servlet接口實作類類路徑的位址交給Tomcat--->
     <servlet>
          <servlet-name>mm</servlet-name><!----聲明一個變量存儲servlet接口實作類類路徑--->
          <servlet-class>com.servlettext.controller.OneServlet</servlet-class><!-----聲明servlet接口實作類類路徑-->
   </servlet>


 <!---為了降低使用者通路Servlet接口實作類難度,需要設定簡短請求别名--->
 <servlet-mapping>
         <servlet-name>mmm</servlet-name>
         <url-pattern>/one</url-pattern> <!-設定簡短請求别名,别名書寫時必須以/開頭-->
 </servlet-mapping>
 http://localhost:8080/myWeb/one      

四、Servlet對象的生命周期:

1.網站中所有Servlet接口實作類執行個體對象,隻能由HTTP伺服器負責建立,開發人員不能手動去建立Servlet接口實作類的執行個體對象

2.在預設沒情況下,Http伺服器接受到對于目前Servlet接口實作類第一次請求時,自動建立這個Servlet接口實作類的執行個體對象。在手動配置的情況下,要求Http伺服器在啟動時自動建立某個Servlet接口實作類的執行個體對象。

<servlet>
          <servlet-name>mm</servlet-name><!----聲明一個變量存儲servlet接口實作類類路徑--->
          <servlet-class>com.servlettext.controller.OneServlet</servlet-class><!-----聲明servlet接口實作類類路徑-->
          <load-on-startup>30</load-on-startup><!--填寫一個大于0的整數-->
   </servlet>      

3.在Http伺服器運作期間一個Servlet接口實作類隻能被建立出一個執行個體對象。

4.在Http伺服器關閉時,自動将網站中所有Servlet對象進行銷毀。

五、HttpServletResponse接口:

1.介紹:

1)HttpServletResponse接口來自于Servlet規範中,在Tomcat中存在servlet-api.jar

2)HttpServletResponse接口實作類由Http伺服器負責提供

3)HttpServletResponse接口負責将doGet/doPost方法執行結果寫入到【響應體】交給浏覽器

4)開發人員習慣于将HttpServletResponse接口修飾的對象稱為【響應對象】

2.主要功能:

1)将執行結果以二進制形式寫入響應體

2)設定響應頭中【content-type】屬性值,進而控制浏覽器使用對應編譯器将響應體二進制資料編譯為【文字、圖檔、視訊】

3)設定響應頭中【location】屬性,将一個請求位址指派給location,進而控制浏覽器向指定伺服器發送請求

六、HttpServletRequest接口:

1.介紹:

1)HttpServletRequest接口來自于Servlet規範中,在Tomcat中存在servlet-api.jar

2)HttpServletRequest接口實作類由Http伺服器負責提供

3)HttpServletRequest接口負責在doGet/doPost方法運作時讀取Http請求協定包中資訊

4)開發人員習慣于将HttpServletRequest接口修飾的對象稱為【請求對象】

2.作用:

1)可以讀取Http請求協定包中【請求行】資訊 2)讀取儲存在Http請求協定包中【請求頭】或者【請求體】中的請求參數資訊

3)代替浏覽器向Http伺服器申請資源檔案調用

七、請求對象和響應對象生命周期

  • 在Http伺服器接收到浏覽器發送的【Http請求協定包】之後,自動的為目前的【Http請求協定包】生成一個【請求對象】和一個【響應對象】
  • 在Http伺服器調用doGet/doPost方法,負責将

    【請求對象】和【響應對象】作為實參傳遞到方法,確定doGet/doPost正确執行

  • 在Http伺服器準備推送Http響應協定包之前負責将本次請求關聯的【請求對象】和【響應對象】銷毀

【請求對象】和【響應對象】生命周期貫穿一次請求的處理過程中

八、歡迎資源檔案

1.預設歡迎資源檔案:

使用者發送了一個針對某個網站的【預設請求】時,此時由Http伺服器自動從目前網站傳回的資源檔案。

正常請求:http://localhost:8080/myWeb/index.html

預設請求:http://localhost:8080/myWeb/

2.Tomcat對于預設歡迎資源檔案定位規則

1)規則位置:Tomcat安裝位置/conf/web.xml

2)規則指令:

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>      

3.設定目前網站的預設歡迎資源檔案規則

1)規則位置:網站/web/web-inf/web.xml

2)規則指令:

<welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>      

3)網站設定自定義預設檔案定位規則,此時Tomcatt自帶的定位規則将消失。

九、Http狀态碼

1.介紹:

1)由三位數字組成的符号

2)Http伺服器在推送響應包之前,根據本次請求處理情況将Http狀态碼寫入到響應包中【狀态行】上

3)作用:如果Http伺服器針對本次請求,傳回了對應的資源檔案。通過Http狀态碼通知浏覽器應該如何處理這個結果

如果iHttp伺服器針對本次請求,無法傳回對應的資源檔案通過Http狀态碼向浏覽器解釋不能提供服務的原因

2.分類:

1)組成 100----599 分為五大類

2)1xx:

(最有特征)100:通知浏覽器本次傳回的資源檔案并不是一個獨立的資源檔案,需要浏覽器在接受響應包之後,繼續向Http伺服器索要依賴的其他資源檔案。

3)2xx:

(最有特征)200:通知浏覽器本次傳回的是一個完整的獨立資源檔案,浏覽器接受之後不需要去索要其他關聯檔案

4)3xx:

(最有特征)302:通知浏覽器本次傳回的不是一個資源檔案的内容,而是資源檔案的位址需要浏覽器根據這個位址自動發起請求來索要這個資源檔案。

response.sendRedirect(“資源檔案位址”)寫入到響應頭中location,這個行為導緻Tomcat将302狀态碼寫入到狀态行

5)4XX:

404:通知浏覽器,由于在服務端沒有定位到被通路的資源檔案是以無法提供服務

405:通知浏覽器,在服務端已經定位到被通路的資源檔案(servlet)。但是這個Servlet對于浏覽器采取的請求方式不能處理

6)5xx:

500:通知浏覽器,在服務端已經定位到被通路的資源檔案(Servlet).這個servlet可以接收浏覽器采用請求方式,但是servlet在處理請求期間,由于java異常導緻處理失敗

十、多個servlet之間調用規則:

1.前提條件:

某些來自于浏覽器發送請求,往往需要服務端中多個servlet進行協同處理,但是浏覽器一次隻能通路一個servlet,導緻客戶需要手動通過浏覽器發起多次請求才能得到服務。這樣增加客戶獲得服務難度,客戶選擇放棄通路此網站。

2.提高使用者使用感受規則:

無論本次請求涉及到多少個Servlet,使用者隻需要【手動】通知浏覽器發起一次請求即可。

3.實作方案:

1)重定向解決方案 2)請求轉發解決方案

1. 重定向解決方案:

工作原理:

使用者第一次通過手動的方式通知浏覽器通路OneServlet,oneServlet工作完畢後,将TwoServlet位址寫入到響應頭的location屬性中,導緻Tomcat将302的狀态碼寫入到狀态行中,在浏覽器接收到響應包之後,讀取到302狀态碼,此時浏覽器自動根據響應頭中location屬性位址發起第二次請求,通路TwoServlet去完成請求中剩餘的任務

實作指令:

response.sendRedirect(請求位址);降低至寫入到響應包的響應頭中location屬性

特征:

1)請求位址:

即可以把目前網站(/網站名/資源檔案名)内部的資源檔案位址發送給浏覽器,也可以把其他網站(http://ip位址:端口号/網站名/資源檔案名)資源檔案位址發送給浏覽器。

2)請求次數: 浏覽器至少發送兩次請求,隻有第一次是使用者手動發送的,後續請求是浏覽器自動發送的。

3)請求方式:

重定向解決方案是通過位址欄發起下一次請求,是以通過重定向解決方案調用的資源檔案接受的請求方式一定是【Get】

缺點:

重定向解決方案需要在浏覽器與伺服器之間進行多次往返,大量時間消耗在往返次數上,增加使用者等待服務時間

2.請求轉發解決方案:

原理:

使用者第一次通過手動的方式要求浏覽器通路OneServlet,oneServlet工作完畢後,通過目前的請求對象代替浏覽器向Tomcat發送請求,申請調用TwoServlet。Tomcat在接收到這個請求之後,自動調用TwoServlet完成剩餘任務

實作指令:

請求對象代替浏覽器向Tomcat發送請求
//1.通過目前請求對象生成資源檔案申請報告對象
RequestDispatcher  report=request.getRequestDispatcher(:" /資源檔案名稱");
   //2.将報告對象發送給Tomcat
 report.forward(目前請求對象,目前響應對象);      

優點:

1)無論本次請求涉及到多少個Servlet,使用者隻需要手動向浏覽器發送一次請求

2)Servlet之間調用發生在服務端電腦,節省浏覽器與服務端之間的往返次數。增加處理服務的速度

特征:

1)請求次數: 在請求轉發過程中,浏覽器隻發送一次請求

2)請求位址 隻能向Tomcat伺服器申請調用目前網站下的資源檔案位址

​request.getRequestDispathcer("/資源檔案名");​

​ 不能寫網站名**

3)請求方式請求轉發過程中,浏覽器隻發送了一個Http請求協定包,參與本次請求的所有Servlet共享同一個請求協定包,是以這些Servlet接受的請求方式與浏覽器的請求方式保持一緻。

十一、多個Servlet之間資料共享實作方案:

  • 資料共享:

OneServlet工作完畢後,将産生的資料交給TwoServlet使用

  • Servlet規範中提供四種資料共享方案
1)ServletContext接口 2)Cookie類 3)HttpSession接口 4)HttpServletRequest接口

1.ServletContext接口

  • 介紹:

1)來自于Servlet規範中的一個接口。在Tomcat中存在servlet-api.jar在Tomcat中負責提供接口的實作類

2)如果兩個Servlet來自于同一個網站。彼此之間通過網站的ServletContext執行個體對象實作資料共享

3)ServletContext執行個體對象稱為【全局作用域對象】

  • 工作原理:
每個網站都存在一個全局作用域對象。【相當于】一個Map集合。在這個網站中OneServlet可以将一個資料存入到全局作用域對象中,目前網站中其他Servlet此時都可以從全局作用域對象中得到這個資料進行使用
  • 全局作用域對象生命周期:

1)在Http伺服器啟動過程中,自動為目前網站記憶體中建立一個全局作用域對象

2)在Http伺服器運作期間,一個網站隻有一個全局作用域對象

3)在Http伺服器運作期間,全局作用域對象一直存活狀态

4)在Http伺服器準備關閉時,将目前網站中全局作用域對象進行銷毀

全局作用域對象生命周期貫穿于網站整個運作期間

  • 指令的實作:同一個網站中,OneServlet将資料共享給TwoServlet
OneServlet{
public void doGet(HttpServletRequest  request,HttpServletResponse response){

    //1.通過【請求對象】向Tomcat索要目前網站中【全局作用域對象】
    ServletContext  application=request.getServletContext();  
    //2.将資料添加到全局作用域對象作為【共享資料】
    application.setAttribute(" key1",資料);


    }
}

TwoServlet{
public void doGet(HttpServletRequest  request,HttpServletResponse response){

    //1.通過【請求對象】向Tomcat索要目前網站中【全局作用域對象】
    ServletContext  application=request.getServletContext();  
    //2.從全局作用域對象得到指定關鍵字對應資料
    Object 資料= application.getAttribute(" key1");


    }
}      

2.Cookie

  • 介紹:

1)Coookie來自于Servlet規範中的一個工具類,存在于Tomcat提供的servlet-api.jar包

2)如果兩個Servlet來自于同一個網站,并且為同一個浏覽器/使用者提供服務,此時借助于Cookie對象進行資料共享

3)Cookie存放的目前使用者的私人資料,在共享資料的過程中提高服務品質

  • 原理:

使用者通過浏覽器第一次向myweb網站發送請求申請OneServlet,OneServlet在運作期間建立一個Cookie存儲目前使用者相關資料,OneServlet工作完畢後,【将Cookie寫入到響應頭中】交還給目前浏覽器。

浏覽器收到響應包之後,将Cookie存儲在浏覽器的緩存中,一段時間後,使用者通過同一個浏覽器再次向myweb發送請求申請TwoServlet時,浏覽器需要無條件将myweb網站之前推送過來的Cookie,寫入到請求頭中,發送過去。此時TwoServlet在運作時通過讀取請求頭中的Cookie中資訊,得到OneServlet提供的共享資料。

  • 實作指令:同一個網站中的OneServlet與TwoServlet借助于Cookie實作資料共享
OneServlet{
public void doGet(HttpServletRequest  request,HttpServletResponse response){
    //1.建立一個Cookie對象儲存共享資料(目前使用者資料)
    Cookie  card=new  Cookie("key1","abc“);  
    Cookie  card=new  Cookie("key2","efg“);  
    //cookie相當于Map
    //一個Cookie對象存放一個鍵值對
    //鍵值對中的value隻能是String
    //鍵值對中的key不能是中文
    //2。将cookie寫入到響應頭,交給浏覽器
    response.addCookie(card);
    response.addCookie(card2);
    }
}      
TwoServlet{
public void doGet(HttpServletRequest  request,HttpServletResponse response){
    //1.調用請求對象從請求頭得到浏覽器傳回的cookie
    Cookie cookieArray[ ]=request.getCookies();
    //2。循環周遊資料得到每一個Cookie的key與value
    for(Cookie card; cookieArray){
    String key=card.getName();//讀取key  "key1"
    Strng value=card.getValue();//讀取value " abc"
    提供較好的服務
      }
    }
}      
  • 銷毀時機:

1)在預設情況下,Cookie對象存放在浏覽器的緩存中嗎,隻要浏覽器關閉Cookie對象就會銷毀

2)手動設定情況下,可以要求浏覽器将接收到的Cookie存放在用戶端計算機的硬碟上,同時需要制定硬碟上的存活時間.存活時間範圍内,關閉浏覽器,關閉用戶端計算機,關閉伺服器,都不會導緻Cookie被銷毀

。在存活時間到達,Cookie自動的在硬碟上被删除

cookie.setMaxAge(60);//cookie存活60秒      

3.HttpSession接口:

  • 介紹:

1)HttpSession接口來自于Servlet規範下的一個接口,存在于Servlet-api.jar,其實作類由Http伺服器提供。

2)如果兩個Servlet來自于同一個網站,并且為同一個浏覽器/使用者提供服務,此時借助于HttpSession對象進行資料共享

3)開發人員習慣于将HttpSession接口修飾對象稱為【會話作用域對象】

  • HttpSession 與 Cookie 差別:【面試題】

1)存儲位置: 一個在天上,一個在地下

Cookie:存放在用戶端計算機(浏覽器記憶體/硬碟) HttpSession:存放在服務端計算機記憶體

2)資料類型: Cookie對象存儲共享資料類型隻能是String

HttpSession對象可以存儲任意類型的共享資料Object

3)資料數量: 一個Cookie對象隻能存儲一個共享資料

HttpSession使用map集合存儲共享資料,是以可以 存儲任意數量共享資料

4)參照物: Cookie相當于客戶在服務端【會員卡】 HttpSession相當于客戶在服務端【私人保險櫃】

  • 指令實作: 同一個網站(myWeb)下OneServlet将資料傳遞給TwoServlet
OneServlet{
      public void doGet(HttpServletRequest request,HttpServletResponse response){  
                //1.調用請求對象向Tomcat索要目前使用者在服務端的私人儲物櫃
               HttpSession   session = request.getSession();
                           //2.将資料添加到使用者私人儲物櫃
              session.setAttribute("key1",共享資料)
         }   
     }      
浏覽器通路/myWeb中TwoServlet      
TwoServlet{    
   public void doGet(HttpServletRequest request,HttpServletResponse response){
                   //1.調用請求對象向Tomcat索要目前使用者在服務端的私人儲物櫃
                    HttpSession   session = request.getSession();
                        //2.從會話作用域對象得到OneServlet提供的共享資料
                    Object 共享資料 = session.getAttribute("key1");
            }
    }      

Http伺服器如何将使用者與HttpSession關聯起來 使用cookie

  • getSession() 與 getSession(false)

1)getSession(): 如果目前使用者在服務端已經擁有了自己的私人儲物櫃. 要求tomcat将這個私人儲物櫃進行傳回 如果目前使用者在服務端尚未擁有自己的私人儲物櫃 要求tocmat為目前使用者建立一個全新的私人儲物櫃

2)getSession(false):如果目前使用者在服務端已經擁有了自己的私人儲物櫃. 要求tomcat将這個私人儲物櫃進行傳回 如果目前使用者在服務端尚未擁有自己的私人儲物櫃 此時Tomcat将傳回null

  • HttpSession銷毀時機:

1.使用者與HttpSession關聯時使用的Cookie隻能存放在浏覽器緩存中.

2.在浏覽器關閉時,意味着使用者與他的HttpSession關系被切斷

3.由于Tomcat無法檢測浏覽器何時關閉,是以在浏覽器關閉時并不會

導緻Tomcat将浏覽器關聯的HttpSession進行銷毀

4.為了解決這個問題,Tomcat為每一個HttpSession對象設定【空閑時間】

這個空閑時間預設30分鐘,如果目前HttpSession對象空閑時間達到30分鐘

此時Tomcat認為使用者已經放棄了自己的HttpSession,此時Tomcat就會銷毀

掉這個HttpSession

  • HttpSession空閑時間手動設定
在目前網站/web/WEB-INF/web.xml
        <session-config>
               <session-timeout>5</session-timeout> <!--目前網站中每一個session最大空閑時間5分鐘-->
        </session-config>      

4.HttpServletRequest接口實作資料共享:

  • 介紹:

1) 在同一個網站中,如果兩個Servlet之間通過【請求轉發】方式進行調用,

彼此之間共享同一個請求協定包。而一個請求協定包隻對應一個請求對象 是以servlet之間共享同一個請求對象,此時可以利用這個請求對象在兩個

Servlet之間實作資料共享 2) 在請求對象實作Servlet之間資料共享功能時,開發人員将請求對象稱為【請求作用域對象】

  • 指令實作: OneServlet通過請求轉發申請調用TwoServlet時,需要給TwoServlet提供共享資料
OneServlet{
           public void doGet(HttpServletRequest req,HttpServletResponse response){
                  //1.将資料添加到【請求作用域對象】中attribute屬性
                req.setAttribute("key1",資料); //資料類型可以任意類型Object
                               //2.向Tomcat申請調用TwoServlet
                     req.getRequestDispatcher("/two").forward(req,response)
           }
       }      
TwoServlet{
            public void doGet(HttpServletRequest req,HttpServletResponse response){
                                                //從目前請求對象得到OneServlet寫入到共享資料
              Object 資料 = req.getAttribute("key1");
            }
     }      

十二、監聽器接口

  • 介紹:

1)一組來自于Servlet規範下接口,共有8個接口。在Tomcat存在servlet-api.jar包

2)監聽器接口需要由開發人員親自實作,Http伺服器提供jar包并沒有對應的實作類

3)監聽器接口用于監控【作用域對象生命周期變化時刻】以及【作用域對象共享資料變化時刻】

  • 作用域對象:

1)在Servlet規範中,認為在服務端記憶體中可以在某些條件下為兩個Servlet之間提供資料共享方案的對象,被稱為【作用域對象】

2)Servlet規範下作用域對象:

ServletContext: 全局作用域對象

HttpSession : 會話作用域對象

HttpServletRequest:請求作用域對象

  • 監聽器接口實作類開發規範:三步

1)根據監聽的實際情況,選擇對應監聽器接口進行實作

2)重寫監聽器接口聲明【監聽事件處理方法】

3)在web.xml檔案将監聽器接口實作類注冊到Http伺服器

  • ServletContextListener接口:

1)作用:通過這個接口合法的檢測全局作用域對象被初始化時刻以及被銷毀時刻

2)監聽事件處理方法:

​public void contextInitlized() :在全局作用域對象被Http伺服器初始化被調用​

​public void contextDestory(): 在全局作用域對象被Http伺服器銷毀時候觸發調用​

  • ServletContextAttributeListener接口

1)作用:通過這個接口合法的檢測全局作用域對象共享資料變化時刻

2)監聽事件處理方法:

public void contextAdd():在全局作用域對象添加共享資料      
public void contextReplaced():在全局作用域對象更新共享資料      
public void contextRemove():在全局作用域對象删除共享資料      
  • 全局作用域對象共享資料變化時刻
ServletContext application = request.getServletContext();
 application.setAttribute("key1",100); //新增共享資料
 application.setAttribute("key1",200); //更新共享資料
 application.removeAttribute("key1");  //删除共享資料      

十三、Filter接口(過濾器接口)

  • 介紹:

1)來自于Servlet規範下接口,在Tomcat中存在于servlet-api.jar包

2)Filter接口實作類由開發人員負責提供,Http伺服器不負責提供

3)Filter接口在Http伺服器調用資源檔案之前,對Http伺服器進行攔截

  • 具體作用:

1)攔截Http伺服器,幫助Http伺服器檢測目前請求合法性

2)攔截Http伺服器,對目前請求進行增強操作

  • Filter接口實作類開發步驟:三步

1)建立一個Java類實作Filter接口

2)重寫Filter接口中doFilter方法

3)web.xml将過濾器接口實作類注冊到Http伺服器

  • Filter攔截位址格式
1)指令格式:
<filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>攔截位址</url-pattern>
  </filter-mapping>      

2)指令作用:

攔截位址通知Tomcat在調用何種資源檔案之前需要調用OneFilter過濾進行攔截

3)要求Tomcat在調用某一個具體檔案之前,來調用OneFilter攔截

<url-pattern>/img/mm.jpg</url-pattern>      
4)要求Tomcat在調用某一個檔案夾下所有的資源檔案之前,來調用OneFilter攔截
<url-pattern>/img/*</url-pattern>      
5)要求Tomcat在調用任意檔案夾下某種類型檔案之前,來調用OneFilter攔截
<url-pattern>*.jpg</url-pattern>      
6)要求Tomcat在調用網站中任意檔案時,來調用OneFilter攔截
<url-pattern>/*</url-pattern>