【Java.Web】Servlet —— Servlet的類的體系結構

      網友投稿 922 2025-03-31

      注:文章轉載地址:http://blog.csdn.net/robinjwong/article/details/17700011


      Servlet API

      以TOMCAT為例,/lib/servlet-api.jar文件為Servlet API的類庫文件。

      Servlet API主要由兩個Java包組成: javax.servlet和javax.servlet.http

      在javax.servlet包中定義了Servlet接口及相關的通用接口和類;

      在javax.servlet.http包中主要定義了與HTTP協議相關的HttpServlet類,HttpServletRequest接口和HttpServletResponse接口;

      Servlet接口

      在Servlet接口中定義了5個方法,其中3個方法都是由Servlet容器來調用的,容器會在Servlet的生命周期的不同階段調用特定的方法:

      init(ServletConfig) —— 負責初始化Servlet對象,容器在創建好Servlet對象后,就會調用該方法;

      service(ServletRquest req, ServletResponse res) —— 負責相應客戶的請求,為客戶提供相應服務。當容器接受到客戶端要求訪問特定Servlet對象的請求時,就會調用該Servlet對象的service()方法;

      destroy() —— 負責釋放Servlet對象占用的資源。當Servlet對象結束聲明周期時,容器會調用此方法;

      GenericServlet抽象類

      GenericServlet抽象類為Servlet接口提供了通用實現,它與任何網絡應用層協議無關。

      GenericServlet除了實現了Servlet接口,還實現了ServletConfig接口和Serializable接口:

      [java]? view plain ?copy

      public?abstract?class?GenericServlet

      implements?Servlet,?ServletConfig,?java.io.Serializable

      GenericServlet類實現了Servlet接口中的init(ServletConfig config)初始化方法。GenericServlet類有一個ServletConfig類型的private成員變量,當Servlet容器調用GenericServlet的init(ServletConfig)方法時,該方法使得私有變量引用由容器傳入的ServletConfig對象。GenericServlet類還定義了一個不帶參數的init()方法,init(ServletConfig)方法會調用此方法。因此在子類中重寫init時,最好重寫init()方法,若重寫Init(ServletConfig)方法,還需要先調用父類的init(ServletConfig)方法(super.init(config))。

      GenericServlet類沒有實現Servlet接口中的service()方法。service()方法是GenericServlet類中唯一的抽象方法,GenericServlet類的具體子類必須實現該方法。

      GenericServlet類實現了Servlet接口的destroy()方法,但實際什么也沒做。

      GenericServlet類實現了ServletConfig接口的所有方法。

      HttpServlet抽象類

      HttpServlet類是GenericServlet類的子類。HttpServlet類為Serlvet接口提供了與HTTP協議相關的通用實現,也就是說,HttpServlet對象適合運行在與客戶端采用HTTP協議通信的Servlet容器或者Web容器中。

      在我們自己開發的Java?Web應用中,自定義的Servlet類一般都擴展自HttpServlet類。

      HttpServlet類實現了Servlet接口中的service(ServletRequest , ServletResponse)方法,而該方法實際調用的是它的重載方法HttpServlet.service(HttpServletRequest, HttpServletResponse);

      在上面的重載service()方法中,首先調用HttpServletRequest類型的參數的getMethod()方法,獲得客戶端的請求方法,然后根據該請求方式來調用匹配的服務方法;如果為GET方式,則調用doGet()方法,如果為POST方式,則調用doPost()方法。

      HttpServlet類為所有的請求方式,提供了默認的實現doGet(),doPost(),doPut(),doDelete()方法;這些方法的默認實現都會向客戶端返回一個錯誤。

      對于HttpServlet類的具體子類,一般會針對客戶端的特定請求方法,覆蓋HttpServlet類中的相應的doXXX方法。如果客戶端按照GET或POST方式請求訪問HttpsServlet,并且這兩種方法下,HttpServlet提供相同的服務,那么可以只實現doGet()方法,并且讓doPost()方法調用doGet()方法。

      ServletRequest接口

      ServletRequest表示來自客戶端的請求;當Servlet容器接收到客戶端要求訪問特定Servlet的請求時,容器先解析客戶端的原始請求數據,把它包裝成一個ServletRequest對象。

      ServletRequest接口提供了一系列用于讀取客戶端的請求數據的方法,例如:

      getContentLength() —— 返回請求正文的長度,如果請求正文的長度未知,則返回-1;

      getContentType() —— 獲得請求正文的MIME類型,如果請求正文的類型為止,則返回null;

      getInputStream() —— 返回用于讀取請求正文的輸入流;

      getLocalAddr() —— 返回服務端的IP地址;

      getLocalName() —— 返回服務端的主機名;

      getLocalPort() —— 返回服務端的端口號;

      getParameters() —— 根據給定的請求參數名,返回來自客戶請求中的匹配的請求參數值;

      getProtocal() —— 返回客戶端與服務器端通信所用的協議名稱及版本號;

      getReader() —— 返回用于讀取字符串形式的請求正文的BufferReader對象;

      getRemoteAddr() —— 返回客戶端的IP地址

      getRemoteHost() —— 返回客戶端的主機名

      getRemotePort() —— 返回客戶端的端口號

      HttpServletRequest接口

      HttpServletRequest接口是ServletRequest接口的子接口。

      HttpServletRequest接口提供了用于讀取HTTP請求中的相關信息的方法:

      getContextPath() —— 返回客戶端請求方法的Web應用的URL入口,例如,如果客戶端訪問的URL為http://localhost:8080/helloapp/info,那么該方法返回“/helloapp”;

      getCookies() —— 返回HTTP請求中的所有Cookie;

      getHeader(String name) —— 返回HTTP請求頭部的特定項;

      getHeaderName() —— 返回一個Enumeration對象,它包含了HTTP請求頭部的所有項目名;

      getMethod() —— 返回HTTP請求方式;

      getRequestURL() —— 返回HTTP請求的頭部的第一行中的URL;

      getQueryString() —— 返回HTTP請求中的查詢字符串,即URL中的“?”后面的內容;

      ServletResponse接口

      Servlet通過ServletResponse對象來生成響應結果。

      ServletResponse接口定義了一系列與生成響應結果相關的方法,例如:

      setCharacterEncoding() —— 設置相應正文的字符編碼。響應正文的默認字符編碼為ISO-8859-1;

      setContentLength() —— 設置響應正文的長度;

      setContentType() —— 設置響應正文的MIME類型;

      getCharacterEncoding() —— 獲得響應正文的字符編碼

      getContentType() —— 獲得響應正文的MIME類型

      setBufferSize() —— 設置用于存放響應正文數據的緩沖區的大小

      getBufferSize() —— 獲得用于存放響應正文數據的緩沖區的大小;

      reset() —— 清空緩沖區內的正文數據,并且清空響應狀態代碼及響應頭

      resetBuffer() —— 僅僅清空緩沖區的正文數據,不清空響應狀態代碼及響應頭;

      flushBuffer() —— 強制性地把緩沖區內的響應正文數據發送到客戶端;

      isCommitted() —— 返回一個boolean類型的值,如果為true,表示緩沖區內的數據已經提交給客戶,即數據已經發送到客戶端;

      getOutputStream() —— 返回一個ServletOutputStream對象,Servlet用它來輸出二進制的正文數據;

      getWriter() —— 返回一個PrinterWriter對象,Servlet用它來輸出字符串形式的正文數據;

      ServletResponse中響應正文的默認MIME類型是text/plain,即純文本類型,而HttpServletResponse中響應正文的默認MIME類型為text/html,即HTML文檔類型。

      為了提高輸出數據的效率,ServletOutputStream和PrintWriter首先把數據寫到緩沖區內。當緩沖區內的數據被提交給客戶后,ServletResponse的isComitted方法返回true。在以下幾種情況下,緩沖區內的數據會被提交給客戶,即數據被發送到客戶端:

      當緩沖區內的數據已滿時,ServletOutPutStream或PrintWriter會自動把緩沖區內的數據發送給客戶端,并且清空緩沖區;

      Servlet調用ServletResponse對象的flushBuffer方法;

      Servlet調用ServletOutputStream或PrintWriter對象的flush方法或close方法;

      為了確保SerlvetOutputStream或PrintWriter輸出的所有數據都會被提交給客戶,比較安全的做法是在所有數據都輸出完畢后,調用ServletOutputStream或PrintWriter的close()方法(Tomcat中,會自動關閉)。

      如果要設置響應正文的MIME類型和字符編碼,必須先調用ServletResponse對象的setContentType()和setCharacterEncoding()方法,然后再調用ServletResponse的getOutputStream()或getWriter()方法,提交緩沖區內的正文數據;只有滿足這樣的操作順序,所做的設置才能生效。

      HttpServletResponse接口

      HttpServletResponse接口提供了與HTTP協議相關的一些方法,Servlet可通過這些方法來設置HTTP響應頭或向客戶端寫Cookie。

      addHeader() —— 向HTTP響應頭中加入一項內容

      sendError() —— 向客戶端發送一個代表特定錯誤的HTTP響應狀態代碼

      setHeader() —— 設置HTTP響應頭中的一項內容,如果在響應頭中已經存在這項內容,則原來的設置被覆蓋

      setStatus() —— 設置HTTP響應的狀態代碼

      addCookie() —— 向HTTP響應中加入一個Cookie

      在HttpServletResponse接口中定義了一些代表HTTP響應狀態代碼的靜態常量。

      ServletConfig接口

      當Servlet容器初始化一個Servlet對象時,會為這個Servlet對象創建一個ServletConfig對象。

      在Servlet對象中包含了Servlet的初始化參數信息。

      ServletConfig接口中定義了以下方法:

      getInitParameter(String name) —— 返回匹配的初始化參數值

      getInitParameterNames() —— 返回一個Enumeration對象,里面包含了所有的初始化參數名

      getServletContext() —— 返回一個ServletContext對象

      getServletName() —— 返回Servlet的名字,即web.xml文件中相應元素的子元素的值;如果沒有為servlet配置子元素,則返回Servlet類的名字

      HttpServlet類繼承了GenericServlet類,而GenericServlet類實現了ServletConfig接口,因此HttpServlet或GenericServlet類及子類中都可以直接調用ServletConfig接口中的方法。

      ServletContext接口

      ServletContext是Servlet與Servlet容器之間直接通信的接口。

      Servlet容器在啟動一個Web應用時,會為它創建一個ServletContext對象。每個Web應用都有唯一的ServletContext對象,可以把ServletContext對象形象地理解為Web應用的總管家,同一個Web應用中的所有Servlet對象都共享一個ServletContext,Servlet對象可以通過其訪問容器中的各種資源。

      ServletContext接口提供的方法可以分為以下幾種類型:

      用于在web應用范圍內存取共享數據的方法:

      setAttribute(String name, Object object) —— 把一個Java對象與一個屬性名綁定,并存入到ServletContext中;

      getAttribute() —— 返回指定數姓名的屬性值

      getAttributeNames() —— 返回一個Enumeration對象,包含所有存放在ServletContext中的屬性名

      removeAttributes() —— 從ServletContext中刪除匹配的屬性

      訪問當前Web應用的資源:

      getContextPath() —— 返回當前Web應用的URL入口

      getInitParameter() —— 返回Web應用范圍內的匹配的初始化參數值。在web.xml中,直接在根元素下定義的元素表示應用范圍內的初始化參數

      getServletContextName() —— 返回Web應用的名字,即web.xml文件中元素的值

      getRequestDispatcher() —— 返回一個用于向其他WEB組件轉發請求的RequestDispatcher對象

      訪問Servlet容器中的其他WEB應用:

      訪問Servlet容器的相關信息:

      訪問服務器端的文件系統資源:

      getRealPath() —— 根據參數指定的虛擬路徑,返回文件系統中的一個真實的路徑

      getResources() —— 返回一個映射到參數指定的路徑的URL

      getResourceAsStream() —— 返回一個用于讀取參數指定的文件的輸入流

      getMimeType() —— 返回參數指定的文件MIME類型

      輸出日志:

      log(String msg) —— 向Servlet的日志文件中寫日志

      log(String message, Throwable throwable) —— 向Servlet的日志文件中寫入錯誤日志,以及異常的堆棧信息

      Servlet相關類的關系

      與Servlet主動關聯的是三個類,分別是ServletConfig,ServletRequest和ServletResponse。這三個類都是通過容器傳遞給Servlet的;其中,ServletConfig是在Servlet初始化時傳給Servlet的,后兩個是在請求到達時調用Servlet傳遞過來的。

      對于Request和Response,以TOMCAT為例,tomcat接到請求首先將會創建org.apache.coyote.Request和org.apache.coyote.Response,這兩個類是Tomcat內部使用的描述一次請求和相應的信息類,它們是一個輕量級的類,作用就是在服務器接收到請求后,經過簡單解析將這個請求快速分配給后續線程去處理。接下來當交給一個用戶線程去處理這個請求時又創建org.apache.catalina.connector.Request和org.apache.catalina.connector.Response對象。這兩個對象一直貫穿整個Servlet容器直到要傳給Servlet,傳給Servlet的是Request和Response的Facade類。

      Request和Response的轉變過程:

      Servlet如何工作

      當用戶從瀏覽器向服務器發起的一個請求通常會包含如下信息:

      [java]? view plain ?copy

      【Java.Web】Servlet —— Servlet的類的體系結構

      http://hostname:port/contextpath/servletpath

      hostname和port用來與服務器建立TCP連接,后面的URL用來選擇在服務器中哪個子容器服務用戶的請求。

      在Tomcat7中,這種映射工作由專門的一個類完成:org.apache.tomcat.util.http.mapper,這個類保存了tomcat的Container容器中的所有子容器的信息。org.apache.catalina.connector.Request類在進入Container容器之前,Mapper將會根據這次請求的hostname和contextpath將host和context容器設置到Request的mappingData屬性中,所以當Request進入container容器之前,對于它要訪問哪個子容器就已經確定了。

      Servlet的實際使用

      我們自己定義的servlet通常去繼承HttpServlet或GenericServlet類。

      采用MVC框架的實現中,其基本原理是將所有的請求都映射到一個Servlet,然后去實現servie方法,這個方法也就是MVC框架的入口。

      Java Servlet web前端 容器

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps表格怎么插入附件(如何在wps里添加附件)
      下一篇:DVARP(dvarp函數多條件)
      相關文章
      亚洲精品乱码久久久久久中文字幕 | 亚洲宅男永久在线| 亚洲国产午夜中文字幕精品黄网站| 亚洲国产成人AV在线播放| 亚洲免费视频播放| 亚洲av午夜精品无码专区| 亚洲国产精品综合久久20| 亚洲综合色7777情网站777| youjizz亚洲| 国产亚洲福利在线视频| 国产亚洲精品成人AA片| 亚洲免费综合色在线视频| 亚洲精品宾馆在线精品酒店 | 亚洲无吗在线视频| 亚洲日韩久久综合中文字幕| 亚洲精品无码专区在线播放| 亚洲成AV人片高潮喷水| 国产精品亚洲lv粉色| 亚洲阿v天堂在线2017免费| 亚洲精品A在线观看| 精品亚洲成α人无码成α在线观看 | 亚洲宅男精品一区在线观看| 亚洲综合色区中文字幕| 亚洲偷自拍另类图片二区| 国产亚洲一卡2卡3卡4卡新区| 国产亚洲精品美女2020久久| 亚洲成人国产精品| 国产成人麻豆亚洲综合无码精品 | 亚洲中文字幕久久精品无码A| 亚洲精华国产精华精华液| 亚洲a无码综合a国产av中文| 亚洲国产精品自在拍在线播放 | 亚洲午夜久久久久久久久久| 亚洲AV无码乱码在线观看裸奔| 老汉色老汉首页a亚洲| 亚洲av产在线精品亚洲第一站| 亚洲精品天堂成人片AV在线播放 | 亚洲人成影院在线高清| 亚洲人成未满十八禁网站| 婷婷亚洲综合一区二区| 日韩亚洲变态另类中文|