Servlet全面讲解
生活随笔
收集整理的這篇文章主要介紹了
Servlet全面讲解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。
Servlet(Server Applet),全稱Java Servlet。是用Java編寫的服務(wù)器端程序。Servlet 是在服務(wù)器上運行的小程序。
其主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動態(tài)Web內(nèi)容。
狹義的Servlet是指Java語言實現(xiàn)的一個接口,廣義的Servlet是指任何實現(xiàn)了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。
Servlet運行于支持Java的應(yīng)用服務(wù)器中。
從原理上講,Servlet可以響應(yīng)任何類型的請求,但絕大多數(shù)情況下Servlet只用來擴展基于HTTP協(xié)議的Web服務(wù)器。
Servlet 的主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動態(tài) Web 內(nèi)容。 這個過程為: 客戶端發(fā)送請求至服務(wù)器端; 服務(wù)器將請求信息發(fā)送至 Servlet; Servlet 生成響應(yīng)內(nèi)容并將其傳給服務(wù)器。響應(yīng)內(nèi)容動態(tài)生成,通常取決于客戶端的請求; 服務(wù)器將響應(yīng)返回給客戶端。 生命周期 客戶端請求該 Servlet; 加載 Servlet 類到內(nèi)存; 實例化并調(diào)用init()方法初始化該 Servlet; service()(根據(jù)請求方法不同調(diào)用doGet() 或者 doPost(),此外還有doHead()、doPut()、doTrace()、doDelete()、doOptions()); destroy()。 加載和實例化 Servlet。這項操作一般是動態(tài)執(zhí)行的。 然而,Server 通常會提供一個管理的選項,用于在 Server 啟動時強制裝載和初始化特定的 Servlet。 Server 創(chuàng)建一個 Servlet的實例,第一個客戶端的請求到達 Server,Server 調(diào)用 Servlet 的 init() 方法(可配置為 Server 創(chuàng)建 Servlet 實例時調(diào)用,在 web.xml 中 <servlet> 標(biāo)簽下配置 <load-on-startup> 標(biāo)簽,配置的值為整型,值越小 Servlet 的啟動優(yōu)先級越高) 一個客戶端的請求到達 Server,Server 創(chuàng)建一個請求對象,處理客戶端請求,Server 創(chuàng)建一個響應(yīng)對象,響應(yīng)客戶端請求。 Server 激活 Servlet 的 service() 方法,傳遞請求和響應(yīng)對象作為參數(shù), service() 方法獲得關(guān)于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息, service() 方法使用響應(yīng)對象的方法,將響應(yīng)傳回Server,最終到達客戶端。 service()方法可能激活其它方法以處理請求,如 doGet() 或 doPost() 或程序員自己開發(fā)的新的方法。 對于更多的客戶端請求,Server 創(chuàng)建新的請求和響應(yīng)對象,仍然激活此 Servlet 的 service() 方法,將這兩個對象作為參數(shù)傳遞給它。 如此重復(fù)以上的循環(huán),但無需再次調(diào)用 init() 方法。 一般 Servlet 只初始化一次(只有一個對象),當(dāng) Server 不再需要 Servlet 時(一般當(dāng) Server 關(guān)閉時),Server 調(diào)用 Servlet 的 destroy() 方法。 工作模式 ? 客戶端發(fā)送請求至服務(wù)器 服務(wù)器啟動并調(diào)用 Servlet,Servlet 根據(jù)客戶端請求生成響應(yīng)內(nèi)容并將其傳給服務(wù)器 服務(wù)器將響應(yīng)返回客戶端 編程接口 HTTPServlet?使用一個 HTML 表單來發(fā)送和接收數(shù)據(jù)。要創(chuàng)建一個 HTTPServlet,應(yīng)當(dāng)擴展?HttpServlet?類,該類是用專門的方法來處理 HTML?表單的 GenericServlet 的一個子類。 HTML 表單是由 <form> 和 </form> 標(biāo)記定義的。表單中典型地包含輸入字段(如文本輸入字段、復(fù)選框、單選按鈕和選擇列表)和用于提交數(shù)據(jù)的按鈕。當(dāng)提交信息時,它們還指定服務(wù)器應(yīng)執(zhí)行哪一個Servlet(或其它的程序)。 HttpServlet 類包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是繼承的。 (1) init() 方法 在 Servlet 的生命期中,僅執(zhí)行一次 init() 方法。它是在服務(wù)器裝入 Servlet 時執(zhí)行的。 可以配置服務(wù)器,以在啟動服務(wù)器或客戶機首次訪問 Servlet 時裝入 Servlet。 無論有多少客戶機訪問 Servlet,都不會重復(fù)執(zhí)行 init() 。 缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法來覆蓋它,典型的是管理服務(wù)器端資源。 例如,可能編寫一個定制 init() 來只用于一次裝入 GIF 圖像,改進 Servlet 返回 GIF 圖像和含有多個客戶機請求的性能。另一個示例是初始化數(shù)據(jù)庫連接。缺省的 init() 方法設(shè)置了 Servlet 的初始化參數(shù),并用它的 ServletConfig 對象參數(shù)來啟動配置, 因此所有覆蓋 init() 方法的 Servlet 應(yīng)調(diào)用 super.init() 以確保仍然執(zhí)行這些任務(wù)。在調(diào)用 service() 方法之前,應(yīng)確保已完成了 init() 方法。 (2) service() 方法 service() 方法是 Servlet 的核心。每當(dāng)一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調(diào)用,而且傳遞給這個方法一個"請求"(ServletRequest)對象和一個"響應(yīng)"(ServletResponse)對象作為參數(shù)。 在 HttpServlet 中已存在 service() 方法。缺省的服務(wù)功能是調(diào)用與 HTTP 請求的方法相應(yīng)的 do 功能。例如, 如果 HTTP 請求方法為 GET,則缺省情況下就調(diào)用 doGet() 。Servlet 應(yīng)該為 Servlet 支持的 HTTP 方法覆蓋 do 功能。因為 HttpServlet.service() 方法會檢查請求方法是否調(diào)用了適當(dāng)?shù)奶幚矸椒?#xff0c;不必要覆蓋 service() 方法。只需覆蓋相應(yīng)的 do 方法就可以了。 Servlet 的響應(yīng)可以是下列幾種類型: 一個輸出流,瀏覽器根據(jù)它的內(nèi)容類型(如 text/html)進行解釋。 一個 HTTP 錯誤響應(yīng),重定向到另一個 URL、servlet、JSP。 (3) doGet() 方法 當(dāng)一個客戶通過 HTML?表單發(fā)出一個 HTTP GET 請求或直接請求一個 URL 時,doGet() 方法被調(diào)用。與 GET 請求相關(guān)的參數(shù)添加到 URL 的后面,并與這個請求一起發(fā)送。當(dāng)不會修改服務(wù)器端的數(shù)據(jù)時,應(yīng)該使用 doGet() 方法。 (4) doPost() 方法 當(dāng)一個客戶通過 HTML 表單發(fā)出一個 HTTP POST 請求時,doPost() 方法被調(diào)用。與 POST 請求相關(guān)的參數(shù)作為一個單獨的 HTTP 請求從瀏覽器發(fā)送到服務(wù)器。當(dāng)需要修改服務(wù)器端的數(shù)據(jù)時,應(yīng)該使用 doPost() 方法。 (5) destroy() 方法 destroy() 方法僅執(zhí)行一次,即在服務(wù)器停止且卸裝 Servlet 時執(zhí)行該方法。典型的,將 Servlet 作為服務(wù)器進程的一部分來關(guān)閉。缺省的 destroy() 方法通常是符合要求的,但也可以覆蓋它,典型的是管理服務(wù)器端資源。例如,如果 Servlet 在運行時會累計統(tǒng)計數(shù)據(jù),則可以編寫一個 destroy() 方法,該方法用于在未裝入 Servlet 時將統(tǒng)計數(shù)字保存在文件中。另一個示例是關(guān)閉數(shù)據(jù)庫連接。 當(dāng)服務(wù)器卸裝 Servlet 時,將在所有 service() 方法調(diào)用完成后,或在指定的時間間隔過后調(diào)用 destroy() 方法。一個 Servlet 在運行 service() 方法時可能會產(chǎn)生其它的線程,因此請確認(rèn)在調(diào)用 destroy() 方法時,這些線程已終止或完成。 (6) getServletConfig() 方法 getServletConfig() 方法返回一個 ServletConfig 對象,該對象用來返回初始化參數(shù)和 ServletContext。ServletContext 接口提供有關(guān) servlet 的環(huán)境信息。 (7) getServletInfo() 方法 getServletInfo() 方法是一個可選的方法,它提供有關(guān) servlet 的信息,如作者、版本、版權(quán)。 當(dāng)服務(wù)器調(diào)用 sevlet 的 service()、doGet() 和 doPost() 這三個方法時,均需要 “請求”和“響應(yīng)”對象作為參數(shù)。“請求”對象提供有關(guān)請求的信息,而“響應(yīng)”對象提供了一個將響應(yīng)信息返回給瀏覽器的一個通信途徑。 javax.servlet 軟件包中的相關(guān)類為 ServletResponse 和 ServletRequest,而 javax.servlet.http?軟件包中的相關(guān)類為 HttpServletRequest 和 HttpServletResponse。Servlet 通過這些對象與服務(wù)器通信并最終與客戶端通信。Servlet 能通過調(diào)用"請求"對象的方法獲知客戶端環(huán)境,服務(wù)器環(huán)境的信息和所有由客戶機提供的信息。Servlet 可以調(diào)用“響應(yīng)”對象的方法發(fā)送響應(yīng),該響應(yīng)是準(zhǔn)備發(fā)回客戶端的。 常見容器 Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。 提供了 Servlet 功能的服務(wù)器,叫做 Servlet 容器。對 web 程序來說,Servlet 容器的作用就相當(dāng)于桌面程序里操作系統(tǒng)的作用,都是提供一些編程基礎(chǔ) 使用建議 在 Web 應(yīng)用程序中,一個 Servlet 在一個時刻可能被多個用戶同時訪問。這時 Web 容器將為每個用戶創(chuàng)建一個線程來執(zhí)行 Servlet。如果 Servlet 不涉及共享資源的問題,不必關(guān)心多線程問題。但如果 Servlet 需要共享資源,需要保證 Servlet 是線程安全的。 下面是編寫線程安全的 Servlet 的一些建議: (1)用方法的局部變量保存請求中的專有數(shù)據(jù)。對方法中定義的局部變量,進入方法的每個線程都有自己的一份方法變量拷貝。任何線程都不會修改其他線程的局部變量。如果要在不同的請求之間共享數(shù)據(jù),應(yīng)該使用會話來共享這類數(shù)據(jù)。 (2)只用 Servlet的成員變量來存放那些不會改變的數(shù)據(jù)。有些數(shù)據(jù)在 Servlet 生命周期中不發(fā)生任何變化,通常是在初始時確定的,這些數(shù)據(jù)可以使用成員變量保存,如數(shù)據(jù)庫連接名稱、其他資源的路徑等。 (3)對可能被請求修改的成員變量同步。有時數(shù)據(jù)成員變量或者環(huán)境屬性可能被請求修改。當(dāng)訪問這些數(shù)據(jù)時應(yīng)該對它們同步,以避免多個線程同時修改這些數(shù)據(jù)。 (4)如果 Servlet 訪問外部資源,那么需要同步訪問這些資源。例如,假設(shè) Servlet 要從文件中讀寫數(shù)據(jù)。當(dāng)一個線程讀寫一個文件時,其他線程也可能正在讀寫這個文件。文件訪問本身不是線程安全的,所以必須編寫同步訪問這些資源的代碼。在編寫線程安全的 Servlet 時,下面兩種方法是不應(yīng)該使用的: (1)在 Servlet API 中提供了一個 SingleThreadModel 接口,實現(xiàn)這個接口的 Servlet 在被多個客戶請求時一個時刻只有一個線程運行。這個接口已被標(biāo)記不推薦使用。 (2)對 doGet() 或doPost() 方法同步。如果必須在 Servlet 中使用同步代碼,應(yīng)盡量在最小的代碼塊范圍上進行同步。同步代碼越小,Servlet 執(zhí)行得才越好
總結(jié)
以上是生活随笔為你收集整理的Servlet全面讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: int, float, double之间
- 下一篇: 客户端控件调用服务器的参数