




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第三章Servlet編程 2021年7月14日星期三第三章Servlet編程2 本章主要內(nèi)容 Servlet 基礎(chǔ)知識 Servlet 編程基本技能 Servlet 編程高級技能 Servlet Filter 原理和編程方法 2021年7月14日星期三第三章Servlet編程3 一、Servlet 基礎(chǔ)知識 1.1 什么是Servlet Servlet是運行在服務(wù)器端,用來響應(yīng)客戶端請求, 生成動態(tài)Web頁面的一個J2EE組件,是能夠使用 print語句產(chǎn)生動態(tài)HTML內(nèi)容的Java類,它符合 Java類的一般規(guī)則。Servlet在javax.servlet (基本的Servlet框架)和ja
2、vax.servlet.http (為Servlet響應(yīng)HTTP請求的Servlet框架的擴 展)包中作為Java的標準擴展類使用。 在Servlet API中提供了大量的方法,可以在Servlet 中調(diào)用。 2021年7月14日星期三第三章Servlet編程4 Servlet是位于Web服務(wù)器內(nèi)部的服務(wù)器端的 Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動的Java應(yīng)用 程序不同,Servlet由Web服務(wù)器進行加載,該Web服 務(wù)器必須包含支持Servlet的Java虛擬機。 Servlet是CGI(Common Gateway Interace,即: 公共網(wǎng)關(guān)接口)腳本的一種替代技術(shù),由于Ser
3、vlet 在性能、可移植性、代碼重用等方面比CGI具有顯著 的優(yōu)勢,現(xiàn)在已逐步或已經(jīng)取代了CGI。 2021年7月14日星期三第三章Servlet編程5 在默認情況下,Servlet采用一種無狀態(tài)的請求- 響應(yīng)處理方式。Servlet代碼的主要作用是為了增強 Java服務(wù)器端功能。當(dāng)發(fā)出客戶端請求的時候,調(diào)用 service()并傳遞一個請求和響應(yīng)對象。Servlet首先 判斷該請求是GET操作還是POST操作。然后它調(diào)用下 面的一個方法:doGet或doPost。如果請求是GET就調(diào) 用doGet方法,如果請求是POST就調(diào)用doPost方法。 doGet和doPost都接受請求(HttpS
4、ervletRequest)和 響應(yīng)(HttpServletResponse)。 2021年7月14日星期三第三章Servlet編程6 注意:Servlet不是從命令行啟動的,而是由包含 Java虛擬機的Web服務(wù)器進行加載,在一個容器內(nèi) 運行,并且APIs 提供了對會話和對象的生命周期的 管理。 2021年7月14日星期三第三章Servlet編程7 1.2 Servlet與Applet相比較: a) a) 相似之處:相似之處: (1)它們不是獨立的應(yīng)用程序,沒有main()方法。 (2)它們不是由用戶調(diào)用,而是由另外一個應(yīng)用程 序(容器)調(diào)用。 (3)它們都有一個生存周期,包含init()和
5、 destroy()方法。 b) b) 不同之處:不同之處: (1)Applet運行在客戶端,具有豐富的圖形界面。 (2)Servlet運行在服務(wù)器端,沒有圖形界面。 2021年7月14日星期三第三章Servlet編程8 1.3 Servlet工作原理 Servlet運行在Web服務(wù)器上的Web容器里。Web 容器負責(zé)管理Servlet。它裝入并初始化Servlet, 管理Servlet的多個實例,并充當(dāng)請求調(diào)度器,將客 戶端的請求傳遞到Servlet,并將Servlet的響應(yīng)返 回給客戶端。Web容器在Servlet的使用期限結(jié)束時 終結(jié)該Servlet。服務(wù)器關(guān)閉時,Web容器會從內(nèi)存 中
6、卸載和除去Servlet。 2021年7月14日星期三第三章Servlet編程9 多個請求的處理多個請求的處理 :為每個請求創(chuàng)建一個新的線程來處理客 戶端的請求 。 必須注意線程的同步問題! 2021年7月14日星期三第三章Servlet編程10 1.4 Servlet基本工作流程 (1)客戶機將請求發(fā)送到服務(wù)器; (2)服務(wù)器上的Web容器實例化(裝入)Servlet; (3)Web容器將請求信息發(fā)送到 Servlet; (4)Servlet創(chuàng)建一個響應(yīng),并將其返回到Web容器; (5)Web容器將響應(yīng)發(fā)回客戶機; (6)服務(wù)器關(guān)閉或Servlet空閑時間超過一定限度時, 調(diào)用destory
7、()方法退出。 2021年7月14日星期三第三章Servlet編程11 注意:Servlet也可以配置為Web應(yīng)用程序啟動時自 動裝載。 結(jié)論:結(jié)論: 客戶機與Servlet間沒有直接的交互。無論客 戶機對Servlet的請求還是Servlet對客戶端的響 應(yīng),都是通過Web服務(wù)器來實現(xiàn)的,這就大大提高 了Servlet組件的可移植性。 2021年7月14日星期三第三章Servlet編程12 1.5 Servlet的生命周期 Servlet的生命周期定義了一個Servlet如何被加 載、初始化,以及它怎樣接收請求、響應(yīng)請求、提供 服務(wù)。Servlet的生命周期如圖: 2021年7月14日星期三
8、第三章Servlet編程13 在編程代碼的實現(xiàn)中,Servlet生命周期由接口 javax.servlet.Servlet定義,所有的Servlet必須直 接或間接的實現(xiàn)javax.servlet.Servlet接口,這樣 才能在Servlet引擎(Engine)上運行。 Servlet引擎提供網(wǎng)絡(luò)服務(wù),響應(yīng)MIME請求,運 行Servlet容器。 javax.servlet.Servlet接口定義了一些方法, 在Servlet生命周期中,這些方法會在特定的時間上, 按一定的順序被調(diào)用。 注:注: MIME:Multipurpose Internet Mail Extensions,多 功能I
9、nternet 郵件擴充服務(wù)。 2021年7月14日星期三第三章Servlet編程14 ServletServlet的生命周期主要由的生命周期主要由3 3個過程組成。個過程組成。 1)Servlet的初始化:init()被調(diào)用于初始化,其 格式為: public void init(ServletConfig config) throws public void init(ServletConfig config) throws ServletExceptionServletException super.init(); super.init(); 在初始化過程中,Servlet應(yīng)當(dāng)準備好它要
10、安排的 一些資源,以便這個Servlet能夠接收請求,做到這些 可以不用考慮多線程,因為在Servlet初始化時只能是 單進程的。一旦初始化方法完成,Servlet就能接收客 戶端的請求。 2021年7月14日星期三第三章Servlet編程15 2)Servlet的執(zhí)行 service()用于實現(xiàn)事務(wù)邏輯,是處理請求的地方。 在服務(wù)器裝載和初始化Servlet后,Servlet就能夠處 理客戶端的請求,一般是使用service()來實現(xiàn)。每 個客戶端請求有它自己service()。這些方法接收客 戶端請求,并且發(fā)回相應(yīng)的響應(yīng)。Servlet組件能夠 同時運行多個service() 。這樣在程序
11、中,service() 可以按一個thread編寫。如:service()要更新 Servlet對象中的一個字段field,這個字段是可以同 時存取的。假如某個服務(wù)器不能同時并發(fā)地運行 service(),也可以用SingleThreadModel接口,這個 接口保證不會有兩個以上的線程(threads)并發(fā)運行。 在Servlet執(zhí)行期間其最多的應(yīng)用是處理客戶端的請 求并產(chǎn)生一個網(wǎng)頁。 2021年7月14日星期三第三章Servlet編程16 3)Servlet的結(jié)束 當(dāng)服務(wù)器卸載一個Servlet,它將調(diào)用Servlet的 destroy()。這個destroy()是與初始化方法的作用相 反
12、,同時從內(nèi)存中釋放Servlet。Destroy的格式為: public void destroy() 一個Servlet 在運行service() 方法時可能會產(chǎn)生 其它的線程,因此請確認在調(diào)用 destroy() 時,這些 線程都已終止或完成。 2021年7月14日星期三第三章Servlet編程17 1.6 Servlet API編程接口 2021年7月14日星期三第三章Servlet編程18 目的類、接口 Servlet實現(xiàn)javax.servlet.Servlet,javax.servlet.SingleThreadModel javax.servlet.GenericServlet,
13、javax.servlet.http.HttpServlet Servlet配置javax.servlet.ServletConfig Servlet異常javax.servlet.ServletException,javax.servlet.UnavailableException 請求和應(yīng)答javax.servlet.ServletRequest,javax.servlet.ServletResponse javax.servlet.ServletInputStream,javax.servlet.ServletOutputStream javax.servlet.http.HttpSer
14、vletRequest,javax.servlet.http.HttpServletResponse 會話跟蹤javax.servlet.http.HttpSession,javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionBindingEvent Servlet上下文javax.servlet.ServletContext Servlet協(xié)作javax.servlet.RequestDispatcher 其他javax.servlet.http.Cookie,javax.servlet.htt
15、p.HttpUtils 2021年7月14日星期三第三章Servlet編程19 1 1)通常編寫的Servlet類,一般從Javax包中的 HttpServlet類繼承而來,在HttpServlet中加入了一 些附加的方法,這些方法可以協(xié)助處理HTTP基本請求, 這些基本請求由HttpServlet類中的方法service()自 動地調(diào)用。這些方法有: doGet 用來處理HTTP的GET、頭部HEAD請求; doPost 用來處理HTTP的POST請求; doPut 用來處理HTTP的PUT請求; doDelete 用來處理HTTP的DELETE請求; doHead 用來處理HTTP的HEA
16、D請求; doOptions 用來處理HTTP的OPTIONS請求; doTrace 用來處理HTTP的TRACE請求。 2021年7月14日星期三第三章Servlet編程20 doGet:用來處理HTTP的GET請求。這個GET操 作僅僅允許客戶從HTTP server上取得GET資源。重載 此方法的用戶自動允許支持方法HEAD。這個GET操作 被認為是安全的,沒有任何的負面影響,對用戶來說 是很可靠的。 doGet方法格式為: protected void doGet(HttpServletResquest request,HttpServletResponse response) thr
17、ows ServletException,IOException; 2021年7月14日星期三第三章Servlet編程21 doPost:用來處理HTTP的POST請求。這個 POST操作包含了在必須通過此Servlet執(zhí)行的請求中 的數(shù)據(jù)。由于它不能立即取得資源,所以對于那些涉 及到安全性的用戶來說,通過POST請求操作會有一 些副作用。 doPost方法格式為: protected void doPost(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException
18、; 2021年7月14日星期三第三章Servlet編程22 doPut:用來處理HTTP的PUT請求。此PUT操 作模擬通過FTP發(fā)送一個文件。對于那些涉及到安 全性的用戶來說,通過PUT請求操作也會有一些副 作用。doPut方法格式為: protected void doPut(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 2021年7月14日星期三第三章Servlet編程23 doDelete:用來處理HTTP的DELETE請求。此 操作允許客戶端
19、請求一個從server移出的URL。對于 那些涉及到安全性的用戶來說,通過DELETE請求操 作會有一些副作用。doDelete方法格式為: protected void doDelete(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 2021年7月14日星期三第三章Servlet編程24 doHead:用來處理HTTP的HEAD請求。缺省地, 它會在無條件的GET方法執(zhí)行時運行,但是不返回任 何數(shù)據(jù)到客戶端。只返回包含內(nèi)容信息的長度的 header。
20、由于用到GET操作,此方法應(yīng)該是很安全的 (沒有副作用)也是可重復(fù)使用的。 doHead方法格 式為: protected void doHead(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 2021年7月14日星期三第三章Servlet編程25 doOptions:用來處理HTTP的OPTIONS請求。 此操作自動地決定支持什么HTTP方法。比如說,如 果讀者創(chuàng)建HttpServlet的子類并重載方法doGet,然 后方法doOptions會返回下
21、面的header:GET、 HEAD、TRACE和OPTIONS。doOptions方法格式為: protected void doOptions(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 2021年7月14日星期三第三章Servlet編程26 doTrace:用來處理HTTP的TRACE請求。此方 法的缺省實現(xiàn)產(chǎn)生一個包含所有在trace請求中的 header的信息的應(yīng)答(response)。在開發(fā)Servlet 時,多數(shù)情況下需要重載此方法。d
22、oTrace方法格式 為: protected void doTrace(HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 2021年7月14日星期三第三章Servlet編程27 2 2)HttpServletRequest HttpServerletRequest被傳到service()方法用來 提供客戶的請求信息。 HttpServerletRequest接口可以獲取由客戶端傳 送的闡述名稱,也可以獲取客戶端正在使用的通信協(xié) 議,也可以獲取產(chǎn)生請求并且
23、接收請求的遠端主機名 和IP地址等一些信息。 HttpServerletRequest接口提供獲取數(shù)據(jù)流的 Servlet、ServletInputStream方法,這些數(shù)據(jù)是客戶 端引用的POST和PUT方法提交的。一個 ServerletRequest的子類可以讓Servlet獲取更多的協(xié) 議特性數(shù)據(jù)。 2021年7月14日星期三第三章Servlet編程28 3 3)HttpServletResponse HttpServerletResponse用來向客戶端發(fā)送響應(yīng)信 息。 HttpServerletResponse接口給出相應(yīng)客戶端的 Servlet方法,它允許Servlet設(shè)置內(nèi)容長
24、度和回應(yīng)的 MIME類型,并且提供輸出流的ServletOutputStream。 HttpServerletRequest子類可以給出更多的 protocal-specific容量的信息。 4)HttpSession HttpSession接口被Servlet用來實現(xiàn)在HTTP客戶端 和HTTP會話兩者之間的關(guān)聯(lián)。這種關(guān)聯(lián)可能在多處連接 和請求中持續(xù)一段給定的時間。session用來在無狀態(tài) 的HTTP協(xié)議下越過多個請求頁面來維持狀態(tài)和識別用戶。 一個session可以通過Cookie或重寫URL來維持。 2021年7月14日星期三第三章Servlet編程29 1.7 Servlet應(yīng)用范圍
25、及其缺陷 Servlet用來寫應(yīng)用層是很強大的,但是對于寫表示 層就很不方便。JSP則主要是為了方便寫表示層而設(shè)計 的,當(dāng)然也可以寫應(yīng)用層。寫慣了ASP、PHP、CGI的同 學(xué),經(jīng)常會不自覺地把表示層和應(yīng)用層混在一起。比 如把數(shù)據(jù)庫處理信息放到JSP中,其實,它應(yīng)該放在應(yīng) 用層中。JSP中應(yīng)該僅僅存放與表示層有關(guān)的部分,也 就是說,只放輸出HTML網(wǎng)頁的部分。而所有的數(shù)據(jù)計 算、數(shù)據(jù)分析、數(shù)據(jù)庫連接處理,都屬于應(yīng)用層,應(yīng) 該放在JavaBeans中。通過JSP調(diào)用JavaBeans,實現(xiàn)兩 層的整合。 綜上所述,Servlet是一個不完善的產(chǎn)品,寫應(yīng)用層 很好,寫表示層就遜色多了,并且兩層混雜
26、。 2021年7月14日星期三第三章Servlet編程30 2.1 編寫響應(yīng)HTTP請求的Servlet程序的步驟: (1)創(chuàng)建一個擴展了 javax.servlet.http.HttpServlet接口的Servlet類。 (2)重寫doGet()或doPost()方法實現(xiàn)對HTTP請求信 息的動態(tài)響應(yīng)。 2.2 第一個Servlet的例子 此例演示Servet顯示靜態(tài)信息。 二、Servlet 編程基本技能 2021年7月14日星期三第三章Servlet編程31 在Eclipse環(huán)境下的開發(fā)方法與步驟: 創(chuàng)建一個J2EE項目: 創(chuàng)建一個Web模塊: 為這個Web模塊設(shè)置目標服務(wù)器: 生成并
27、編寫Servlet類: 在web.xml中添加相關(guān)信息: 啟動jBoss服務(wù)器并發(fā)布Web服務(wù): 啟動瀏覽器,訪問該Servlet服務(wù)。 2021年7月14日星期三第三章Servlet編程32 2021年7月14日星期三第三章Servlet編程33 程序31:FirstServlet.java package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServle
28、t; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstServlet extends HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /TODO Method stub generated by Lomboz resp
29、onse.setContentType(text/html); PrintWriter out = response.getWriter(); out.println( + + + + First Servlet + + + + + +Hello World! + + + + ); 2021年7月14日星期三第三章Servlet編程34 利用Eclipse快速修正錯誤 2021年7月14日星期三第三章Servlet編程35 Web應(yīng)用SimpleServlet的配置文件 2021年7月14日星期三第三章Servlet編程36 節(jié)點指明Servlet名稱與Servlet實現(xiàn)類之間 的對應(yīng)關(guān)系;
30、節(jié)點指明Servlet名稱與請求URL 之間的對應(yīng)關(guān)系; 節(jié)點指明請求Web應(yīng)用程序時的默認的 首頁; 節(jié)點指明Web應(yīng)用程序發(fā)生錯誤時導(dǎo) 向的錯誤頁面。 2021年7月14日星期三第三章Servlet編程37 2021年7月14日星期三第三章Servlet編程38 2021年7月14日星期三第三章Servlet編程39 2.3 處理客戶端輸入 第二個Servlet的例子,此例是要說明Servlet如何 處理客戶端的輸入并進行動態(tài)響應(yīng)。 2021年7月14日星期三第三章Servlet編程40 提交表單數(shù)據(jù) 歡迎登錄系統(tǒng) 用戶名: 2021年7月14日星期三第三章Servlet編程41 密 碼:
31、 2021年7月14日星期三第三章Servlet編程42 處理客戶端輸入 在Web程序設(shè)計中,以表單方式向服務(wù)器提交數(shù)據(jù)是最常見 的方法。表單數(shù)據(jù)的提交方法有兩種:Post方法和Get方法,當(dāng) 使用Post方法時,數(shù)據(jù)由標準的輸入設(shè)備讀入。 當(dāng)使用Get方法時,數(shù)據(jù)由CGI變量QUERY_STRING傳遞給表 單數(shù)據(jù)處理程序,即附加在請求地址的后面,在瀏覽器的地址 欄中可以看到。 用戶只要簡單的調(diào)用HttpServletRequest的getParameter() 方法,給出變量名稱即可取得該變量的值。需要注意的是,變 量的名稱是大小寫敏感的。當(dāng)請求的變量不存在時,將會返回 一個空字符串。 2
32、021年7月14日星期三第三章Servlet編程43 2021年7月14日星期三第三章Servlet編程44 2021年7月14日星期三第三章Servlet編程45 2.4 發(fā)送非HTML文檔 隨著Internet應(yīng)用的不斷擴展,為了支持多媒體數(shù)據(jù)類型, HTTP協(xié)議中就使用了附加在文檔之前的MIME數(shù)據(jù)類型信息 來標識數(shù)據(jù)類型。 Servlets 可以使用 MIME(Multipurpose Internet Mail Extention,多用途internet郵件擴展協(xié)議) 類型來向瀏覽器傳 送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正 確的 M
33、IME 類型能夠保證這些非 HTML 文件被正確的插件或 外部程序處理顯示。 解決方案:需要將 response 對象中header 的 content 類型設(shè)置 成相應(yīng)的MIME標志 res.setContentType(“application/pdf”) 2021年7月14日星期三第三章Servlet編程46 Servlet配置參數(shù)由ServletConfig對象表示。在 Servlet被實例化后,ServletConfig對象對任何客戶端 在任何時候訪問都有效,但一個Servlet的 ServletConfig對象不能被其他Servlet訪問。 在Servlet中要得到ServletC
34、onfig對象有兩種方法: 在init()方法中獲取(通過init的重載方法傳遞); 通過getServletConfig()方法直接獲取。 用途:通過配置信息來初始化Servlet可以有效避免硬 編碼信息,提高Servlet的可移植性。 2.5 獲取Servlet配置參數(shù) 2021年7月14日星期三第三章Servlet編程47 三、Servlet 編程高級技能 3.1 會話管理技術(shù) HTTP協(xié)議是一種無狀態(tài)的協(xié)議,客戶端每次打開 一個Web頁面,它就會與服務(wù)器建立一個新的連接,發(fā) 送一個新的請求到服務(wù)器,服務(wù)器處理客戶端的請求, 返回響應(yīng)到客戶端,并關(guān)閉與客戶端建立的連接。當(dāng) 客戶端發(fā)起新的
35、請求,那么它重新與服務(wù)器建立連接, 因此服務(wù)器并不記錄關(guān)于客戶的任何信息。但是對于 許多Web 應(yīng)用而言,服務(wù)器往往需要記錄特定客戶端 與服務(wù)器之間的一系列請求響應(yīng)之間的特定信息。例 如,一個在線網(wǎng)上商店需要記錄在線客戶的個人信息、 添加到購物車中的商品信息等。 2021年7月14日星期三第三章Servlet編程48 常見會話跟蹤技術(shù)有: Cookie; URL重寫; 隱藏表單域; 安全套接字層(Secure Socket Layer,SSL)的 會話。 u Java Servlet API提供了用于會話跟蹤和管理 會話內(nèi)狀態(tài)的機制。 在以上四種方法中,前二種是最常用的。 2021年7月14日
36、星期三第三章Servlet編程49 3.1.1 使用Cookie會話的跟蹤技術(shù) Cookie 是一小塊可以嵌入到HTTP 請求和響應(yīng)中 的數(shù)據(jù)。典型情況下,Web 服務(wù)器將Cookie 值嵌入 到響應(yīng)的頭部,而瀏覽器則在其以后的請求中都將攜 帶同樣的Cookie。Cookie的信息中可以有一部分用來 存儲會話ID,這個ID 被服務(wù)器用來將某些HTTP 請求 綁定在會話中。Cookie 由瀏覽器保存在客戶端,通常 保存為一個文本文件。Cookie 還含有一些其他屬性, 諸如可選的注釋、版本號及最長生存期。 2021年7月14日星期三第三章Servlet編程50 編程步驟:編程步驟: 1)創(chuàng)建Co
37、okie(由Web服務(wù)器創(chuàng)建,但是存放在客戶 端,保存的是一些鍵值對。) Cookie cookie = new Cookie(name,value); 2)將Cookie加到客戶端瀏覽器 HttpServletResponse.addCookie(cookie); 3)在服務(wù)器端取出客戶端傳過來的Cookie(返回 Cookie ) HttpServletRequest.getCookies(); Cookie.getName(); Cookie.getValue(); 2021年7月14日星期三第三章Servlet編程51 會話Cookie:只在當(dāng)前會話起作用的Cookie; 持久Cook
38、ie:保存在客戶本地一段時間的Cookie; u設(shè)置Cookie的時長:Cookie.setMaxAge(int timeout),單位是秒; 當(dāng)timeout0)時,意味著cookie將會在客戶端被 保存n秒; 當(dāng)timeout=0時,意味著這個cookie將會被刪除; u設(shè)置Cookie的有效路徑:Cookie.setPath(.) 2021年7月14日星期三第三章Servlet編程52 程序說明:HttpServletRequest 對象有一個 getCookies()方法,它可以返回當(dāng)前請求中的Cookie 對象的一個數(shù)組。程序首先調(diào)用getCookies()方法獲 得request
39、對象中的所有Cookie,然后尋找是否存在 名為“ServletStudy”的Cookie。如果有,則調(diào)用 Cookie 對象的getValue()、getName()等方法顯示其 信息;如果沒有,則創(chuàng)建一個新的Cookie 對象,并 調(diào)用response.addCookie()方法將其加入到response 對象并返回到客戶端。以后客戶端對服務(wù)器的任何訪 問都會在其頭部攜帶此Cookie。當(dāng)通過刷新頁面來查 看Cookie 的信息,可以看到顯示的Cookie信息是不 變的。 2021年7月14日星期三第三章Servlet編程53 2021年7月14日星期三第三章Servlet編程54 由于同
40、一客戶端對服務(wù)器的請求都會攜帶Cookie ,因此可以通過在Cookie 中添加與會話相關(guān)的信息達 到會話跟蹤的目的。P51例通過編程來演示如何通過 Cookie 實現(xiàn)會話跟蹤。 程序說明:程序使用Cookie 來實現(xiàn)會話的跟蹤, 在本示例中跟蹤的是會話中頁面的訪問次數(shù)。程序通 過將頁面訪問的次數(shù)寫入一個名為“VisitTimes”的 Cookie 中。由于對頁面的請求每次都包含了這個 Cookie,因此通過每次將Cookie 的值取出來顯示頁面 的訪問次數(shù),同時又將更新的值寫回到Cookie 來達到 會話跟蹤的目的。 2021年7月14日星期三第三章Servlet編程55 Cookie co
41、okie = null; /獲取請求相關(guān)的Cookie Cookie cookies = request.getCookies( ); /判斷Cookie VisitTimes 是否存在 /如果存在,其值加1 if (cookies != null) for (int i = 0; i cookies.length; i+) if (cookiesi.getName( ).equals(VisitTimes) String v=cookiesi.getValue(); int value=Integer.parseInt(v)+1; cookiesi.setValue(Integer.toSt
42、ring(value); cookie=cookiesi; /end for /end if 2021年7月14日星期三第三章Servlet編程56 /不存在,創(chuàng)建cookie if (cookie = = null) int maxAge=10000; /Create the Cookie object cookie = new Cookie(VisitTimes,1); cookie.setPath(request.getContextPath( ); cookie.setMaxAge(maxAge); response.addCookie(cookie); /end if 2021年7月
43、14日星期三第三章Servlet編程57 3.1.2 使用URL重寫會話跟蹤 關(guān)于是否應(yīng)當(dāng)使用Cookie 有很多的爭論,因為一些 人認為Cookie 可能會造成對隱私權(quán)的侵犯。有鑒于 此,大部分瀏覽器允許關(guān)閉Cookie 功能,這使得跟 蹤會話變得更加困難。如果不能依賴Cookie 的支持 ,那將不得不使用另外一種會話跟蹤方法:URL 重 寫。 URL 重寫通過在URL 地址后面增加一個包含會話信 息的字符串來記錄會話信息。URL地址與會話信息的 字符串之間用“?”隔開。如果有多個參數(shù),參數(shù)間 用“ out.println(age=+request.getParameter(age); 20
44、21年7月14日星期三第三章Servlet編程60 新出現(xiàn)的一種會話功能是SSL(Secure Sockets Layer,安全套接字層)會話,它是HTTPS 協(xié)議使用 的一種加密技術(shù),內(nèi)建了會話跟蹤功能,Servlet 容 器可以非常容易的使用這些數(shù)據(jù)建立會話跟蹤。 但是HTTPS 不是J2EE 規(guī)范要求Servlet 容器必 須支持的協(xié)議。 2021年7月14日星期三第三章Servlet編程61 3.1.3 使用HttpSession 對象跟蹤會話 HttpSession 接口允許 Servlet查看和管理關(guān)于 會話的信息,確保信息持續(xù)跨越多個用戶連接等。 HttpSession高級接口實
45、際上是建立在 Cookie 和 URL重寫這兩種會話跟蹤技術(shù)之上的,只不過由 Servlet自動實現(xiàn)了關(guān)于會話跟蹤的一切,不再需要 程序員了解具體細節(jié)。 Cookie把會話狀態(tài)信息保存在客戶端,而 Session把會話狀態(tài)信息保存在服務(wù)器端。 2021年7月14日星期三第三章Servlet編程62 使用 HttpSession 接口進行程序開發(fā)的基本步驟是: (1)獲取會話對象 HttpServletRequest.getSession(); (2)對會話對象進行讀或?qū)?設(shè)置屬性:HttpSession.setAttribute(name,Object); 獲取屬性:HttpSession.g
46、etAttribute(name); 刪除屬性:HttpSession.removeAttribute(name); (3)手工終止會話,或者什么也不做,讓它自動終 止。每個會話對象都有一定的生存周期,超過這個 周期,容器將自動將會話對象中止。 2021年7月14日星期三第三章Servlet編程63 Session什么時候失效? 1:程序中調(diào)用HttpSession.invalidate()方法; 2:Session過期,在Session的最大有效時間以外; 3:關(guān)閉應(yīng)用服務(wù)器。 設(shè)置Session的有效時間: 1:HttpSession.setMaxInactiveIntervale(int
47、 second) 單位秒 2:在web.xml中進行配置 . 2021年7月14日星期三第三章Servlet編程64 編程中經(jīng)常使用的HttpSession 接口方法有以下幾種: isNew()。如果客戶機還不知道會話,則返回true。如果客 戶機已經(jīng)禁用了Cookie,則會話在每個請求上都是新的。 getId()。返回包含分配給這個會話的唯一標識的字符串。 在使用URL 改寫以標識會話時比較有用。 setAttribute()。使用指定的名稱將對象綁定到這個會話 getAttribute()。返回綁定到此會話的對象(帶有指定名 稱)。 setMaxInactiveInterval()。指定在
48、 Servlet 使該會話無效之 前客戶機請求間的時間。負的時間表示會話永遠不會超時。 invalidate()。終止當(dāng)前會話,并解開與它綁定的對象。 2021年7月14日星期三第三章Servlet編程65 P57 :Servlet 中使用HttpServletRequest 對象的getSession()方法 來取得當(dāng)前的用戶會話。GetSession()的參數(shù)決定了如果會話尚 不存在,是否創(chuàng)建一個新會話。(還有一個版本的getSession() 沒有任何參數(shù),它將默認地創(chuàng)建一個新會話)。一旦獲得了會話 對象,就可以像操作哈希表(Hashtable)一樣使用一個唯一的 鍵,在會話對象中加入或
49、者獲取任何對象。通過調(diào)用 setAttribute()將用戶訪問次數(shù)信息存入會話,通過調(diào)用 getAttribute()來獲取會話中存儲的信息。 2021年7月14日星期三第三章Servlet編程66 3.1.4 使用會話實現(xiàn)購物車的例子 P59 2021年7月14日星期三第三章Servlet編程67 3.2 Servlet上下文 服務(wù)器上的每個Web應(yīng)用都會有一個背景環(huán)境對 象。上下文對象提供了一個同一Web應(yīng)用內(nèi)的不同資 源間共享信息的場所。 Javax.Servlet.ServletContext接口提供正在 運行的Servlet所處的Web應(yīng)用程序的上下文對象的 視圖,可以通過Serv
50、letConfig實例的 getServletContext()方法得到該Servlet運行的上 下文對象。 2021年7月14日星期三第三章Servlet編程68 通過Servlet 上下文可以實現(xiàn)以下功能: (1)訪問Web應(yīng)用程序資源; (2)在Servlet上下文屬性中保存Web應(yīng)用程序信息; (3)獲取初始化參數(shù)信息; (4)提供日志支持。 2021年7月14日星期三第三章Servlet編程69 請求指派:在一個Servlet處理完畢后,將客戶端的 請求傳遞到另外一個Servlet來處理。 為了實現(xiàn)請求指派,Servlet規(guī)范定義了一個接口: javax.serlet.Request
51、dispatcher Requestdispatcher封裝了到同一Web應(yīng)用的另外一 個資源的應(yīng)用,可以通過調(diào)用Requestdispatcher的 forword()方法將請求傳遞給其他資源。 2021年7月14日星期三第三章Servlet編程70 P67例、P69例 2021年7月14日星期三第三章Servlet編程71 3.3 Servlet間的協(xié)作 當(dāng)Web 容器接收到客戶端的請求后,它負責(zé)創(chuàng)建 request 對象和response 對象,然后將這兩個對 象以參數(shù)的形式傳遞給與請求URL 地址相關(guān)聯(lián) 的Servlet 的service()方法進行處理。但對于復(fù) 雜的處理過程,僅僅通過一個Servlet 來實現(xiàn)對 于請求的處理往往比較困難,這時經(jīng)常需要幾個 Servlet 間共同協(xié)作完成對于請求的處理,也就 是說,在一個Servlet 處理完畢后,將客戶端的 請求傳遞到另外一個Servle
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025BT工程合同概述及合同范本下載
- 2025婚禮策劃服務(wù)合同示范文本 合同范本
- 2025版權(quán)許可協(xié)議合同范本:圖書出版合同
- 2025專利許可合同樣本
- 2025合作協(xié)議書合同范本
- 2025上海勞動合同標準范本
- 2025綜合布線施工合同范本
- 網(wǎng)貸市場的監(jiān)管政策解讀考核試卷
- 2025專業(yè)版技術(shù)服務(wù)合同示范文本
- 2025年國際貿(mào)易合作合同合同
- 加油站現(xiàn)場服務(wù)提升方案
- 絕緣搖表培訓(xùn)
- 保險合規(guī)知識培訓(xùn)課件
- 2025年廣東省深圳市高考語文一模試卷
- 酒店客房保潔服務(wù)人員配置方案
- 第八課 學(xué)習(xí)借鑒外來文化的有益成果教學(xué)設(shè)計-2024-2025高中政治統(tǒng)編版必修四哲學(xué)與文化
- 虛擬電廠接入配電網(wǎng)電力系統(tǒng)調(diào)度優(yōu)化
- 機場安檢人員培訓(xùn)
- 用戶能耗監(jiān)測的智能插座原型設(shè)計
- 新能源汽車廢舊動力電池綜合利用行業(yè)規(guī)范條件(2024年本)
- 2023敏感肌美白產(chǎn)品的市場需求數(shù)據(jù)分析報告-魔鏡洞察
評論
0/150
提交評論