servlet基础_Servlet基础
servlet基礎
通過本教程,我將嘗試使您更接近Java Servlet模型。 在檢查servlet規范中定義的類之前,我將解釋在開始開發Web應用程序之前需要了解的基本知識。
了解Java Servlet模型
首先,不僅為基于請求和響應編程模型的規范的Web應用程序定義Java Servlet模型。 但基本上,它最常用于與HTTP協議交互,因此從現在開始,我們將不再在HTTP應用程序中使用servlet模型。
基本上,Web應用程序應該是放置在Web上某個位置的應用程序,并且可以通過網絡對其進行訪問。 如果您需要更多信息并更好地定義“什么是Web應用程序”,則可以訪問下一個鏈接: Web應用程序 。
如果我們要創建一個Web應用程序,我們應該有一個Web服務器,它可以是任何帶有包含Web容器的HTTP服務器,例如Tomcat。 HTTP服務器負責處理客戶端請求,安全性,向客戶端提供內容等服務,但是HTTP服務器無法動態創建對客戶端的響應,他可以提供靜態內容。 解決此問題的方法是Web容器。 容器能夠托管Web應用程序,HTTP服務器會將請求傳遞到將處理請求的Web容器。 通常,每個服務器只有一個容器。 服務器上的所有Web應用程序都由此容器提供服務。
Web容器內部的所有通信都是通過Web容器接口實現的。 這意味著一個應用程序不能直接訪問另一個應用程序。 同樣,一個應用程序內部的組件不能直接相互訪問,同一應用程序中組件之間的所有通信都是使用Web容器接口實現的。 這對于理解Web應用程序在Web容器中的工作方式非常重要,它允許創建過濾器,偵聽器,并允許使用Web容器的安全性功能。
戰爭應用結構
按照規范,Java Web應用程序打包在war程序包中。
War軟件包與jar軟件包相同,但是當Web容器在deploy文件夾中找到war文件時,它將假定它是一個Web應用程序并嘗試啟動它。
在war軟件包中,我們有一個特殊的目錄,稱為WEB-INF。
該文件夾的內容不直接提供給用戶。 該文件夾包含文件夾類和lib,我們可以在其中放置應用程序使用的類(classes文件夾)和其他jar(lib文件夾)。 這些文件夾的內容將由類加載器自動讀取,而無需對類路徑進行任何其他設置。 此外,該文件夾還包含web.xml文件,稱為部署描述。 如果Web應用程序僅包含jsp頁面,則不需要此文件,但是如果應用程序需要具有servlet或過濾器,則必須定義此文件。
Servlet生命周期
在servlet存在的過程中,它經歷了五個生命周期:
- 裝貨
- 實例化
- 初始化
- 服務
- 破壞
加載是類加載器加載類的階段。 每個Web應用程序將獲得一個不同的類加載器實例,這些實例將用于加載Web組件。 這允許在同一個容器中部署同一應用程序的兩個版本,并且每個應用程序都可以具有相同名稱的類(完整類名)。
加載后,Web容器將嘗試實例化類(即創建類的新實例)。 通常每個Web組件僅創建一次,但這取決于Web容器的行為,在某些情況下,可以將Web容器設置為在池中創建更多的組件類實例,并使用池中的一個實例來服務請求。 當Web容器創建servlet的新實例時,它將使用默認構造函數。
初始化是生命周期階段,在該階段初始化servlet。 在此階段中,應該讓servlet讀取一些值,并在servlet能夠滿足客戶端請求之前執行一些附加的操作和步驟。
服務階段是servlet生命周期,其中servlet服務于客戶端請求。 銷毀階段是Servlet生命的最后一個階段,發生在將Servlet從服務中刪除時。
Servlet接口
如果我們想創建一個servlet,那么應該做的就是實現Servlet接口。
該接口提供接下來的三種方法,這些方法由容器調用:
- init(ServletConfig config),在初始化期間調用
- 服務(ServletRequest請求,ServletResponse響應),在服務請求期間調用
- 當從服務中刪除servlet時調用destroy()。
另外這個接口提供了兩個輔助
方法:
- ServletConfig getServletConfig()
- 字符串getServletInfo()
在初始化期間,可以獲取ServletException。 在init方法中引發此異常將通知容器發生了一些錯誤,并且容器將停止初始化并將Servlet實例標記為已準備好進行垃圾回收,并且這不會導致調用destroy方法。
同樣在服務方法期間,可能會獲取ServletException或UnavailableException。 此例外可以是臨時的,也可以是永久的。 在臨時異常的情況下,服務器將阻止對服務方法的調用一段時間,但是在永久異常的情況下,將調用destroy方法,并且Servlet將準備進行垃圾回收,并且以后對該Servlet的每次調用都將導致404響應。
GenericServlet類
GenericServlet類是javax.servlet包的一部分。 它是實現Servlet接口并創建不依賴平臺的基本實現的抽象類。
此類介紹一種新方法:
- 在初始化階段,由init(ServletConfig config)方法調用的init()
- ServletContext getServletContext(),提供對ServletContex的訪問
- String getInitParameter(String name),檢索在應用程序描述符中為指定名稱定義的servlet配置參數的值
- 枚舉getInitParameterNames(),返回所有servlet初始化參數的枚舉。
- 字符串getServletName(),返回servlet的名稱。
如果我們擴展GenericServlet類而不是實現Servlet接口,那么我們要做的只是實現服務方法,所有其他方法都已經由抽象類實現了。
HttpServlet類
這也是類似于GenericServlet的抽象類,但此類與平臺無關。 它與HTML協議綁定,并引入了僅與HTTP協議有關的新方法。 每個新方法都負責處理特定HTTP方法的客戶端請求。
doXxx方法:
- doGet(HttpServletRequest請求,HttpServletResponse響應),處理獲取請求
- doPost(HttpServletRequest請求,HttpServletResponse響應),處理發布請求
- doOptions(HttpServletRequest請求,HttpServletResponse響應),處理HTTP選項請求
- doPut(HttpServletRequest請求,HttpServletResponse響應),處理HTTP放置請求
- doDelete(HttpServletRequest請求,HttpServletResponse響應),處理HTTP刪除請求
- doHead(HttpServletRequest請求,HttpServletResponse響應),處理HTTP Head請求
- doTrace(HttpServletRequest請求,HttpServletResponse響應),處理HTTP跟蹤請求。
ServletContext接口
ServletContext接口是API,可用于訪問有關應用程序的信息。 每個應用程序都是在自己的上下文中執行的,因此此接口可提供對該信息的訪問。 該接口的實現由服務器供應商提供,我們對具體實現不感興趣。 部署應用程序時,容器將首先創建ServletContext實現類,并用應用程序描述符提供的數據填充它。
我們可以將此接口內的方法分為幾組:
- Object getAttribute(String name),從上下文中檢索對象
- 枚舉getAttributeNames(),檢索屬性名稱
- void removeAttribute(String name),從上下文中刪除屬性
- setAttribute(String name,Object value),將新對象添加到上下文中并通過指定的名稱綁定它。 如果具有指定名稱的對象已經存在,它將被重載。
- 字符串getServletContextName(),檢索由<display-name>在應用程序描述符中定義的值,如果不存在則返回null。
- String getRealPath(String path),指定資源的上下文相關路徑,如果將應用程序部署為WAR(如果未在文件夾中爆炸),則為null。
- 設置getResourcesPaths(String path),在指定的部分路徑內檢索文件,僅一級
- ServletContext getContext(String appURL),檢索部署在同一服務器上的另一個應用程序的ServletContex。 網址必須以'/'開頭
- URL getResource(String path),檢索由path指定的資源的URL。 路徑必須以“ /”開頭
- InputStream getResourceAsStream(String path),檢索指定資源的InputStream。 路徑可以是上下文相關的。
- String getMimeType(String path),返回資源的mie類型。
- RequestDispatcher getRequestDispatcher(String path),為指定資源返回RequestDispatcher,如果資源不存在,則返回null。
- RequestDispatcher getNamedDispatcher(String name),為部署描述符內的命名資源返回RequestDispatcher。
- String getInitParameter(String name),檢索部署描述符中定義的指定參數的值;如果不存在,則返回null。
- 枚舉getInitParameterNames(),在應用程序部署描述符中定義的參數名稱列表。
上下文屬性是應用程序范圍的屬性,這意味著所有客戶端共享相同的屬性,一個客戶端進行的屬性更改對其他所有客戶端都是可見的。
ServletConfig接口
這是API,提供用于訪問在部署描述符中定義的信息的方法。 具體
對象由servlet容器創建,并在初始化階段提供給servlet。 該接口定義了以下方法:
- String getInitParameter(String name),獲取為具有指定名稱的servlet定義的init參數的值;如果沒有這樣的參數,則為null。
- 枚舉getInitParameterNames(),檢索servlet初始參數名稱的枚舉。
- ServletContext getServletContext(),檢索Servlet上下文。
- 字符串getServletName(),檢索在web.xml中指定的servlet名稱
如您所見,ServletConfig僅提供用于讀取init參數的方法,而沒有用于更改或添加新init參數的方法,因為它們無法更改或添加。
Servlet部署說明
如果要使用servlet,則需要在部署描述符中定義它們。
<servlet><description>This is a servlet</description><display-name>First Servlet</display-name><servlet-name>FirstServlet</servlet-name><class>ba.codecentric.scwcd.FirstServlet</class><init-param><param-name>firstParam</param-name><param-value>value</param-value></init-param></servlet><servlet-mapping><servlet-name>FirstServlet</servlet-name><uri-pattern>/FirstServlet</uti-pattern></servlet-mapping>在servlet標簽內部,我們定義了servlet,在servlet標簽內部,我們可以使用init param標簽定義初始化參數,這些參數將在初始化階段作為ServletConfig對象的一部分發送給servlet。
并使用servlet映射標記定義uri模式,該模式將用于激活指定的servlet。
同樣在本教程中,我談到了ServletContext,并且提到了上下文參數。 這些參數也使用上下文參數標簽在部署描述中定義。
<context-param><param-name>contextParameter</param-name><param-value>value</param-value></context-param>參考: Igor Madjeric博客上來自我們的JCG合作伙伴 Igor Madjeric的有關Servlet的基礎知識 。
翻譯自: https://www.javacodegeeks.com/2012/11/basics-about-servlets.html
servlet基礎
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的servlet基础_Servlet基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云备案域名怎么弄(阿里云域名备案教程
- 下一篇: Neo4j:使用LOAD CSV检测CS