Servlet工作原理


  • Tomcat容器

  Tomcat容器—>Servlet容器—>Context容器

 

  所以, 真正管理 Servlet 的容器是 Context 容器,一個 Context 對應一個 Web 工程(非用戶),新建一個servlet的時候,就會新建一個context的,同時加載它所需要的config, 容器的配置屬性由應用的 web.xml 指定 。tomcat是基於觀察者模式設計的,
與 Servlet 主動關聯的是三個類,分別是 ServletConfig、ServletContext 、ServletRequest 和 ServletResponse。這三個類都是通過容器傳遞給 Servlet 的。 ServletConfig: 獲取這個 Servlet 的一些配置屬性。 ServletContext  : 交易場景就由 ServletContext 來描述,而定制的參數集合就由 ServletConfig 來描述。
啟動tomcat時,Servlet容器被創建,每一個web應用都會對應於一個context容器。客戶端發起了一次請求的時候,請求根據url地址指定的ip和端口號就能夠找到tomcat服務器,然后根據后面工程名也能找到對應的web服務,此時創建一個線程,根據ServletRequest進行請求的發起,servlet只是作為控制器而存在,然后根據頁面的請求內容,查找相應的服務,將結果通過servletResonse返回給客戶端。注意這里是每個請求一個線程,不是每個用戶一個線程,容器並不關心是誰發起的請求。servlet一般只會存在一個實例,是單例模式設計的,如果容器使用了群集,即將容器布置在多個JVM上, 那么每個JVM也只會有一個Servlet實例。
 
  • Servlet的生命周期

  四步:servlet類加載--->實例化--->服務--->銷毀。

  

  

1、Web Client 向Servlet容器(Tomcat)發出Http請求

2、Servlet容器接收Web Client的請求

3、Servlet容器創建一個HttpRequest對象,將Web Client請求的信息封裝到這個對象中

4、Servlet容器創建一個HttpResponse對象

5、Servlet容器調用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數

     傳給 HttpServlet對象

6、HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息

7、HttpServlet調用HttpResponse對象的有關方法,生成響應數據

8、Servlet容器把HttpServlet的響應結果傳給Web Client

 

Servlet的框架是由兩個Java包組成的:javax.servlet與javax.servlet.http。在javax.servlet包中定義了所有的Servlet類都必須實現或者擴展的通用接口和類。在javax.servlet.http包中定義了采用Http協議通信的HttpServlet類。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必須實現這個接口。

在Servlet接口中定義了5個方法,

其中3個方法代表了Servlet的生命周期:

1、init方法:負責初始化Servlet對象。

2、service方法:負責響應客戶的請求。

3、destroy方法:當Servlet對象退出生命周期時,負責釋放占用的資源。

 
1. init方法做了什么,如果重寫了servlet的init方法,怎么辦?
  init方法是負責servlet的初始化的。
  其實在 GenericServleta中有兩個init方法。
public void init(ServletConfig config)throws ServletException{  //第一個
  this.config = config;
  this.init(); 
}

·public void init()throws ServletException{   //第二個
}

  當容器(tomcat)幫忙調用init(ServletConfig config)並且給傳過來一個參數config,這個方法把參數對象的引用指向類的成員變量this.config,並且調用類的 this.init()方法。我們一般重寫init()方法都是重寫的第二個,這樣當忘記寫super.init()時不會導致空指針的錯誤。如果我們在寫Servlet類時重寫init(ServletConfig config),那么忘記寫super.init(ServletConfig config),就容易造成出現空指針異常。所以,最好不要重寫init(ServletConfig config)。

  
2. servlet的jre包在哪里?結構是怎樣的?
  首先,servlet的jre包不需要我們工程中引入,它在tomcat的lib目錄下有一個Servlet.jar。
  解壓后我們可以看到里面有許多的class文件。包括:servletCinfig、servletContext、Resquest、Responce和input、output,和cookie、Session等。
  下載Tomcat的源代碼,然后就可以看見servleT的源代碼。
  下載中文Servlet的api。
  
3. servlet的httpSession中到底有什么?
  
  public void setAttribute(String name,Object value) 
  將value對象以name名稱綁定到會話 
  public object getAttribute(String name) 
  取得name的屬性值,如果屬性不存在則返回null 
  public void removeAttribute(String name) 
  從會話中刪除name屬性,如果不存在不會執行,也不會拋處錯誤. 
  public Enumeration getAttributeNames() 
  返回和會話有關的枚舉值 
  public void invalidate() 
  使會話失效,同時刪除屬性對象 
  public Boolean isNew() 
  用於檢測當前客戶是否為新的會話 
  public long getCreationTime() 
  返回會話創建時間 
  public long getLastAccessedTime() 
  返回在會話時間內web容器接收到客戶最后發出的請求的時間 
  public int getMaxInactiveInterval() 
  返回在會話期間內客戶請求的最長時間.秒 
  public void setMasInactiveInterval(int seconds) 
  允許客戶客戶請求的最長時間 
  ServletContext getServletContext() 
  返回當前會話的上下文環境,ServletContext對象可以使Servlet與web容器進行通信 
  public String getId() 
  返回會話期間的識別號

 4. servlet中的cookie到底有什么?

  
構造cookie 的方法 :  new Cookie(鍵,值)
構造函數如下:
Cookie(java.lang.String name, java.lang.String value)

把cookie發送給客戶端
HttpServletResponse.addCookie(javax.servlet.http.Cookie)

取得客戶瀏覽器的cookie,返回的是數組
HttpServletRequest.getCookies()

getComment/setComment 
      獲取/設置Cookie的注釋。

getDomain/setDomain
  獲取/設置Cookie適用的域。一般地,Cookie只返回給與發送它的服務器名字完全相同的服務器。使用這里的方法可以指示瀏覽器把Cookie返回給同一域內的其他服務器。注意域必須以點開始(例如.sitename.com),非國家類的域(如.com,.edu,.gov)必須包含兩個點,國家類的域(如.com.cn,.edu.uk)必須包含三個點。

getMaxAge/setMaxAge
  獲取/設置Cookie過期之前的時間,以秒計。如果不設置該值,則Cookie只在當前會話內有效,即在用戶關閉瀏覽器之前有效,而且這些Cookie不會保存到磁盤上。
若生存時間為負值,代表瀏覽器關閉Cookie即消失。生存時間為0,代表刪除Cookie,生存時間為正數,代表Cookie存在多少秒。

getName/setName
  獲取/設置Cookie的名字。本質上,名字和值是我們始終關心的兩個部分。由於HttpServletRequest的getCookies方法返回的是一個Cookie對象的數組,因此通常要用循環來訪問這個數組查找特定名字,然后用getValue檢查它的值。

getPath/setPath
  獲取/設置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下的所有頁面。這里的方法可以用來設定一些更一般的條件。例如,someCookie.setPath("/"),此時服務器上的所有頁面都可以接收到該Cookie。

getSecure/setSecure
  獲取/設置一個boolean值,該值表示是否Cookie只能通過加密的連接(即SSL)發送。

getValue/setValue
  獲取/設置Cookie的值。如前所述,名字和值實際上是我們始終關心的兩個方面。不過也有一些例外情況,比如把名字作為邏輯標記(也就是說,如果名字存在,則表示true)。

getVersion/setVersion
  獲取/設置Cookie所遵從的協議版本。默認版本0(遵從原先的Netscape規范);版本1遵從RFC 2109 , 但尚未得到廣泛的支持。
幾個Cookie工具函數,獲取指定名字的Cookie值
   該函數是ServletUtilities.java的一部分。getCookieValue通過循環依次訪問Cookie對象數組的各個元素,尋找是否有指定名字的Cookie,如找到,則返回該Cookie的值;否則,返回參數中給出的默認值。getCookieValue能夠在一定程度上簡化Cookie值的提取。

 

  •  問題

  1. 都是一些抽象類,那么誰實現這個接口或者抽象類了?

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM