第三章servlet編程(netbeans版).ppt_第1頁
第三章servlet編程(netbeans版).ppt_第2頁
第三章servlet編程(netbeans版).ppt_第3頁
第三章servlet編程(netbeans版).ppt_第4頁
第三章servlet編程(netbeans版).ppt_第5頁
已閱讀5頁,還剩114頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第三章servlet編程,第三章Servlet編程,3.1.1 Servlet基礎(chǔ) 3.1.2Servlet工作原理 Servlet的生命期 3.1.3Servlet編程-ServletAPI,3.0 附:Web編程基礎(chǔ),HTTP協(xié)議簡介 HTML 靜態(tài)網(wǎng)頁與動態(tài)網(wǎng)頁,URL:統(tǒng)一資源定位符,Uniform Resource Locator:確定某信息的位置 格式: :/:端口號 例子 : 5/zsjy.aspx 5/ telnet: /:70 ftp: //pub/www/doc,

2、HTTP協(xié)議(HyperText Transfer Protocol),超文本傳輸協(xié)議 事務(wù)處理由4個步驟組成: (1)客戶端與服務(wù)器建立連接; (2)客戶端向服務(wù)器提出請求; (3)如果請求被接受,則服務(wù)器送回響應(yīng),在響應(yīng)中包括狀態(tài)碼和所需的文件; (4)客戶端和服務(wù)器斷開連接。,IP地址,識別Internet中主機及網(wǎng)絡(luò)設(shè)備的唯一標(biāo)識 表示方法:網(wǎng)絡(luò)地址+主機地址,長度為4個字節(jié)(32bit),由3個用“.”分隔的十進(jìn)制數(shù)組成,每個數(shù)不大于255,如22 A類:用于規(guī)模很大主機數(shù)目很多的網(wǎng)絡(luò) B類:用于中型到大型的網(wǎng)絡(luò) C類:用于小型本地網(wǎng)絡(luò)(LAN) 思考:IPv

3、4 IPv6?,域名,DNS:域名服務(wù)器,為主機分配字符名稱,即域名,并實現(xiàn)域名與IP地址的轉(zhuǎn)換 如: com 商業(yè)組織 edu教育機構(gòu) gov政府部門 mil軍事部門 net網(wǎng)絡(luò)中心 org非盈利性組織 int國際組織,端口port,一臺擁有IP地址的主機可以提供許多服務(wù),比如Web服務(wù)、FTP服務(wù)、SMTP服務(wù) 如何區(qū)分服務(wù):端口 網(wǎng)絡(luò)上的服務(wù):IP(域名) + 端口 :8080/ FTP:21,web:80,這些端口也可自己指定 01023:常用端口,綁定特定服務(wù),固定的102465535之間的端口是動態(tài)端口,不固定分配。每個網(wǎng)絡(luò)程序通信都要通過端口的,如QQ、BT、迅雷等,思考:,要唯

4、一標(biāo)識網(wǎng)絡(luò)中某主機上的一個運行的程序(進(jìn)程)需要幾個元素?,網(wǎng)絡(luò)中的一個進(jìn)程的唯一標(biāo)識為:主機地址+進(jìn)程地址(端口號),3.0.2HTML簡介,HTML:超文本標(biāo)記語言(Hyper Text Markup Language) WWW上的專用語言:描述頁面內(nèi)容和結(jié)構(gòu) HTML文檔:它能獨立于各種操作系統(tǒng)平臺 擴展名為.html 或 .htm HTML文檔的編寫方法: (1)手工編寫: 如記事本 (2)用可視化所見即所得的HTML編輯工具設(shè)計 Frontpage,dreamwaver (3)格式轉(zhuǎn)換工具: 現(xiàn)有的其它格式文檔(如WORD文檔)轉(zhuǎn)換成HTML文檔。 (4)由Web服務(wù)器實時動態(tài)地生成

5、HTML文檔 Jsp、aspx、servlet,HTML語法,Html文檔是帶有標(biāo)記的文本文件 1.成對出現(xiàn)的標(biāo)記 這是我的第一個的HTML文檔 2.只有開始標(biāo)志,沒有結(jié)束標(biāo)志 現(xiàn)在我開始HTML學(xué)習(xí),這是第一次學(xué)習(xí) 3.標(biāo)志嵌套 這是我的第一次學(xué)習(xí) 4.帶有屬性的標(biāo)志 這是我的第一個HTML文檔,2) HTML文檔的結(jié)構(gòu), 窗口標(biāo)題 ,向瀏覽器說明HTML版本,放在文檔開頭, MyHtml.html - This is my HTML page. ,索引,用于搜索工具搜索,說明所使用的css樣式表,瀏覽器窗口標(biāo)題頭,正文,瀏覽器窗口標(biāo)題頭,索引,用于搜索工具搜索,瀏覽器窗口標(biāo)題頭,說明所使用

6、的css樣式表,索引,用于搜索工具搜索,瀏覽器窗口標(biāo)題頭,正文,說明所使用的css樣式表,索引,用于搜索工具搜索,瀏覽器窗口標(biāo)題頭,例:登錄界面 P30, 提交表單數(shù)據(jù) 歡迎登錄系統(tǒng) 用戶名 密碼 ,標(biāo)題1,黑體,居中,表單,提交到getpostData.class ,方法是post,表格居中,占整個窗口的30%,邊寬2,用屬性設(shè)置,tr是表格一行,td是一個單元格 ,占一行的57%,用div排版, 輸入框,類型是文本輸入,控件名為username,,按鈕,類型是submit按鈕,控件名為Submit,按鈕上顯示的文本是”提交“,創(chuàng)建一個HTML文檔 設(shè)置文檔標(biāo)題和其它在網(wǎng)頁中不顯示的信息 設(shè)

7、置文檔的標(biāo)題 最大的標(biāo)題 黑體字 斜體字 加重文本(通常是斜體加黑體) 設(shè)置字體大小從1到7,顏色使用名字或RGB十六進(jìn)制值 創(chuàng)建一個段落 將段落按左、中、右對齊 換行插入一個回車換行符 用來排版大塊HTML段落,也用于格式化表 創(chuàng)建超文本鏈接 創(chuàng)建自動發(fā)送電子郵件的鏈接 創(chuàng)建一個表格 表格中的每一行 表格中一行中的每一個格子 設(shè)置表格頭:通常是黑體居中文字 設(shè)置表格格子的水平對齊方(left, center,right,justify) 設(shè)置表格格子的水平對齊方式(left, center,right,justify) 創(chuàng)建表單 action=.接收數(shù)據(jù)的服務(wù)器的URL method=“.”

8、HTTP的方法(get,post)。其中g(shù)et是被反對使用的 單行文本輸入?yún)^(qū)域,size設(shè)置以字符串寬度 創(chuàng)建提交(submit)按鈕 創(chuàng)建重置(reset)按鈕,3.0.3靜態(tài)網(wǎng)頁與動態(tài)網(wǎng)頁,靜態(tài)網(wǎng)頁: 純靜態(tài):只包括單純的文本或圖像無法交互 如大學(xué)簡介 URL的后綴是.htm、.html、.shtml、.xml 瀏覽器端交互式:加入Javascript 或Vbscript腳本代碼 仍然是靜態(tài)網(wǎng)頁,它不需要Web服務(wù)器做任何工作 缺點: 無法支持后臺數(shù)據(jù)庫。 無法有效地對站點信息進(jìn)行及時的更新。 無法實現(xiàn)動態(tài)顯示效果 動態(tài)網(wǎng)頁 在傳統(tǒng)的靜態(tài)頁面中加入各種程序和邏輯控制,實現(xiàn)瀏覽器客戶端和We

9、b服務(wù)器的動態(tài)信息交互 aspx、.jsp、 .asp、.php、.perl、.cgi 為后綴 如用戶注冊、用戶登錄、在線調(diào)查、用戶管理、訂單管理,靜態(tài)網(wǎng)頁工作原理,瀏覽器端,服務(wù)器端,編寫web頁,發(fā)出請求,定位html文件,瀏覽器處理html,返回html文件到瀏覽器,每個靜態(tài)網(wǎng)頁都是保存在服務(wù)器上的一個獨立的文件,動態(tài)網(wǎng)頁工作原理,接受請求,找到動態(tài)網(wǎng)頁,發(fā)送網(wǎng)頁,服務(wù)器端,執(zhí)行程序代碼 生成網(wǎng)頁,瀏覽器端,動態(tài)網(wǎng)頁的優(yōu)勢,動態(tài)網(wǎng)頁: (1) 以數(shù)據(jù)庫技術(shù)為基礎(chǔ) 可以大大降低網(wǎng)站維護(hù)的工作量; (2) 可以實現(xiàn)更多交互功能 如用戶注冊、用戶登錄、在線調(diào)查、用戶管理、訂單管理等 (3)動態(tài)

10、網(wǎng)頁是由服務(wù)器動態(tài)生成的 它實際上并不是事先寫好的、獨立存在Web服務(wù)器上的網(wǎng)頁文件,只有當(dāng)用戶請求時服務(wù)器才動態(tài)生成一個網(wǎng)頁,并返回一個完整的網(wǎng)頁到客戶端瀏覽器。,3.1 Servlet基礎(chǔ),Servlet(java服務(wù)器小程序):用java編寫的服務(wù)器端程序,由服務(wù)器調(diào)用和執(zhí)行的java類(字節(jié)碼) 可動態(tài)生成web頁面 Servlet同協(xié)議、平臺無關(guān) Servlet不是由命令行啟動的,由包含JVM的web 服務(wù)器加載的,與傳統(tǒng)Java應(yīng)用程序相比較,不是從命令行啟動。 而是由包含JVM的Web服務(wù)器進(jìn)行加載。,Servlet,Java Servlet API,就是,Servlet對Web

11、 Server而言,Applet對Client而言,就像,Java平臺對Servlet的支持,3.1.2 Servlet工作原理,Web瀏覽器通過HTTP提出請求。 Web服務(wù)器接收請求并將其發(fā)給Servlet。如果這個Servlet尚未 被加載,Web服務(wù)器將把它加載到Java虛擬機并且執(zhí)行它。 3. Web容器將請求信息發(fā)往Servlet,Servlet將接收HTTP請求并執(zhí)行某種處理。 4. Servlet將向Web服務(wù)器返回應(yīng)答。 Web服務(wù)器將從Servlet收到的應(yīng)答發(fā)送給客戶端 服務(wù)器關(guān)閉或Servlet空閑超過一定時間,調(diào)用destroy()退出,3.Web容器將請求信息發(fā)往S

12、ervlet, Servlet 的生命周期,Servlet的生命周期開始于被裝載到Servlet容器中,結(jié)束于被終止或重新裝入時。分為三個階段: 1.初始化階段: Servlet的裝載、實例化和初始化 第一次請求Servlet的時候,服務(wù)器中的Servlet容器動態(tài)裝入Servlet,創(chuàng)建一個Servlet實例,調(diào)用Servlet的init()方法對Servlet實例初始化: Servlet容器啟動時,自動加載 Servlet Servlet容器啟動后,客戶首次向Servlet發(fā)出請求。 Servlet的類文件被修改后,重新加載 注意: init只在Servlet創(chuàng)建時被調(diào)用,常

13、用來做一次性的初始化的工作。 Servlet被發(fā)來的第一個請求激活,然后繼續(xù)運行于后臺,以線程形式處理請求,速度非??欤钡絊ervlet被修改時才再次加載。 2 服務(wù)階段; 容器接收到對此Servlet的請求,則調(diào)用Servlet的service()方法。 service()方法中調(diào)用doGet()或doPost()。 3.終止階段 實例被銷毀,通過調(diào)用Servlet的destory()方法來銷毀Servlet,多個請求的處理,一個Servlet在同一時刻只有一個實例,并且它在Servlet的使用期間將一直保留。 為每個請求創(chuàng)建一個新的線程來處理客戶端的請求,客戶A,客戶B,線程B,線程A,

14、Web容器,Servlet實例,Web服務(wù)器,必須注意線程的同步問題!,3.1.3 Servlet編程 Servlet API,Servlet API由兩個Java包組成 javax.servlet 定義了類都所有的Servlet必須實現(xiàn)或擴展的接口或類。 javax.servlet.http 定義了采用HTTP協(xié)議進(jìn)行通信的Httpservlet類。,包:javax.servlet接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。

15、所包含的類:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。包:javax.servlet.http接口: HttpServletRequest ; HttpServletResponse ; HttpSession ;HttpSessionBindingListener;HttpSessionContext。類:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。,Servelt編程相關(guān)接口及其關(guān)系,Ht

16、tpServlet,ServletConfig,HttpServletRequest,ServletException,RequestDispatcher,HttpSession,HttpServletResponse,ServletContext,配置信息,請求,意外情況,協(xié)作,會話管理,響應(yīng),運行環(huán)境信息,3.2第一個Servlet,新建web項目,2. 創(chuàng)建Servlet文件,3.為該項目創(chuàng)建部署文件web.xml,4.部署Sevlet程序,5.啟動Glashfish-3,6.用IE打開網(wǎng)頁,例:servlet 顯示靜態(tài)頁面,新建web項目 名為SimpleServlet 創(chuàng)建Servl

17、et文件: 包名:com.servlet Servlet名稱:First URL映射/First 自動生成First.java文件 (P24 程序3_1) doGet()或doPost()方法,分別來響應(yīng)客戶端發(fā)出的GET、POST 請求。開發(fā)人員可以分別覆蓋這兩個方法即可 Web服務(wù)器如何將瀏覽器中輸入的URL http:/localhost:8080/SimpleServlet/Fist 自動映射為名為First的Servlet?是怎么通過URL找到相對應(yīng)的Servlet的.class文件呢? 每個web程序都對應(yīng)一個web應(yīng)用的配置文件Web.XML,位于該項目的SimpleServle

18、t-Web-WEB-INF目錄下 為該項目創(chuàng)建部署文件web.xml 部署Servlet程序 將web應(yīng)用被部署到web服務(wù)器 5. 啟動Glassfish-3,1)新建web項目 名為simpleServlet,文件新建項目java webweb應(yīng)用程序,2)創(chuàng)建Servlet文件名為First,點擊netbeans左側(cè)項目導(dǎo)航欄,右鍵新建Servlet Servlet名為First 包名:com.servlet 生成了名為First.java文件 URL映射 /First,選中,這些會自動寫入web.xml部署文件,將來可以通過http:/localhost:8080/SimpleServ

19、let/First來訪問該servlet,自動生成的First.java,package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Fi

20、rst extends HttpServlet public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html); PrintWriter out = response.getWriter(); out.println(); out.println(); out.println( Servlet First); out.println( ); out

21、.print(HelloWorld!); /將上句改為頁面上helloworld out.println( ); out.println(); out.close(); ,獲得PrintWriter對象,能夠向瀏覽器端寫html語言,向瀏覽器端輸出html語言,動態(tài)生成頁面 注意是字符串形式“ ”,Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request, r

22、esponse); Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request, response); Override public String getServletInfo() return Short description; ,問題:servlet的代碼生成了,但是在服務(wù)器端,瀏覽器端怎么通過URL能訪問的到呢?http:/localhost:808

23、0/SimpleServlet/First web配置文件web.xml,3)為該項目自動創(chuàng)建的部署文件web.xml,創(chuàng)建web項目時自動生成了web配置文件web.xml,對Servlet所對應(yīng)的URL地址進(jìn)行了映射/First,web.xml:在web應(yīng)用加載的自動加載, First com.servlet.First First /First 30 ,http:/localhost:8080/SimpleServlet/First,4)生成和部署Servlet程序,生成web應(yīng)用自動被打包 項目窗口,選中SimpleServlet,右鍵生成 則輸出窗口提示生成SimpleServlet

24、.war包 部署 項目窗口,選中SimpleServlet,右鍵部署 Glassfish自動被啟動 注:若重新修改源程序后,需要再次運行部署 重新發(fā)布到服務(wù)器上 5)啟動Glassfish 上述步驟運行部署和運行時,Glassfish自動運行 或服務(wù)應(yīng)用服務(wù)器Glassfish右鍵啟動,6.在IE中運行,6.在IE中,輸入 http:/localhost:8080/SimpleServlet/First 出現(xiàn)Servlet中的helloworld,附:【可能出現(xiàn)的漢字編碼問題】,若netbeans某個版本出現(xiàn)了漢字亂碼,則查看一下項目屬性,編碼改為gb2312,Servlet:處理請求并進(jìn)行響

25、應(yīng),客戶端向服務(wù)器端發(fā)送一個請求,服務(wù)器端獲得該請求后,處理請求并把處理的結(jié)果返回到客戶端,這個過程建立在HTTP協(xié)議“請求-響應(yīng)”模式基礎(chǔ)上。 在服務(wù)器端,Servlet程序的運行需要兩個基本的Servlet對象: (1)Servlet的請求對象:包含客戶端請求的細(xì)節(jié),如請求的方法,請求的文件頭等。 (2)Servlet的響應(yīng)對象:包含服務(wù)器端響應(yīng)時的細(xì)節(jié),如響應(yīng)的文件類型,響應(yīng)的編碼等。,HttpServletRequest接口 繼承了ServletRequest接口 ServletRequest接口封裝了客戶請求信息,如客戶請求方式、參數(shù)名和參數(shù)值、客戶端正在使用的協(xié)議,以及發(fā)出客戶請求

26、的遠(yuǎn)程主機信息等。它還為Servlet提供了直接以二進(jìn)制數(shù)方式讀取客戶請求數(shù)據(jù)流的ServletInputStream HttpServletRequest可以為Servlet提供更多的與HTTP協(xié)議相關(guān)的數(shù)據(jù),如提供了讀取HTTP Head信息的方法,獲取Session和Cookie的方法。,getAttributeNames()獲取請求中所有屬性名字的集合 getAttribute(String name)獲取name指定的屬性值 setAttribute(String name,Object value)設(shè)置屬性name的值為value getCookies()獲取客戶端發(fā)送的Cooki

27、e getSession()獲取和客戶端相關(guān)的Session,如果沒有給客戶端分配Session,則返回null getSession(boolean create)獲取和客戶端相關(guān)的Session,如果沒有給客戶端分配Session,則創(chuàng)建一個Session并返回 getParameter(String name)獲取請求中的參數(shù),該參數(shù)是由name指定的 getParameterValues(String name)獲取請求中的參數(shù)值數(shù)組,該參數(shù)值是由name指定的 getCharacterEncoding()獲取請求的字符編碼方式 getContentLength()獲取請求體的有效長度

28、 getInputStream()獲取請求的輸入流 getMethod()獲取發(fā)送請求的方式,如GET、POST getParameterNames()獲取請求中所有參數(shù)名字的集合 getRemoteAddr()獲取客戶端的IP地址 getRemoteHost()獲取客戶端的名字 getServerName()獲取接受請求的服務(wù)器的名字 getServletPath()獲取請求的Servlet的URL(不包含查詢字符串),HttpServletResponse接口 繼承自ServletResponse接口 ServletResponse接口封裝了響應(yīng)客戶請求的方法,如設(shè)置響應(yīng)的內(nèi)容類型,設(shè)置響

29、應(yīng)的編碼方式,獲取輸出流ServletOulputStream HttpServletResponse可以為Servlet提供更多的與HTTP協(xié)議相關(guān)的方法,如提供了設(shè)置響應(yīng)頭,添加Cookie等。,addCookie(Cookie cookie)將指定的Cookie加入到當(dāng)前的響應(yīng)中 addHeader(String name,String value)將指定的名字和值加入到響應(yīng)的頭信息中 containsHeader(String name)返回一個布爾值,判斷響應(yīng)的頭部是否被設(shè)置 encodeURL(String url)對指定的URL進(jìn)行編碼 sendError(int sc)使用指定

30、狀態(tài)碼發(fā)送一個錯誤到客戶端 sendRedirect(String location)重定向到其他頁面 setHeader(String name,String value)用給出的名字和值設(shè)置響應(yīng)的頭部 setStatus(int sc)給當(dāng)前響應(yīng)設(shè)置狀態(tài)碼 setContentType(String ContentType)設(shè)置響應(yīng)的MIME類型,3.3 處理客戶端請求,靜態(tài)頁面:前面的例子是servlet顯示靜態(tài)頁面 動態(tài)頁面:servlet根據(jù)瀏覽器端請求進(jìn)行響應(yīng) 如 login 賬號,密碼 瀏覽器端以表單方式提交數(shù)據(jù) GET:數(shù)據(jù)附加在URL后面 POST:數(shù)據(jù)由標(biāo)準(zhǔn)的輸入設(shè)備讀入

31、服務(wù)器端自動處理上述兩種方法,只需調(diào)用HTTPServletRequest的getParameter(變量名) 變量名區(qū)分大小寫,例:登錄頁面 效果,1.login.html :接受用戶賬號、密碼輸入 項目SimpleServlet : 右鍵 新建html名為login.html 2.負(fù)責(zé)處理用戶輸入的Servlet: 名稱: GetPostData 對應(yīng)的URL: /GetPostData, 用戶名 密碼 ,login.html,public class GetPostData extends HttpServlet public void processRequest(HttpServle

32、tRequest request, HttpServletResponse response) out.println( “username:”+request.getParameter(“username”)+“br”+ password:+request.getParameter(password)+“br+ public void doPost(HttpServletRequest request, HttpServletResponse response) processRequest(request,response); , GetPostData com.servlet.GetPo

33、stData GetPostData /GetPostData ,web.xml,GetPostData.java,requset對象攜帶 username,“zhang”, password,”123”,1)login.html :,接受用戶賬號、密碼輸入 項目SimpleServlet : 右鍵 新建html名為login.html, 提交表單數(shù)據(jù) 歡迎登錄系統(tǒng) 用戶名 密碼 ,切記,否則漢字顯示為亂碼,2)servletGetPostData,Servlet的映射的/GetPostData一定要與前面login.htm的action的名字一致 否則web服務(wù)器找不到相應(yīng)的servlet,

34、import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetPostData extends HttpServlet public void processRequest(H

35、ttpServletRequest request, HttpServletResponse response) throws ServletException, IOException PrintWriter out=response.getWriter(); out.println( n+ +getpostdata+ n+ “username:”+request.getParameter(“username”)+“br”+ /書上/n改為 password:+request.getParameter(password)+“br+ +n+ + ); out.close(); public v

36、oid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request,response); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException processRequest(request,response); ,重新部署SimpleSe

37、rvlet,在項目導(dǎo)航欄 點擊SimpleServlet右鍵部署 或者直接點擊login.htm右鍵運行文件 均會自動啟動Glassfish-3,運行,輸入:http:/localhost:8080/SimpleServlet/login.html,漢字顯示為亂碼的問題,怎么是亂碼,不是中文用戶名? 是request傳遞的時候需要中文編碼 GetPostData顯示生成頁面時也需要中文編碼,login.html中 ,request傳遞參數(shù),request傳遞參數(shù),2.request傳遞的時候需要中文編碼 3.GetPostData顯示生成頁面時也需要中文編碼,1.Login.html設(shè)置顯示中

38、文,public class GetPostData extends HttpServlet public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException request.setCharacterEncoding(GB2312); response.setContentType(text/html;charset=GB2312); PrintWriter out=response.getWriter(); out.

39、println( n+ “username:”+request.getParameter(“username”)+“br”+ /書上/n改為 password:+request.getParameter(password)+“br+ 。,GetPostData.java設(shè)置接受中文參數(shù),并生成顯示中文頁面,Request 傳遞參數(shù),顯示正常!,3.4 會話管理,Http是無狀態(tài)協(xié)議,客戶端每打開一次web頁面,就會與服務(wù)器建立一次新的連接 (每一次新的連接,都經(jīng)歷如下請求),服務(wù)器不記錄任何關(guān)于客戶的信息,帶來的問題,會話跟蹤技術(shù),3.6.1 使用Cookie進(jìn)行會話跟蹤,Cookie是一小塊

40、嵌到Http請求和響應(yīng)中的數(shù)據(jù)。 Web服務(wù)器將cookie嵌入響應(yīng)的頭部,而瀏覽器的同一客戶端則在以后的請求中都將在頭部攜帶同樣的cookie Cookie由瀏覽器存在客戶端,常為一個文本文件 Cookie中添加與會話相關(guān)的內(nèi)容,實現(xiàn)會話跟蹤 Cookie包含可選的注釋、版本號及最長生命周期(如商城,超過30分鐘,cookie失效。) Cooke的爭議:可能暴露隱私 如你的賬號名、密碼每次保存在客戶端,自動登錄,所以大部分瀏覽器都關(guān)閉cookie功能使用URL重用跟蹤會話,Cookie的使用方法,(1)用Cookie類,和request.getCookies()獲得當(dāng)前請求中的所有Cooki

41、e (2)用Cookie.getValue.getName()等方法顯示Cookie信息 找有無你想要的cookie (3)若沒有,則創(chuàng)建Cookie Cookie(String CookieName,Sting CookieValue) Cookie的名字 Cookie的值 例1:創(chuàng)建cookie Cookie cookie=new Cookie(“visit Time”,”1”); /(例3-12)作為網(wǎng)頁的計數(shù)器,每次網(wǎng)頁打開的時候更改 如int value=Integer.parseInt(cookie.getValue()+1; 例2:用cookie保存用戶名cq Cookie co

42、okie=new Cookie(“ServletStudy”,”cq”); /若沒有對cookie的值的修改,則每次刷新頁面,用戶名不變,(1)用Cookie類,和request.getCookies()獲得當(dāng)前請求中的所有Cookie (2)用Cookie.getValue和 getName()等方法顯示Cookie信息 找有無你想要的cookie (3)若沒有,則創(chuàng)建Cookie Cookie(String CookieName,Sting CookieValue) Cookie的名字 Cookie的值 例1:創(chuàng)建cookie Cookie cookie=new Cookie(“visit

43、 Time”,”1”); /(例3-12)作為網(wǎng)頁的計數(shù)器,每次網(wǎng)頁打開的時候更改 如int value=Integer.parseInt(cookie.getValue()+1; 例2:用cookie保存用戶名cq Cookie cookie=new Cookie(“ServletStudy”,”cq”); /若沒有對cookie的值的修改,則每次刷新頁面,用戶名不變,(4)設(shè)置cookie cookie.setPath(request.getcontexPath); cookie.setMaxAge(maxAge)/設(shè)置cookie的生命周期 (5)添加cookie到響應(yīng)報文頭 respo

44、nse.addCookie(cookie); (6)向瀏覽器端輸出HTML文本,用cookie.getValue()獲得cookie的值,并寫到瀏覽器上 java.io.PrintWrite out=response.getWriter(); out.println(“歡迎您第”+cookie.getValue()+”訪問本頁面”);,例3-12,package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import ja

45、vax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Cookie; /加入Cookie所在的類 public class CookieServlet extends HttpServlet public CookieServlet() super(); public void destroy() super.destroy(); / Just puts

46、 destroy string in log public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Cookie cookie=null; /獲取請求相關(guān)的Cookie Cookie cookies=request.getCookies(); if(cookies!=null) /如果存在,其值加1 for(int i=0;icookies.length;i+) if(cookiesi.getName().equals(Vi

47、sitTimes) /獲得名為visitTime的cookie所記錄的值 /(即訪問頁面的次 數(shù)),并將值增加1 int value=Integer.parseInt(cookiesi.getValue()+1; /將更改過的cookie的值重新設(shè)置回cookie cookiesi.setValue(Integer.toString(value); response.addCookie(cookiesi); cookie=cookiesi; break; ,if(cookie=null) /該cookie不存在 int maxAge=-1; cookie=new Cookie(VisitTim

48、es,1 ); cookie.setPath(request.getContextPath(); cookie.setMaxAge(maxAge); response.addCookie(cookie); response.setContentType(text/html;charset=gb2312); /一定別忘了設(shè)編碼gb2312,否則頁面漢字地方顯示亂碼JSP是pageEncoding PrintWriter out = response.getWriter(); out.println(); out.println(); out.println( Cookie跟蹤會話); out.p

49、rintln( ); out.print ( 你好 ); out.println(歡迎你第+cookie.getValue()+次訪問本頁面); out.println( ); out.println(); out.flush (); out.close(); ,不斷手工刷新,訪問次數(shù)變化,3.6.2會話跟蹤技術(shù)2URL 重寫,URL重寫是在URL地址后面加?隔開,如果有多個參數(shù),用 使用URL重寫技術(shù)來傳遞會話信息時,可在跳轉(zhuǎn)的目標(biāo)頁面用request.getParameter()來獲取瀏覽器端的表單數(shù)據(jù),就像直接獲取表單的數(shù)據(jù)一樣,3.6.3使用HttpSession對象跟蹤會話,Http

50、Session接口實際上是建立在cookie和URL重寫的基礎(chǔ)上的 獲取會話對象 request.getSession(true) 2.會話中獲取屬性 session.getAttribute(“會話屬性信息”) 3.將屬性信息存入會話 session.setAttribute(“會話屬性信息”, “屬性值”) 4.向瀏覽器輸入html時,獲得本session的ID seesion.getID(),例3-15 HitCounter,例如:使用HttpSesssion對象來存儲當(dāng)前會話開始的時間、上次的訪問時間,以及當(dāng)前會話中用戶訪問本站點的次數(shù),import javax.servlet.Ser

51、vletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.sql.Date; import java.text.DateFormat; public class HitCounter extends HttpServlet static final String

52、 COUNTER_KEY=Counter; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException /獲取會話對象 HttpSession session=request.getSession(true); /從會話中獲取屬性 int count=0; Integer i=(Integer)session.getAttribute(COUNTER_KEY); /推薦使用Integer類,因為如果該計數(shù)器不存在,則返回null對象

53、,而int基本數(shù)據(jù)類型無法判別,會話數(shù)據(jù)使用servlet容器存儲的,會話屬性應(yīng)具有唯一性, 所以每個會話屬性應(yīng)定義為static final類型,/如果計數(shù)器已經(jīng)存在,則增加1 if(i!=null) count=Value()+1; /將這個整型對象轉(zhuǎn)換成int /將屬性信息存入會話 session.setAttribute(COUNTER_KEY, count); Date sessionCreate=new Date(session.getCreationTime(); Date sessionlastAccessed=new Date(session.getLastAcce

54、ssedTime(); DateFormat d= DateFormat.getDateInstance(); response.setContentType(text/html;charset=gb2312); PrintWriter out = response.getWriter(); out.println(); out.println(); out.println( 會話計數(shù)器); out.println( ); out.print( 你的會話ID+session.getId()+); out.println(會話創(chuàng)建的時間:+d.format(session.getCreation

55、Time()+); out.println(會話上次訪問的時間:+d.format(session.getLastAccessedTime()+); out.println(會話間訪問次數(shù):+(Integer)session.getAttribute(COUNTER_KEY)+); out.println( ); out.println(); out.flush(); out.close(); ,會話屬性名,屬性值,用會話實現(xiàn)購物車(作業(yè))P53,2個Servlet: 1)水果訂購的訂單catalog.java 退出應(yīng)用前,可以多次訂購,購物車(內(nèi)的商品數(shù)量)保存在session中,可以累計商

56、品數(shù)量, 2)購物車結(jié)算cart.java,1.首次調(diào)用該頁面時,購物車cart不存在, 創(chuàng)建購物車,并存入session 用hash表存儲購物車cart cart=new HashMap(); 并置幾種商品均為0 cart.put(“apple”,0); 在session對象新建cart屬性,用于存儲購物車 Session.setAttibute(“cart”,cart); 2.更新購物車 若cart存在,則從requset中獲得訂單頁面錄入 的商品的數(shù)量,并更新購物車,1.呈現(xiàn)訂單頁面 接受用戶的輸入,使用session控制,使之與購物車結(jié)算頁面為一個session內(nèi) session.ge

57、tAttribute(“cart”),catalog.jsp, 簡單購物車 歡迎來到開心水果店購物 種類單價數(shù)量 蘋果5.5 香蕉4.5 葡萄3.6 ,package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.ht

58、tp.HttpServletResponse; import javax.servlet.http.*; import java.util.HashMap; public class CartServlet extends HttpServlet protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=gb2312); PrintWriter out = response.getWriter(); HttpSession session=request.getSession(); HashMap cart=(HashMap)session.getAttribute(cart); if(cart=null) cart=new HashMap(); cart.put(apple,0); cart.put(banan

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論