全套Servlet培訓教程課件_第1頁
全套Servlet培訓教程課件_第2頁
全套Servlet培訓教程課件_第3頁
全套Servlet培訓教程課件_第4頁
全套Servlet培訓教程課件_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于Java的Web編程技術第六章Servlet基于Java的Web編程技術第六章Servlet1上章回顧了解代理事件模型在JavaBean中訪問數據庫上章回顧了解代理事件模型2我們的目標了解Servlet體系結構掌握請求和響應我們的目標了解Servlet體系結構3簡介-1Java編程中一個最激動人心的最新趨勢是服務器端Java應用程序的興起。Java這種面向對象的通用編程語言最初旨在用于小型嵌入設備,而后被認為是一種用于以Applet形式開發(fā)客戶端Web內容的語言,如今Java已是一種非常適合服務器端開發(fā)的語言,商家迅速認識到Java在服務器上的潛力。簡介-1Java編程中一個最激動人心的最新趨勢是服務器端Ja4簡介-2Applet是以Java語言開發(fā)的程序,它運行在客戶端機器的瀏覽器上,這些Applet不連接到服務器。在很多情況下需要訪問服務器上的數據,而這無法通過Applet實現。為了訪問數據和執(zhí)行服務器端的請求處理,必須使用另一個稱為Servlet的應用程序。Servlet是以Java編程語言開發(fā)的服務器端程序,它運行在Web服務器中,由于Servlet在服務器內運行,所以這些程序可用于擴展Web服務器的功能。簡介-2Applet是以Java語言開發(fā)的程序,它運行在客戶5簡介-3客戶端Servlet數據庫HTTP服務器Servlet體系結構簡介-3客戶端Servlet數據庫HTTPServlet體系6簡介-4使用Servlet的優(yōu)點是:Servlet是持久性的。Servlet只須由Web服務器加載一次即可維護請求之間的服務。相比之下,每次向Web服務器發(fā)出請求時,Web服務器都必須加載和執(zhí)行CGI腳本。Servlet運行速度快。由于只須加載一次,所以提供更佳的性能。由于是用Java編寫,所以Servlet可跨平臺。Servlet可擴展。Java的所有優(yōu)點都可以在Servlet中體現。Servlet很安全。訪問Servlet的唯一途徑是通過服務器。Servlet可以與各種客戶端一起使用。簡介-4使用Servlet的優(yōu)點是:76.1Servlet體系結構-1Servlet是服務器端程序,運行在Web服務器上對客戶端的請求做出響應。Web服務器向Servlet發(fā)送請求,Servlet的輸出結果返回至Web服務器,然后Web服務器將結果返回至Web瀏覽器,最后Web瀏覽器在屏幕上顯示結果。該過程稱為“請求-響應”模型。Web瀏覽器ServletWeb服務器HTTP請求HTTP響應6.1Servlet體系結構-1Servlet是服務器端程86.1Servlet體系結構-2Servlet使用以下兩個包中的類和接口:javax.servletjavax.servlet.http包名以javax開頭而不是java,表示ServletAPI是一個標準擴展。javax.servlet包包含了可以支持通用、跨協(xié)議的Servlet的類。javax.servlet.http包中的類增加了特定于HTTP的功能。每個Servlet都必須實現javax.servlet.Servlet接口。大部分Servlet通過擴展以下其中一個特殊類來實現這一接口:javax.servlet.GenericServlet或javax.servlet.http.HttpServlet。6.1Servlet體系結構-2Servlet使用以下兩個96.1Servlet體系結構-3跨協(xié)議Servlet應該繼承GenericServlet。HTTPServlet應繼承HttpServlet,而HttpServlet本身是GenericServlet的子類,但添加了特定于HTTP的功能。Servlet接口只聲明而不實現用于管理Servlet及其與客戶端通信的方法。6.1Servlet體系結構-3跨協(xié)議Servlet應該繼106.1Servlet體系結構-4ServletGenericServletHttpServlet自定義Servlet6.1Servlet體系結構-4ServletGeneri116.1.1常用接口和類-javax.servlet包其中最常用的接口如下:ServletRequest此接口用于將請求信息傳送給Servlet。在收到請求時,Servlet引擎會將關鍵的請求信息封裝在實現ServletRequest接口的對象中,傳遞至Servlet的service()方法。ServletResponse此接口提供服務器對客戶端請求的響應的對象表示。Servlet引擎會將實現ServletResponse接口的對象傳遞給Servlet的service()方法。接著Servlet就可以使用此對象對客戶端請求做出響應。RequestDispatcher此接口定義一個用于接收客戶端的請求并將其發(fā)送至任何資源的對象。此接口還可用于封裝Servlet。RequestDispatcher對象用作資源的封裝器,通過路徑或名稱指定。資源可以是服務器上的Servlet、HTML文件或JSP文件。6.1.1常用接口和類-javax.servlet包其中126.1.1常用接口和類-javax.servlet包其中最常用的接口如下:Servlet這是每個Servlet都必須實現的接口,它定義必須由Servlet實現的方法。ServletConfig此接口定義Servlet配置對象。此對象由Servlet引擎用于將任何信息傳遞給Servlet,以便可初始化Servlet。ServletConfig接口的其他詳情將在本章后面討論。ServletContext此接口定義了一組方法,Servlet使用這些方法與Servlet引擎進行通信。SingleThreadModel此接口確保每次Servlet只能處理一個請求。6.1.1常用接口和類-javax.servlet包其中136.1.1常用接口和類-javax.servlet包其中最常用的類如下:GenericServlet這是大部分非HTTPServlet擴展的類。此類定義通知、跨協(xié)議的Servlet。ServletInputStream這是提供輸入流用于讀取來自客戶端請求的二進制數據的類。此類包括方法readLine(),以此有效實現每次讀取一行數據。ServletOutputStream此類的運行方式與ServletInputStream相同,但此類提供輸出流用于將二進制數據發(fā)送給客戶端。6.1.1常用接口和類-javax.servlet包其中146.1.1常用接口和類-javax.servlet包javax.servlet包還具有某些異常,它們是:ServletException此異常是常規(guī)異常,由Servlet在執(zhí)行過程中遇到困難時拋出。UnavailableException此異常定義的是由Servlet拋出以表示Servlet永久或臨時不可用的異常。6.1.1常用接口和類-javax.servlet包ja156.1.1常用接口和類-javax.servlet.http包javax.servlet.http包中可用的接口包括:HttpServletRequest此接口擴展ServletRequest接口并支持ServletResult接口的所有方法。HttpServletRequest定義用于描述HTTP請求的方法。實現HttpServletRequest接口的對象被傳遞給Servlet的service方法或任何do()方法。HttpServletResponse此接口擴展ServletResponse并支持ServletResponse接口的所有方法。HttpServletResponse接口提供服務器對客戶端請求的響應的對象表示。Servlet可以使用實現Servlet引擎?zhèn)鬟f的HttpServletResponse接口的對象。此對象將被傳遞至Servlet的service()方法。HttpSession此接口提供一種方法,用于在對Web站點的請求或訪問超過一個頁面時標識用戶。HttpSessionBindingListener在對象綁定至會話上或解除會話綁定時,此接口將通知對象。6.1.1常用接口和類-javax.servlet.ht166.1.1常用接口和類-javax.servlet.http包javax.servlet.http包中常用的類包括:CookieCookie類可以創(chuàng)建Cookie,Cookie存儲了少量由Servlet發(fā)送至客戶端的信息??蛻舳丝稍谏院笠L問以前訪問過的網頁時使用已存儲的信息。HttpServletHttpServlet類是最常用于擴展Servlet的類,這是因為很多Servlet應用程序都按HTTP協(xié)議運行。此類支持HTTP功能以及Servlet類的方法,它是個抽象類。它接收客戶端的請求,并向客戶端發(fā)送響應。HttpSessionBindingEvent在對象綁定至會話上或解除會話綁定時,此類會將對象傳遞給實現HttpSessionBindingListener接口的會話。6.1.1常用接口和類-javax.servlet.ht176.1.2Servlet生命周期-1Servlet是普通Java類,在需要時被創(chuàng)建,在不用時被破壞。Servlet的創(chuàng)建和破壞均由Servlet容器自動處理,這是因為Servlet是在Servlet容器內運行。Servlet容器可以在單個Java虛擬機中執(zhí)行所有Servlet。Servlet容器必須遵循下列生命周期:創(chuàng)建和初始化Servlet(加載)處理客戶端的服務調用破壞Servlet并對其進行垃圾收集這三個步驟對所有Servlet都通用。Servlet容器創(chuàng)建Servlet實例時使用的是init()方法,而在破壞實例時使用的是destroy()方法。6.1.2Servlet生命周期-1Servlet是普通J186.1.2Servlet生命周期-2服務器加載Servlet服務器創(chuàng)建Servlet類的實例調用Servlet實例的init()方法收到請求調用service()方法service()方法處理請求并將輸出結果返回客戶端Servlet等待下一個請求或由服務器卸載Servlet在服務器調用destroy()方法后被卸載6.1.2Servlet生命周期-2服務器加載Servle196.1.2Servlet生命周期-3初始化Servlet任何時候將Servlet加載至服務器,服務器都會調用Servlet的init()方法。即使大部分Servlet在多線程服務器上運行,Servlet在初始化過程中也不會碰到并發(fā)問題。init()方法在Servlet處理第一個請求之前調用,此方法用于執(zhí)行Servlet初始化–創(chuàng)建或加載Servlet在處理請求時使用的對象。服務器調用Servlet的init()方法,向新Servlet提供任何有關其本身及其環(huán)境的信息。覆蓋init()方法是為了在Servlet中添加初始化的內容,覆蓋init()方法時必須遵循下列規(guī)則:如果發(fā)生初始化錯誤,致使Servlet不能處理客戶端請求,則拋出UnavailableException請勿調用System.exit()方法ServletConfig對象向Servlet提供其初始化參數信息,這些參數與其他任何請求都不關聯。ServletConfig對象還有對ServletContext對象的引用,Servlet可以使用此對象調查其環(huán)境。6.1.2Servlet生命周期-3初始化Servlet206.1.2Servlet生命周期-4處理客戶端的請求Servlet接受客戶端的調用時,它將收到兩個對象:ServletRequest,用于封裝客戶端至服務器的通信。ServletResponse,用于封裝Servlet返回至客戶端的通信。HttpServlet接受客戶端的調用時,與普通Servlet相似,它們是:HttpServletRequestHttpServletResponseHttpServlet能夠并發(fā)地為多個客戶端服務。在Servlet初始化之后,在調用init()方法時,Servlet容器收到的任何請求都將被轉發(fā)至Servlet的service()方法。根據正在接收的HTTP請求類型,HttpServlet類的service()方法可在細分為doGet()、doPost()、doDelete()、doOptions()、doPut()和doTrace()方法。其中,doGet()和doPost()是兩個常用于處理服務器的請求并生成響應的方法。6.1.2Servlet生命周期-4處理客戶端的請求216.1.2Servlet生命周期-5破壞Servlet要卸載Servlet時,服務器將調用Servlet的destroy()方法。在destroy()方法中,Servlet應該釋放任何已獲得的資源。destroy()方法還使Servlet有機會寫出其未保存的高速緩存信息或任何在下次調用init()時應該讀取的持久性信息。6.1.2Servlet生命周期-5破壞Servlet226.2請求和響應-1下面討論表示客戶端請求和Servlet響應的對象。Servlet的兩個包都具有請求和響應的接口和類。javax.servlet包具有ServletRequest和ServletResponse接口,javax.servlet.http包具有HttpServletRequest和HttpServletResponse接口。6.2請求和響應-1下面討論表示客戶端請求和Servlet236.2請求和響應-2HttpServlet類HttpServlet類擴展了GenericServlet,提供Servlet接口的HTTP協(xié)議的特定實現。如果Servlet必須遵循HTTP協(xié)議,則只能擴展HttpServlet類并覆蓋所需的方法。HttpServlet最常用的兩個接口是:HttpServletRequestHttpServletResponse6.2請求和響應-2HttpServlet類246.2請求和響應-3HttpServletRequestHttpServletRequest對象提供對HTTP頭數據的訪問,獲得客戶端作為請求一部分進行發(fā)送的參數。通過擴展HttpServlet類并覆蓋相應方法可以處理HTTP請求,這些請求的方法包括doGet()和doPost()??蛻舳藬祿梢酝ㄟ^下列方式訪問:getParameter()方法,用于返回指定參數的值getParameterValues()方法,在參數具有多個值時使用,此方法返回指定參數的值數組。如果所需數據是文本格式,則getReader()方法返回BufferedReader對象用于讀取數據,如果所需數據是二進制格式,則getInputStream()方法返回ServletInputStream對象用于讀取數據。6.2請求和響應-3HttpServletRequest256.2請求和響應-4HttpServletResponseHttpServletResponse對象提供兩個將數據返回給用戶的方法。getWriter()方法,返回Writer對象,用于將文本數據返回給用戶getOutputStream()方法,返回ServletOutputStream對象,用于返回二進制數據在發(fā)送響應后關閉Writer或ServletOutputStream可讓服務器知道何時完成響應。6.2請求和響應-4HttpServletResponse266.2請求和響應-5HttpServlet類中的常用方法voidinit()在初始化Servlet時調用一次voiddestroy()在要破壞Servlet實例時調用一次voidservice(HttpServletRequestreq,HttpServletResponseresp)請勿覆蓋此方法doGet()、doPost()、doPut()、doDelete()、doOptions()、doTrace()這些方法根據收到的HTTP請求的類型來調用。必須覆蓋以便生成響應。voidlog(Stringmsg)將消息寫入Servlet的日志文件longgetLastModified(HttpServletreq)返回Servlet的最后修改日期StringgetServletInfo()提供Servlet的一般信息字符串,例如作者、版本、版權等StringgetServletName()返回Servlet的名稱StringgetInitParameter(Stringname)返回給定初始化參數的值EnumerationgetInitParameterNames()返回一個包含了所有提供的初始化參數名稱的Enumeration對象6.2請求和響應-5HttpServlet類中的常用方法v276.3會話和環(huán)境-1HTTP沒有為服務器提供識別請求序列是否來自同一客戶端的方法,這就引起一個問題,因為許多Web應用程序都是有狀態(tài)的。HTTP服務器不能通過連接機器的IP地址來標識客戶端,這是因為報告的IP地址可能是代理服務器的地址或者是有多個用戶的服務器的地址。此問題的解決方案是客戶端任何時候做出新請求都必須進行自我介紹。每個客戶端都必須提供一個唯一標識以便服務器可識別它,或者客戶端必須提供某些信息以便服務器可用于正確處理請求。6.3會話和環(huán)境-1HTTP沒有為服務器提供識別請求序列是286.3會話和環(huán)境-2用戶在站點上瀏覽時,會話跟蹤使Servlet和其他服務器端應用程序可以跟蹤用戶。服務器端應用程序可以使用此功能跟蹤客戶端在站點上的操作。Web服務器通過為站點上的每個用戶創(chuàng)建Session對象來維護用戶狀態(tài),這些Session對象存儲在服務器中,并在服務器中進行維護。在用戶向站點做出請求時,用戶就分配有一個新的Session對象和唯一的會話ID。此會話ID在后續(xù)的請求中會將用戶與Session對象進行匹配然后Session對象就作為請求的一部分被傳遞至處理請求的Servlet。Servlet可以在Session對象中添加信息或讀取其中的信息。會話對于由多個Servlet組成的應用程序來說很方便。6.3會話和環(huán)境-2用戶在站點上瀏覽時,會話跟蹤使Serv296.3會話和環(huán)境-3下面討論不同的會話跟蹤技術用戶認證隱藏表單字段URL重寫持久Cookie會話交換和持久6.3會話和環(huán)境-3下面討論不同的會話跟蹤技術306.3.1用戶認證在Web服務器只允許那些使用用戶名和口令進行登錄的客戶端訪問某些資源時,就需要使用用戶認證。在客戶端登錄后,用戶名即通過getRemoteUser()提供給Servlet。用戶名可用于跟蹤客戶端會話。一旦用戶登錄,瀏覽器即記住用戶名,并在用戶查看站點的新頁面時返回用戶名和口令。Servlet可以通過用戶名標識用戶,并以此跟蹤用戶。使用用戶認證的優(yōu)點是:容易實現??勺尫掌鞅Wo一組頁面,并使用getRemoteUser()標識每個客戶端。此技術即使在用戶從不同機器訪問站點時也有效。即使用戶離開站點或在返回站點前退出瀏覽器,此技術同樣有效。使用用戶認證的缺點是:要求每個用戶都注冊一個帳戶,然后在每次訪問站點時登錄。用戶在同一站點上不能同時維護多個會話。6.3.1用戶認證在Web服務器只允許那些使用用戶名和口令316.3.2隱藏表單字段隱藏表單字段是指添加到HTML表單中,但不在客戶端的瀏覽器中顯示的字段。在提交包含字段的表單時,字段將被發(fā)送至服務器。隱藏表單字段定義表單的常變量,但對于接收提交的表單的Servlet,隱藏字段和可見字段沒有區(qū)別。使用隱藏表單字段的優(yōu)點是其功能強大并支持匿名。所有常用瀏覽器都支持隱藏字段,而且它們可用于未登錄或注冊的客戶端。隱藏表單字段的缺點是只適用于動態(tài)生成的表單序列。在遇到靜態(tài)文檔、以電子郵件發(fā)送的文檔、設計為書簽的文檔和瀏覽器關閉時,該技術即束手無策。6.3.2隱藏表單字段隱藏表單字段是指添加到HTML表單中326.3.3URL重寫使用URL重寫技術,用戶單擊的每個URL都可被動態(tài)修改或重寫,以包括附加信息。附加信息的形式可為附加路徑信息、添加的參數或某些特定于服務器的自定義URL修改。重寫URL的可用空間是有限的,因此附加信息通常只限于唯一的會話ID。每種重寫技術都有其優(yōu)點和缺點。附加路徑信息適用于所有服務器,并作為使用GET和POST方法的表單的目標,但是,如果Servlet必須使用附加路徑信息作為實際路徑信息時,它就不適用。添加的參數適用于所有服務器,但在作為使用POST方法的表單的目標時將失效,并可能引起參數命名沖突。特定于服務器的自定義修改在任何情況下都適用于支持此類修改的服務器。6.3.3URL重寫使用URL重寫技術,用戶單擊的每個UR336.3.4持久CookieCookie是Web服務器發(fā)送至瀏覽器,以后可從該瀏覽器上讀回的少量信息。瀏覽器收到Cookie后,在每次訪問服務器上的頁面時都會將其發(fā)送回服務器。由于Cookie的值可以方便地標識客戶端,因此Cookie通常用于會話跟蹤。6.3.4持久CookieCookie是Web服務器發(fā)送至346.3.5會話交換和持久-1因為訪問一個站點的用戶可有許多個,所以就會有許多會話訪問同一站點。Internet站點必須支持許多有效會話,例如,大型站點可能同時有幾百甚至幾千個有效會話。由于每個會話都可以包含應用程序Servlet放置的任意數據對象,所以整個系統(tǒng)的內存要求就很高。內存中可以存在的會話數受到會話跟蹤系統(tǒng)的限制。session.maxresidents屬性設置此限制,當同時進行的會話的數量超過session.maxresidents設置的限制時,會話跟蹤器會將最近最不常用的會話交換到磁盤。被交換的會話沒有丟失,它們可以重載入內存。如果收到請求,會話將被重載。會話交換使得系統(tǒng)中的有效會話比內存所能容納的會話要多。6.3.5會話交換和持久-1因為訪問一個站點的用戶可有許多356.3.5會話交換和持久-2會話交換絕不會影響會話的無效性。如果會話的未使用時間超過正常失效時間,它就會無效,不管會話是在內存還是在磁盤。session.invalidationinterval屬性設置會話無效時間。串行化用于將會話寫入磁盤和從磁盤讀取會話。所以,可以串行化并置于會話中的對象將被寫入磁盤,而不能串行化的對象將保留在內存中(即使會話的一部分已被寫入磁盤),會話跟蹤操作不會受串行化的影響。因此,Servlet開發(fā)者只保存會話中的可串行化對象。實現java.io.Serializable或java.io.Externalizable接口的對象都可串行化。在啟用了會話持久功能時,會話跟蹤器將使用會話交換機制實現會話持久。服務器關閉時,內存中的會話即被寫入session.swapdirectory屬性中指定的磁盤。一旦啟動服務器,寫入磁盤的會話就變得有效。這就使服務器在重啟時不會丟失任何現有會話。會話中的可串行化數據元素在關閉/重啟操作時可以繼續(xù)運行。6.3.5會話交換和持久-2會話交換絕不會影響會話的無效性366.4HttpSession接口-1HttpSession接口定義一個對象,用于在客戶端和服務器之間提供關聯,此關聯在經過多次連接后仍然持久。它還可以維護事務處理之間的狀態(tài)。ServletAPI提供HttpSession接口以實現存儲功能。Servlet引擎可以創(chuàng)建一個對象,用于實現此接口,自動創(chuàng)建唯一的密鑰和將此密鑰附加至響應。Servlet引擎負責存儲會話、跟蹤會話持久時間以及根據Servlet需要檢索會話。Session對象必須具有生命周期,這樣引擎才能將其拋棄。6.4HttpSession接口-1HttpSession376.4HttpSession接口-2為了創(chuàng)建HTTP客戶端和HTTP服務器之間的會話,Servlet引擎使用HttpSession接口。對于用戶的多個連接或頁面請求,會話可持久的時間比實際指定的更長。正常情況下,會話對應一個建立至站點的連接并多次訪問站點的用戶。服務器通過使用Cookie或重寫URL來維護會話。Servlet可通過HttpSession接口來查看和操縱會話的相關信息,如會話標識符、創(chuàng)建時間和環(huán)境。此接口允許Servlet將對象綁定至會話,并允許Servlet訪問標準會話屬性,例如會話標識符或會話環(huán)境。HttpSession接口允許Servlet從會話獲得數據和修改此數據,然后將其返回給會話。6.4HttpSession接口-2為了創(chuàng)建HTTP客戶端386.4HttpSession接口-3會話跟蹤器檢查對象是否實現HttpSessionBindingListener接口。任何時候應用程序存儲對象或將其從會話中刪除,如果對象實現HttpSessionBindingListener接口,則Servlet都會通知此對象它已被綁定至會話或已解除會話綁定。在下列任何一種情況下,服務器都會將會話視為新的會話:客戶端首次進入頁面或站點時會話還未啟動時客戶端選擇不參與會話時6.4HttpSession接口-3會話跟蹤器檢查對象是否396.5ServletConfig接口ServletConfig接口定義Servlet配置對象,Servlet引擎使用此對象將信息傳遞給Servlet以初始化Servlet。它包含Servlet初始化參數的名稱/值對,還包含對ServletContext對象的引用。此接口定義了三個訪問此信息的方法。StringgetInitParameter(Stringname)返回包含了指定初始化參數值的字符串,如果參數不存在則返回nullEnumerationgetInitParameterNames()將Servlet初始化參數的名稱作為字符串對象的枚舉返回,如果Servlet沒有初始化參數則返回空枚舉ServletCntextgetServletContext()返回服務器傳遞至此Servlet的ServletContext對象6.5ServletConfig接口ServletConf406.6ServletContext-1使用此接口的對象讓Servlet查找有關Servlet引擎及其環(huán)境的信息。從ServletConfig對象可以獲得ServletContext。ServletContext類中常用的方法如下:ObjectgetAttribute(Stringname)返回給定名稱的Servlet引擎屬性,若無則返回nullEnumerationgetAttributeNames()返回包含了此Servlet環(huán)境中可用屬性名稱的枚舉ServletContextgetContext(Stringuripath)返回對應于服務器上指定URL的ServletContext對象intgetMajorVersion()返回此Web服務器支持的JavaServletAPI的主要版本6.6ServletContext-1使用此接口的對象讓S416.6ServletContext-2StringgetMimeType(Stringfile)返回指定文件的MIME類型,如果MIME類型未知則返回nullintgetMinorVersion()返回此Web服務器支持的JavaServletAPI的次要版本StringgetRealPath(Stringpath)返回包含了對應于虛擬路徑的實際路徑的字符串RequestDispatchergetRequestDispatcher(Stringurlpath)返回一個可用作位于指定路徑的資源的封裝器的RequestDispatcher對象URLgetResource(Stringpath)返回映射至指定路徑的資源InputStreamgetResourceAsStream(Stringpath)將位于指定路徑的資源作為InputStream對象返回StringgetServerInfo()返回Servlet正在其上運行的Servlet引擎的名稱和版本voidlog(Stringmsg)將指定消息寫入Servlet日志文件(通常為事件日志)6.6ServletContext-2Stringget426.6ServletContext-3voidlog(Stringmessage,Throwablethrowable)將有關給定Throwable異常的堆棧跟蹤和說明性消息寫入Servlet日志文件voidremoveAttribute(Stringname)將具有給定名稱的屬性從Servlet環(huán)境中刪除voidsetAttribute(Stringname,Objectobject)在此Servlet環(huán)境中給屬性命名6.6ServletContext-3voidlog(S43本章小結(一)Servlet是服務器端程序,由Web服務器加載和執(zhí)行。由于只需加載一次,因此Servlet性能更佳,而且因為是用Java編寫的,所以可跨平臺。Servlet的init()方法在服務器構造了Servlet實例后即被服務器調用。要卸載Servlet時,服務器將調用Servlet的destroy()方法。用戶在站點上瀏覽時,會話跟蹤使Servlet和其他服務器端應用程序可以跟蹤用戶。會話跟蹤技術包括:用戶認證、隱藏表單字段、URL重寫和持久Cookie。本章小結(一)Servlet是服務器端程序,由Web服務器加44本章小結(二)在Web服務器只允許那些使用用戶名和口令進行登錄的客戶端訪問某些資源時,需要使用用戶認證。隱藏表單字段是指添加到HTML表單中,但不在客戶端的瀏覽器中顯示的字段。在提交包含字段的表單時,字段將被發(fā)送回服務器。使用URL重寫技術,用戶單擊的每個URL都可被動態(tài)修改或重寫,以包括附加信息。附加信息的形式可為附加路徑信息、添加的參數或某些特定于服務器的自定義URL修改。會話跟蹤系統(tǒng)對內存中可以存在的會話數量具有限制,這一限制在session.maxresidents屬性中設置。本章小結(二)在Web服務器只允許那些使用用戶名和口令進行登45演講完畢,謝謝觀看!演講完畢,謝謝觀看!46基于Java的Web編程技術第六章Servlet基于Java的Web編程技術第六章Servlet47上章回顧了解代理事件模型在JavaBean中訪問數據庫上章回顧了解代理事件模型48我們的目標了解Servlet體系結構掌握請求和響應我們的目標了解Servlet體系結構49簡介-1Java編程中一個最激動人心的最新趨勢是服務器端Java應用程序的興起。Java這種面向對象的通用編程語言最初旨在用于小型嵌入設備,而后被認為是一種用于以Applet形式開發(fā)客戶端Web內容的語言,如今Java已是一種非常適合服務器端開發(fā)的語言,商家迅速認識到Java在服務器上的潛力。簡介-1Java編程中一個最激動人心的最新趨勢是服務器端Ja50簡介-2Applet是以Java語言開發(fā)的程序,它運行在客戶端機器的瀏覽器上,這些Applet不連接到服務器。在很多情況下需要訪問服務器上的數據,而這無法通過Applet實現。為了訪問數據和執(zhí)行服務器端的請求處理,必須使用另一個稱為Servlet的應用程序。Servlet是以Java編程語言開發(fā)的服務器端程序,它運行在Web服務器中,由于Servlet在服務器內運行,所以這些程序可用于擴展Web服務器的功能。簡介-2Applet是以Java語言開發(fā)的程序,它運行在客戶51簡介-3客戶端Servlet數據庫HTTP服務器Servlet體系結構簡介-3客戶端Servlet數據庫HTTPServlet體系52簡介-4使用Servlet的優(yōu)點是:Servlet是持久性的。Servlet只須由Web服務器加載一次即可維護請求之間的服務。相比之下,每次向Web服務器發(fā)出請求時,Web服務器都必須加載和執(zhí)行CGI腳本。Servlet運行速度快。由于只須加載一次,所以提供更佳的性能。由于是用Java編寫,所以Servlet可跨平臺。Servlet可擴展。Java的所有優(yōu)點都可以在Servlet中體現。Servlet很安全。訪問Servlet的唯一途徑是通過服務器。Servlet可以與各種客戶端一起使用。簡介-4使用Servlet的優(yōu)點是:536.1Servlet體系結構-1Servlet是服務器端程序,運行在Web服務器上對客戶端的請求做出響應。Web服務器向Servlet發(fā)送請求,Servlet的輸出結果返回至Web服務器,然后Web服務器將結果返回至Web瀏覽器,最后Web瀏覽器在屏幕上顯示結果。該過程稱為“請求-響應”模型。Web瀏覽器ServletWeb服務器HTTP請求HTTP響應6.1Servlet體系結構-1Servlet是服務器端程546.1Servlet體系結構-2Servlet使用以下兩個包中的類和接口:javax.servletjavax.servlet.http包名以javax開頭而不是java,表示ServletAPI是一個標準擴展。javax.servlet包包含了可以支持通用、跨協(xié)議的Servlet的類。javax.servlet.http包中的類增加了特定于HTTP的功能。每個Servlet都必須實現javax.servlet.Servlet接口。大部分Servlet通過擴展以下其中一個特殊類來實現這一接口:javax.servlet.GenericServlet或javax.servlet.http.HttpServlet。6.1Servlet體系結構-2Servlet使用以下兩個556.1Servlet體系結構-3跨協(xié)議Servlet應該繼承GenericServlet。HTTPServlet應繼承HttpServlet,而HttpServlet本身是GenericServlet的子類,但添加了特定于HTTP的功能。Servlet接口只聲明而不實現用于管理Servlet及其與客戶端通信的方法。6.1Servlet體系結構-3跨協(xié)議Servlet應該繼566.1Servlet體系結構-4ServletGenericServletHttpServlet自定義Servlet6.1Servlet體系結構-4ServletGeneri576.1.1常用接口和類-javax.servlet包其中最常用的接口如下:ServletRequest此接口用于將請求信息傳送給Servlet。在收到請求時,Servlet引擎會將關鍵的請求信息封裝在實現ServletRequest接口的對象中,傳遞至Servlet的service()方法。ServletResponse此接口提供服務器對客戶端請求的響應的對象表示。Servlet引擎會將實現ServletResponse接口的對象傳遞給Servlet的service()方法。接著Servlet就可以使用此對象對客戶端請求做出響應。RequestDispatcher此接口定義一個用于接收客戶端的請求并將其發(fā)送至任何資源的對象。此接口還可用于封裝Servlet。RequestDispatcher對象用作資源的封裝器,通過路徑或名稱指定。資源可以是服務器上的Servlet、HTML文件或JSP文件。6.1.1常用接口和類-javax.servlet包其中586.1.1常用接口和類-javax.servlet包其中最常用的接口如下:Servlet這是每個Servlet都必須實現的接口,它定義必須由Servlet實現的方法。ServletConfig此接口定義Servlet配置對象。此對象由Servlet引擎用于將任何信息傳遞給Servlet,以便可初始化Servlet。ServletConfig接口的其他詳情將在本章后面討論。ServletContext此接口定義了一組方法,Servlet使用這些方法與Servlet引擎進行通信。SingleThreadModel此接口確保每次Servlet只能處理一個請求。6.1.1常用接口和類-javax.servlet包其中596.1.1常用接口和類-javax.servlet包其中最常用的類如下:GenericServlet這是大部分非HTTPServlet擴展的類。此類定義通知、跨協(xié)議的Servlet。ServletInputStream這是提供輸入流用于讀取來自客戶端請求的二進制數據的類。此類包括方法readLine(),以此有效實現每次讀取一行數據。ServletOutputStream此類的運行方式與ServletInputStream相同,但此類提供輸出流用于將二進制數據發(fā)送給客戶端。6.1.1常用接口和類-javax.servlet包其中606.1.1常用接口和類-javax.servlet包javax.servlet包還具有某些異常,它們是:ServletException此異常是常規(guī)異常,由Servlet在執(zhí)行過程中遇到困難時拋出。UnavailableException此異常定義的是由Servlet拋出以表示Servlet永久或臨時不可用的異常。6.1.1常用接口和類-javax.servlet包ja616.1.1常用接口和類-javax.servlet.http包javax.servlet.http包中可用的接口包括:HttpServletRequest此接口擴展ServletRequest接口并支持ServletResult接口的所有方法。HttpServletRequest定義用于描述HTTP請求的方法。實現HttpServletRequest接口的對象被傳遞給Servlet的service方法或任何do()方法。HttpServletResponse此接口擴展ServletResponse并支持ServletResponse接口的所有方法。HttpServletResponse接口提供服務器對客戶端請求的響應的對象表示。Servlet可以使用實現Servlet引擎?zhèn)鬟f的HttpServletResponse接口的對象。此對象將被傳遞至Servlet的service()方法。HttpSession此接口提供一種方法,用于在對Web站點的請求或訪問超過一個頁面時標識用戶。HttpSessionBindingListener在對象綁定至會話上或解除會話綁定時,此接口將通知對象。6.1.1常用接口和類-javax.servlet.ht626.1.1常用接口和類-javax.servlet.http包javax.servlet.http包中常用的類包括:CookieCookie類可以創(chuàng)建Cookie,Cookie存儲了少量由Servlet發(fā)送至客戶端的信息??蛻舳丝稍谏院笠L問以前訪問過的網頁時使用已存儲的信息。HttpServletHttpServlet類是最常用于擴展Servlet的類,這是因為很多Servlet應用程序都按HTTP協(xié)議運行。此類支持HTTP功能以及Servlet類的方法,它是個抽象類。它接收客戶端的請求,并向客戶端發(fā)送響應。HttpSessionBindingEvent在對象綁定至會話上或解除會話綁定時,此類會將對象傳遞給實現HttpSessionBindingListener接口的會話。6.1.1常用接口和類-javax.servlet.ht636.1.2Servlet生命周期-1Servlet是普通Java類,在需要時被創(chuàng)建,在不用時被破壞。Servlet的創(chuàng)建和破壞均由Servlet容器自動處理,這是因為Servlet是在Servlet容器內運行。Servlet容器可以在單個Java虛擬機中執(zhí)行所有Servlet。Servlet容器必須遵循下列生命周期:創(chuàng)建和初始化Servlet(加載)處理客戶端的服務調用破壞Servlet并對其進行垃圾收集這三個步驟對所有Servlet都通用。Servlet容器創(chuàng)建Servlet實例時使用的是init()方法,而在破壞實例時使用的是destroy()方法。6.1.2Servlet生命周期-1Servlet是普通J646.1.2Servlet生命周期-2服務器加載Servlet服務器創(chuàng)建Servlet類的實例調用Servlet實例的init()方法收到請求調用service()方法service()方法處理請求并將輸出結果返回客戶端Servlet等待下一個請求或由服務器卸載Servlet在服務器調用destroy()方法后被卸載6.1.2Servlet生命周期-2服務器加載Servle656.1.2Servlet生命周期-3初始化Servlet任何時候將Servlet加載至服務器,服務器都會調用Servlet的init()方法。即使大部分Servlet在多線程服務器上運行,Servlet在初始化過程中也不會碰到并發(fā)問題。init()方法在Servlet處理第一個請求之前調用,此方法用于執(zhí)行Servlet初始化–創(chuàng)建或加載Servlet在處理請求時使用的對象。服務器調用Servlet的init()方法,向新Servlet提供任何有關其本身及其環(huán)境的信息。覆蓋init()方法是為了在Servlet中添加初始化的內容,覆蓋init()方法時必須遵循下列規(guī)則:如果發(fā)生初始化錯誤,致使Servlet不能處理客戶端請求,則拋出UnavailableException請勿調用System.exit()方法ServletConfig對象向Servlet提供其初始化參數信息,這些參數與其他任何請求都不關聯。ServletConfig對象還有對ServletContext對象的引用,Servlet可以使用此對象調查其環(huán)境。6.1.2Servlet生命周期-3初始化Servlet666.1.2Servlet生命周期-4處理客戶端的請求Servlet接受客戶端的調用時,它將收到兩個對象:ServletRequest,用于封裝客戶端至服務器的通信。ServletResponse,用于封裝Servlet返回至客戶端的通信。HttpServlet接受客戶端的調用時,與普通Servlet相似,它們是:HttpServletRequestHttpServletResponseHttpServlet能夠并發(fā)地為多個客戶端服務。在Servlet初始化之后,在調用init()方法時,Servlet容器收到的任何請求都將被轉發(fā)至Servlet的service()方法。根據正在接收的HTTP請求類型,HttpServlet類的service()方法可在細分為doGet()、doPost()、doDelete()、doOptions()、doPut()和doTrace()方法。其中,doGet()和doPost()是兩個常用于處理服務器的請求并生成響應的方法。6.1.2Servlet生命周期-4處理客戶端的請求676.1.2Servlet生命周期-5破壞Servlet要卸載Servlet時,服務器將調用Servlet的destroy()方法。在destroy()方法中,Servlet應該釋放任何已獲得的資源。destroy()方法還使Servlet有機會寫出其未保存的高速緩存信息或任何在下次調用init()時應該讀取的持久性信息。6.1.2Servlet生命周期-5破壞Servlet686.2請求和響應-1下面討論表示客戶端請求和Servlet響應的對象。Servlet的兩個包都具有請求和響應的接口和類。javax.servlet包具有ServletRequest和ServletResponse接口,javax.servlet.http包具有HttpServletRequest和HttpServletResponse接口。6.2請求和響應-1下面討論表示客戶端請求和Servlet696.2請求和響應-2HttpServlet類HttpServlet類擴展了GenericServlet,提供Servlet接口的HTTP協(xié)議的特定實現。如果Servlet必須遵循HTTP協(xié)議,則只能擴展HttpServlet類并覆蓋所需的方法。HttpServlet最常用的兩個接口是:HttpServletRequestHttpServletResponse6.2請求和響應-2HttpServlet類706.2請求和響應-3HttpServletRequestHttpServletRequest對象提供對HTTP頭數據的訪問,獲得客戶端作為請求一部分進行發(fā)送的參數。通過擴展HttpServlet類并覆蓋相應方法可以處理HTTP請求,這些請求的方法包括doGet()和doPost()??蛻舳藬祿梢酝ㄟ^下列方式訪問:getParameter()方法,用于返回指定參數的值getParameterValues()方法,在參數具有多個值時使用,此方法返回指定參數的值數組。如果所需數據是文本格式,則getReader()方法返回BufferedReader對象用于讀取數據,如果所需數據是二進制格式,則getInputStream()方法返回ServletInputStream對象用于讀取數據。6.2請求和響應-3HttpServletRequest716.2請求和響應-4HttpServletResponseHttpServletResponse對象提供兩個將數據返回給用戶的方法。getWriter()方法,返回Writer對象,用于將文本數據返回給用戶getOutputStream()方法,返回ServletOutputStream對象,用于返回二進制數據在發(fā)送響應后關閉Writer或ServletOutputStream可讓服務器知道何時完成響應。6.2請求和響應-4HttpServletResponse726.2請求和響應-5HttpServlet類中的常用方法voidinit()在初始化Servlet時調用一次voiddestroy()在要破壞Servlet實例時調用一次voidservice(HttpServletRequestreq,HttpServletResponseresp)請勿覆蓋此方法doGet()、doPost()、doPut()、doDelete()、doOptions()、doTrace()這些方法根據收到的HTTP請求的類型來調用。必須覆蓋以便生成響應。voidlog(Stringmsg)將消息寫入Servlet的日志文件longgetLastModified(HttpServletreq)返回Servlet的最后修改日期StringgetServletInfo()提供Servlet的一般信息字符串,例如作者、版本、版權等StringgetServletName()返回Servlet的名稱StringgetInitParameter(Stringname)返回給定初始化參數的值EnumerationgetInitParameterNames()返回一個包含了所有提供的初始化參數名稱的Enumeration對象6.2請求和響應-5HttpServlet類中的常用方法v736.3會話和環(huán)境-1HTTP沒有為服務器提供識別請求序列是否來自同一客戶端的方法,這就引起一個問題,因為許多Web應用程序都是有狀態(tài)的。HTTP服務器不能通過連接機器的IP地址來標識客戶端,這是因為報告的IP地址可能是代理服務器的地址或者是有多個用戶的服務器的地址。此問題的解決方案是客戶端任何時候做出新請求都必須進行自我介紹。每個客戶端都必須提供一個唯一標識以便服務器可識別它,或者客戶端必須提供某些信息以便服務器可用于正確處理請求。6.3會話和環(huán)境-1HTTP沒有為服務器提供識別請求序列是746.3會話和環(huán)境-2用戶在站點上瀏覽時,會話跟蹤使Servlet和其他服務器端應用程序可以跟蹤用戶。服務器端應用程序可以使用此功能跟蹤客戶端在站點上的操作。Web服務器通過為站點上的每個用戶創(chuàng)建Session對象來維護用戶狀態(tài),這些Session對象存儲在服務器中,并在服務器中進行維護。在用戶向站點做出請求時,用戶就分配有一個新的Session對象和唯一的會話ID。此會話ID在后續(xù)的請求中會將用戶與Session對象進行匹配然后Session對象就作為請求的一部分被傳遞至處理請求的Servlet。Servlet可以在Session對象中添加信息或讀取其中的信息。會話對于由多個Servlet組成的應用程序來說很方便。6.3會話和環(huán)境-2用戶在站點上瀏覽時,會話跟蹤使Serv756.3會話和環(huán)境-3下面討論不同的會話跟蹤技術用戶認證隱藏表單字段URL重寫持久Cookie會話交換和持久6.3會話和環(huán)境-3下面討論不同的會話跟蹤技術766.3.1用戶認證在Web服務器只允許那些使用用戶名和口令進行登錄的客戶端訪問某些資源時,就需要使用用戶認證。在客戶端登錄后,用戶名即通過getRemoteUser()提供給Servlet。用戶名可用于跟蹤客戶端會話。一旦用戶登錄,瀏覽器即記住用戶名,并在用戶查看站點的新頁面時返回用戶名和口令。Servlet可以通過用戶名標識用戶,并以此跟蹤用戶。使用用戶認證的優(yōu)點是:容易實現??勺尫掌鞅Wo一組頁面,并使用getRemoteUser()標識每個客戶端。此技術即使在用戶從不同機器訪問站點時也有效。即使用戶離開站點或在返回站點前退出瀏覽器,此技術同樣有效。使用用戶認證的缺點是:要求每個用戶都注冊一個帳戶,然后在每次訪問站點時登錄。用戶在同一站點上不能同時維護多個會話。6.3.1用戶認證在Web服務器只允許那些使用用戶名和口令776.3.2隱藏表單字段隱藏表單字段是指添加到HTML表單中,但不在客戶端的瀏覽器中顯示的字段。在提交包含字段的表單時,字段將被發(fā)送至服務器。隱藏表單字段定義表單的常變量,但對于接收提交的表單的Servlet,隱藏字段和可見字段沒有區(qū)別。使用隱藏表單字段的優(yōu)點是其功能強大并支持匿名。所有常用瀏覽器都支持隱藏字段,而且它們可用于未登錄或注冊的客戶端。隱藏表單字段的缺點是只適用于動態(tài)生成的表單序列。在遇到靜態(tài)文檔、以電子郵件發(fā)送的文檔、設計為書簽的文檔和瀏覽器關閉時,該技術即束手無策。6.3.2隱藏表單字段隱藏表單字段是指添加到HTML表單中786.3.3URL重寫使用URL重寫技術,用戶單擊的每個URL都可被動態(tài)修改或重寫,以包括附加信息。附加信息的形式可為附加路徑信息、添加的參數或某些特定于服務器的自定義URL修改。重寫URL的可用空間是有限的,因此附加信息通常只限于唯一的會話ID。每種重寫技術都有其優(yōu)點和缺點。附加路徑信息適用于所有服務器,并作為使用GET和POST方法的表單的目標,但是,如果Servlet必須使用附加路徑信息作為實際路徑信息時,它就不適用。添加的參數適用于所有服務器,但在作為使用POST方法的表單的目標時將失效,并可能引起參數命名沖突。特定于服務器的自定義修改在任何情況下都適用于支持此類修改的服務器。6.3.3URL重寫使用URL重寫技術,用戶單擊的每個UR796.3.4持久CookieCookie是Web服務器發(fā)送至瀏覽器,以后可從該瀏覽器上讀回的少量信息。瀏覽器收到Cookie后,在每次訪問服務器上的頁面時都會將其發(fā)送回服務器。由于Cookie的值可以方便地標識客戶端,因此Cookie通常用于會話跟蹤。6.3.4持久CookieCookie是Web服務器發(fā)送至806.3.5會話交換和持久-1因為訪問一個站點的用戶可有許多個,所以就會有許多會話訪問同一站點。Internet站點必須支持許多有效會話,例如,大型站點可能同時有幾百甚至幾千個有效會話。由于每個會話都可以包含應用程序Servlet放置的任意數據對象,所以整個系統(tǒng)的內存要求就很高。內存中可以存在的會話數受到會話跟蹤系統(tǒng)的限制。session.maxresidents屬性設置此限制,當同時進行的會話的數量超過session.maxresidents設置的限制時,會話跟蹤器會將最近最不常用的會話交換到磁盤。被交換的會話沒有丟失,它們可以重載入內存。如果收到請求,會話將被重載。會話交換使得系統(tǒng)中的有效會話比內存所能容納的會話要多。6.3.5會話交換和持久-1因為訪問一個站點的用戶可有許多816.3.5會話交換和持久-2會話交換絕不會影響會話的無效性。如果會話的未使用時間超過正常失效時間,它就會無效,不管會話是在內存還是在磁盤。session.invalidationinterval屬性設置會話無效時間。串行化用于將會話寫入磁盤和從磁盤讀取會話。所以,可以串行化并置于會話中的對象將被寫入磁盤,而不能串行化的對象將保留在內存中(即使會話的一部分已被寫入磁盤),會話跟蹤操作不會受串行化的影響。因此,Servlet開發(fā)者只保存會話中的可串行化對象。實現java.io.Serializable或java.io.Externalizable接口的對象都可串行化。在啟用了會話持久功能時,會話跟蹤器將使用會話交換機制實現會話持久。服務器關閉時,內存中的會話即被寫入session.swapdirectory屬性中指定的磁盤。一旦啟動服務器,寫入磁盤的會話就變得有效。這就使服務器在重啟時不會丟失任何現有會話。會話中的可串行化數據元素在關閉/重啟操作時可以繼續(xù)運行。6.3.5會話交換和持久-2會話交換絕不會影響會話的無效性826.4HttpSession接口-1HttpSession接口定義一個對象,用于在客戶端和服務器之間提供關聯,此關聯在經過多次連接后仍然持久。它還可以維護事務處理之間的狀態(tài)。ServletAPI提供HttpSession接口以實現存儲功能。Servlet引擎可以創(chuàng)建一個對象,用于實現此接口,自動創(chuàng)建唯一的密鑰和將此密鑰附加至響應。Servlet引擎負責存儲會話、跟蹤會話持久時間以及根據Servlet需要檢索會話。Session對象必須具有生命周期,這樣引擎才能將其拋棄。6.4HttpSession接口-1HttpSession836.4HttpSession接口-2為了創(chuàng)建HTTP客戶端和HTTP服務器之間的會話,Servlet引擎使用HttpSession接口。對于用戶的多個連接或頁面請求,會話可持久的時間比實際指定的更長。正常情況下,會話對應一個建立至站點的連接并多次訪問站點的用戶。服務器通過使用Cookie或重寫URL來維護會話。Servlet可通過HttpSessio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論