JSP程序設(shè)計課件第3章JSP內(nèi)置對象_第1頁
JSP程序設(shè)計課件第3章JSP內(nèi)置對象_第2頁
JSP程序設(shè)計課件第3章JSP內(nèi)置對象_第3頁
JSP程序設(shè)計課件第3章JSP內(nèi)置對象_第4頁
JSP程序設(shè)計課件第3章JSP內(nèi)置對象_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.1request對象request對象是HttpServletRequest類的實例,作用是接收客戶端發(fā)送來的請求信息。3.1.1request封裝的數(shù)據(jù)當(dāng)客戶端請求一個JSP頁面時,JSP容器會將客戶端的請求信息包裝在這個request對象內(nèi),請求信息的內(nèi)容包括請求的頭部信息、請求的方式、請求的參數(shù)名稱和參數(shù)值、Cookie信息、客戶瀏覽器信息等信息。request對象封裝了用戶提交的信息,通過調(diào)用該對象相應(yīng)的方法可以獲取來自客戶端的請求信息,然后做出響應(yīng)。3.1request對象客戶端和服務(wù)器之間的交互數(shù)據(jù)是通過網(wǎng)絡(luò)傳送的,網(wǎng)絡(luò)分組內(nèi)容就是客戶瀏覽器和服務(wù)器之間實際交換的數(shù)據(jù)。在客戶端利用iptool等網(wǎng)絡(luò)工具可以捕獲這些分組。圖所示為運行第2章示例時在局域網(wǎng)的兩臺主機(jī)之間交換的GET請求分組。包含HTTP報文的網(wǎng)絡(luò)分組共4個,其中:(1)第一個分組是客戶端發(fā)送的GET請求,請求/GeoTest/login.jsp頁面;3.1.1request封裝的數(shù)據(jù)(2)第二個分組是服務(wù)器發(fā)回的對GET請求的響應(yīng),即login.jsp頁面;(3)第三個分組是客戶填寫完用戶名和密碼后發(fā)送的POST請求分組,請求原login.jsp頁面,同時攜帶數(shù)據(jù);(4)第四個分組是服務(wù)器發(fā)回的對POST請求的響應(yīng),在login.jsp中接受參數(shù)后轉(zhuǎn)到另一個頁面,發(fā)回的響應(yīng)是該頁面的內(nèi)容。3.1.1request封裝的數(shù)據(jù)POST/GeoTest/login.jspHTTP/1.1Accept:application/x-ms-application,image/jpeg,application/xaml+xml,image/gif,image/pjpeg,application/x-ms-xbap,*/*Referer:20:8080/GeoTest/login.jspAccept-Language:zh-CNUser-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;WOW64;Trident/7.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E)Content-Type:application/x-www-form-urlencodedAccept-Encoding:gzip,deflateHost:20:8080Content-Length:25DNT:1Connection:Keep-AliveCache-Control:no-cacheCookie:JSESSIONID=D379891CC461B498441B3D8752270A72userName=u1&passWord=12343.1.1request封裝的數(shù)據(jù)在Web應(yīng)用中,客戶端和服務(wù)器之間用HTTP協(xié)議傳輸數(shù)據(jù)。HTTP報文包括頭部和報文主體兩部分,在HTTP協(xié)議中頭部和報文主體兩部分使用2個回車換行符分隔。3.1.1request封裝的數(shù)據(jù)3.1.1request封裝的數(shù)據(jù)與GET請求只有頭部不同,在POST請求中,除了HTTP的頭部信息以外,還包括報文主體部分,即用戶提交的數(shù)據(jù)userName=u1&passWord=1234。3.1.1request封裝的數(shù)據(jù)request封裝的數(shù)據(jù)來源于客戶端,包括三部分:(1)HTTP報文頭部數(shù)據(jù)。包括命令類型(GET或POST)、請求文件名(/GeoTest/login.jsp)、協(xié)議版本號(HTTP/1.1)、客戶端可接受的文件類型(Accept)、客戶端使用語言(Accept-Language)、請求的源資源地址(Referer)、服務(wù)器地址及端口號(Host)、本次會話訪問標(biāo)識(Cookie:JSESSIONID)等。(2)客戶端提交數(shù)據(jù)。表單提交方式有兩種:POST方式(method=”post”):使用POST請求報文攜帶數(shù)據(jù)。GET方式(method=”get”),以查詢字符串形式,由GET請求報文攜帶數(shù)據(jù),如:GET/GeoTest/login.jsp?userName=u1&passWord=1234HTTP/1.1(3)網(wǎng)絡(luò)層協(xié)議數(shù)據(jù),如客戶端IP地址。3.1.1request封裝的數(shù)據(jù)3.1.2request對象主要方法方法名說明返回類型getParameter(Stringname)返回此request中name指定的參數(shù),若不存在則返回nullStringgetParameterValues(Stringname)返回指定名稱的參數(shù)的所有值,若不存在則返回nullString[]setAttribute(Stringkey,Objectobj)設(shè)置屬性的屬性值voidgetAttribute(Stringname)返回名稱為name的屬性值,如果不存在則返回nullObjectgetAttributeNames()返回request對象的所有屬性名稱的集合EnumerationgetQueryString()返回此

requestURL包含的查詢字符串StringgetHeaderNames()返回所有HTTP頭的名稱集合EnumerationgetParameterNames()返回請求中所有參數(shù)的集合EnumerationgetSession()返回request對應(yīng)的session對象,如果沒有,則創(chuàng)建一個HttpSession3.1.2request對象主要方法方法名說明返回類型getContextPath()返回requestURI中指明的上下文路徑StringgetHeader(Stringname)返回name指定的信息頭StringgetCookies()返回客戶端所有的Cookie的數(shù)組Cookie[]getInputStream()返回請求的輸入流ServletInputStreamgetRequestedSessionId()返回request指定的sessionIDStringgetCharacterEncoding()返回request的字符編碼集名稱StringgetContentType()返回request主體的MIME類型,若未知則返回nullStringgetRemoteAddr()返回客戶端的IP地址StringPOST/GeoTest/login.jspHTTP/1.1Accept:application/x-ms-application,image/jpeg,application/xaml+xml,image/gif,image/pjpeg,application/x-ms-xbap,*/*Referer:20:8080/GeoTest/login.jspAccept-Language:zh-CNUser-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;WOW64;Trident/7.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E)Content-Type:application/x-www-form-urlencodedAccept-Encoding:gzip,deflateHost:20:8080Content-Length:25DNT:1Connection:Keep-AliveCache-Control:no-cacheCookie:JSESSIONID=D379891CC461B498441B3D8752270A72userName=u1&passWord=12343.1.2request對象主要方法getParameter(userName)=“u1”getParameterNames()={“userName”,”passWord”}getCookies()getRequestedSessionId()getHeaderNames()getHeader(“Host”)=“20:8080”getQueryString()3.1.2request對象主要方法1.用getParameter方法獲取表單提交信息request.getParameter(Stringname),其中,參數(shù)name區(qū)分大小寫,需要與HTML源代碼中出現(xiàn)的參數(shù)名完全相同。(1)方法返回值為String類型。如果參數(shù)存在,但沒有相應(yīng)的值,則返回空的String;如果GET或POST報文中沒有參數(shù),則返回null。(2)getParameter方法只能讀取表單提供的單個值,通常在類型為text、password、hidden、radio、submit的input標(biāo)簽、textarea標(biāo)簽和select標(biāo)簽(設(shè)置為單選列表)中使用。(3)表單數(shù)據(jù)不管由GET方式發(fā)送還是由POST方式發(fā)送,都可以用getParameter獲取。3.1.2request對象主要方法2.用getParameterValues方法獲取表單成組信息request.getParameterValues(Stringname)方法獲取指定參數(shù)的成組信息,如果同一參數(shù)名有可能在表單數(shù)據(jù)中多次出現(xiàn),調(diào)用getParameterValues方法。(1)方法返回值為字符串?dāng)?shù)組。如果參數(shù)名不存在,getParameterValues的返回值為null,如果參數(shù)只有單個值,則返回只有一個元素的數(shù)組。(2)getParameterValues通常用于復(fù)選框(類型為checkbox的input標(biāo)簽)和多選列表(即設(shè)置了multiple屬性的select標(biāo)簽)。3.1.2request對象主要方法注冊頁面(1)新建register.jsp。選擇網(wǎng)站根目錄WebContent,右鍵單擊,選擇New→JSPFile,新建register.jsp。修改編碼方式,添加一個表單,實現(xiàn)輸入用戶名、密碼、真實姓名、身份證號、性別、興趣。(2)升級User類。打開User.java文件,新增4個實例變量,分別表示用戶的真實姓名、身份證號、性別和興趣。新增一個包括6個參數(shù)的構(gòu)造方法。3.1.2request對象主要方法(3)新建registertreate.jsp。注冊頁面表單未將數(shù)據(jù)提交給注冊頁面自身,而是由action指定,將數(shù)據(jù)提交給另一個頁面registertreate.jsp處理。選擇網(wǎng)站根目錄WebContent,右鍵單擊,選擇New→JSPFile,新建registertreate.jsp。3.1.2request對象主要方法<body><formaction="registertreate.jsp"method="post"name="frmregister"><p>用戶名:<inputtype="text"name="userName"/></p><p>密碼:<inputtype="password"name="passWord"/></p><p>確認(rèn)密碼:<inputtype="password"name="confirmPassWord"/></p><p>真實姓名:<inputtype="text"name="userRealName"/></p><p>身份證號:<inputtype="text"name="pId"/></p><p>性別:<inputtype="radio"name="sex"value="male"/>男<inputtype="radio"name="sex"value="female"/>女</p><p>學(xué)習(xí)興趣:<inputtype="checkbox"name="interest"value="china"/>中國地理<inputtype="checkbox"name="interest"value="world"/>世界地理</p><p><inputtype="submit"value="提交"/></p></form></body>3.1.2request對象主要方法publicclassUser{privateStringmUserName;privateStringmPassWord;privateStringmUserRealName;privateStringmPId;privateStringmSex;privateStringmInterest;}3.1.2request對象主要方法publicUser(StringuserName,StringpassWord,StringuserRealName,StringpId,Stringsex,Stringinterest){ mUserName=userName; mPassWord=passWord; mUserRealName=userRealName; mPId=pId; mSex=sex; mInterest=interest;}3.1.2request對象主要方法publicStringtoString(){ return"用戶名="+mUserName+"密碼="+mPassWord+"姓名="+mUserRealName+"身份證號="+mPId+"性別="+mSex+"興趣="+mInterest;}3.1.2request對象主要方法registertreate.jsp<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="com.geotest.*"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>注冊處理</title></head><body>3.1.2request對象主要方法<%StringuserName=request.getParameter("userName");StringpassWord=request.getParameter("passWord");StringuserRealName=request.getParameter("userRealName");Stringsex=request.getParameter("sex");StringpId=request.getParameter("pId");String[]interests=request.getParameterValues("interest");StringinterestStr="";for(inti=0;i<interests.length;i++) interestStr+=","+interests[i];//用,作分隔符if(interests.length>0) interestStr=interestStr.substring(1);//去掉第一個分隔符 Useru=newUser(userName,passWord,userRealName,pId,sex,interestStr);%><%=u.toString()%></body>3.1.2request對象主要方法3.1.2request對象主要方法3.用setCharacterEncoding方法設(shè)置提交參數(shù)編碼默認(rèn)情況下,request.getParameter使用服務(wù)器的當(dāng)前字符集解釋輸入。在Java的內(nèi)部處理中,所有的字符編碼默認(rèn)都使用ISO-8859-1。如果客戶端在提交參數(shù)時所采用的編碼不是ISO-8859-1,編碼不一致,獲取的客戶端參數(shù)中文會產(chǎn)生亂碼。setCharacterEncoding方法用于設(shè)置request對象中客戶端提交參數(shù)的編碼。setCharacterEncoding方法必須在訪問任何請求參數(shù)之前調(diào)用。3.1.2request對象主要方法代碼清單3-6 設(shè)置客戶端提交參數(shù)編碼(registertreate.jsp)<%request.setCharacterEncoding("UTF-8");StringuserName=request.getParameter("userName");…%>3.2response對象response對象是HttpServletResponse類的實例,作用是向客戶端發(fā)送數(shù)據(jù)。3.2.1response封裝的數(shù)據(jù)response對象的主要功能是對客戶端的請求做出響應(yīng),設(shè)置響應(yīng)HTTP報文頭、向客戶端寫入Cookie信息、將處理結(jié)果返回給客戶端等。3.2.1response封裝的數(shù)據(jù)對GET請求的響應(yīng)分組內(nèi)容HTTP/1.1200OKServer:Apache-Coyote/1.1Content-Type:text/html;charset=UTF-8Content-Length:447Date:Thu,11Aug201621:55:40GMT<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>用戶登錄</title></head><body><formaction=""method="post">用戶:<inputtype="text"name="userName"/><br/><br/>密碼:<inputtype="password"name="passWord"/><br/><br/><inputtype="submit"value="登錄"/></form></body></html>3.2.1response封裝的數(shù)據(jù)瀏覽器接收到服務(wù)器向客戶端發(fā)送的HTTP響應(yīng)報文后,會將報文主體顯示出來。與GET請求或POST請求的頭部不同,響應(yīng)HTTP報文頭部信息包含的是服務(wù)器信息和報文信息,通知瀏覽器怎樣打開報文主體。3.2.2response對象主要方法方法名說明返回類型encodeRedirectURL(Stringurl)對sendRedirect()方法使用的URL進(jìn)行編碼StringencodeURL(Stringurl)將URL編碼,回傳包含SessionID的URLStringcontainsHeader(Stringname)返回指定的響應(yīng)頭是否存在booleanisCommitted()返回響應(yīng)是否已經(jīng)提交到客戶端booleanaddCookie(Cookiecookie)添加指定的cookie至響應(yīng)中voidaddHeader(Stringname,Stringvalue)添加指定名稱的響應(yīng)頭和值voidsetContentLength(intlen)指定HTTPservlets中響應(yīng)的內(nèi)容的長度,此方法用來設(shè)置

HTTPContent-Length信息頭voidflushBuffer()將任何緩存中的內(nèi)容寫入客戶端voidreset()清除任何緩存中的任何數(shù)據(jù),包括狀態(tài)碼和各種響應(yīng)頭void3.2.2response對象主要方法方法名說明返回類型resetBuffer()清除基本的緩存數(shù)據(jù),不包括響應(yīng)頭和狀態(tài)碼voidsendError(intsc)使用指定的狀態(tài)碼向客戶端發(fā)送一個出錯響應(yīng),然后清除緩存voidsendRedirect(Stringlocation)使用指定的URL向客戶端發(fā)送一個臨時的間接響應(yīng)voidsetBufferSize(intsize)設(shè)置響應(yīng)體的緩存區(qū)大小voidsetCharacterEncoding(Stringcharset)指定響應(yīng)的編碼集(MIME字符集)voidsetContentType(Stringtype)設(shè)置響應(yīng)的內(nèi)容的類型,如果響應(yīng)還未被提交的話voidsetHeader(Stringname,Stringvalue)使用指定名稱和值設(shè)置響應(yīng)頭的名稱和內(nèi)容void3.2.2response對象主要方法1.使用sendRedirect方法進(jìn)行重定向功能:跳轉(zhuǎn)到另一頁面。格式:response.sendRedirect(Stringlocation)向客戶端發(fā)送一個頁面重定向的HTTP報文頭,瀏覽器得到此報文頭信息后,向指定URL發(fā)了新的請求,從而引起頁面跳轉(zhuǎn)。在使用sendRedirect方法之前不能有信息輸出,否則會引發(fā)異常。if(UserBank.check(u)){%><jsp:forwardpage="index.jsp"><jsp:paramname="userName"value="<%=u.getmUserName()%>"/></jsp:forward><%response.sendRedirect("index.jsp");}else{

out.print("用戶名或密碼不對!");}3.2.2response對象主要方法3.2.2response對象主要方法3.2.2response對象主要方法sendRedirect與forward指令區(qū)別:forward指令只能在本網(wǎng)站內(nèi)跳轉(zhuǎn),且跳轉(zhuǎn)后,在地址欄中,仍然顯示以前頁面的URL,跳轉(zhuǎn)前后的兩個頁面同屬于一個request,用戶程序可以用request來設(shè)置或傳遞用戶程序數(shù)據(jù)。sendRedirect方法可以跳轉(zhuǎn)到任何URL,跳轉(zhuǎn)后,在地址欄中,顯示跳轉(zhuǎn)后頁面的URL,跳轉(zhuǎn)前后的兩個頁面不屬于一個request。用sendRedirect方法替換forward指令后,用戶名的傳遞需要用下一節(jié)介紹的其他方式實現(xiàn)。3.2.2response對象主要方法2.使用setCharacterEncoding方法設(shè)置響應(yīng)字符編碼服務(wù)器向客戶端發(fā)出響應(yīng)的編碼如果存在多處設(shè)置,按下列順序選擇:(1)setCharacterEncoding方法設(shè)置值(優(yōu)先級最高)。(2)setContentType()方法設(shè)置值(對應(yīng)page指令的contentType屬性)。(3)默認(rèn)(ISO-8859-1)。3.2.2response對象主要方法3.使用setContentType和setHeader方法設(shè)置響應(yīng)頭信息setContentType(Stringtype)方法可以動態(tài)改變ContentType的屬性值。ContentType的屬性值包括兩部分,第一部分指定響應(yīng)內(nèi)容類型,第二部分指定字符編碼。響應(yīng)內(nèi)容類型可以取text/html、text/plain、application/vnd.ms-excel、application/msword等,這些不同的MIME類型通知瀏覽器用什么樣的程序打開響應(yīng)內(nèi)容。3.2.2response對象主要方法user.javapublicStringtoString(){ return"<table><tr><td>用戶名</td><td>“+mUserName+"</td></tr>“+"<tr><td>密碼</td><td>“+mPassWord+"</td></tr>“+"<tr><td>姓名</td><td>“+mUserRealName+"</td></tr>"+"<tr><td>身份證號</td><td>“+mPId+"</td></tr>"+"<tr><td>性別</td><td>“+mSex+"</td></tr>"+"<tr><td>興趣</td><td>"+mInterest+"</td></tr></table>";}3.2.2response對象主要方法registertreate.jsp?<%response.setContentType("application/vnd.ms-excel;charset=UTF-8");%><%=u.toString()%>?3.2.2response對象主要方法3.2.2response對象主要方法setHeader(Stringname,Stringvalue)設(shè)置新的響應(yīng)頭和值。將response對象添加一個響應(yīng)頭refresh,其值為5??蛻羰盏竭@個頭之后,每隔5秒鐘就刷新一次頁面。在index.jsp聲明部分后插入如下代碼:<%response.setHeader("Refresh","5");%>3.2.3操作CookieCookie是由服務(wù)器寫到客戶端的小文件或字符串。當(dāng)客戶請求一個Web頁面時,服務(wù)器除了提供所請求的頁面外,還可以提供一些附加的信息。這些信息中可能會包括一個Cookie。如果用戶沒有禁用Cookie,瀏覽器把收到的Cookie保存到客戶機(jī)的硬盤上。Cookie只是一些保存信息的文件或字符串,不是可執(zhí)行程序。Cookie常用于標(biāo)識用戶、記錄用戶名和密碼、定制站點等方面。3.2.3操作Cookie3.2.3操作Cookie方法名說明返回類型Cookie(Stringname,Stringvalue)實例化Cookie對象,同時設(shè)置名稱和內(nèi)容CookiegetName()取得Cookie的名稱StringgetValue()取得Cookie的內(nèi)容StringsetMaxAge(intexpiry)設(shè)置Cookic的保存時間,以秒為單位voidCookie類主要方法3.2.3操作CookieCookie是由服務(wù)器端設(shè)置到容戶端上去的。向客戶端增加Cookie,必須使用response.addCookie(Cookiecookie)方法。從客戶端讀取Cookie,須要使用request.getCookies方法,可以得到一個Cookie數(shù)組。3.2.3操作Cookie3.2.3操作Cookie1.向客戶端發(fā)送Cookie(1)創(chuàng)建Cookie對象。調(diào)用Cookie的構(gòu)造函數(shù),參數(shù)包括Cookie的名稱和Cookie值,二者都是字符串。例如,如果要創(chuàng)建一個名為userName的Cookie,并將它的值設(shè)為u1,應(yīng)該使用下面的語句:Cookiec=newCookie("userName","u1");3.2.3操作Cookie(2)設(shè)置最大時效。創(chuàng)建Cookie后,Cookie變量默認(rèn)是Session級別的變量,存儲在瀏覽器的內(nèi)存中,用戶在退出瀏覽器后將被刪除。如果希望瀏覽器將Cookie存在磁盤上,需要使用setMaxAge指定多長時間(以秒為單位)內(nèi)Cookie是合法的。例如,將c的時效設(shè)為1周:c.setMaxAge(60*60*24*7);將最大時效設(shè)置為0時是命令瀏覽器刪除Cookie。3.2.3操作Cookie(3)將Cookie放入HTTP響應(yīng)報頭。創(chuàng)建Cookie對象和調(diào)用setMaxAge,都是在服務(wù)器上執(zhí)行的,操作的是服務(wù)器內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),并沒有向瀏覽器發(fā)送任何內(nèi)容。如果不將Cookie發(fā)送到客戶程序,那它不會起到任何作用。必須使用response.addCookie將Cookie放入HTTP響應(yīng)報頭發(fā)送給瀏覽器。response.addCookie(c);3.2.3操作Cookie?<formaction=""method="post">用戶:<inputtype="text"name="userName"/><br/><br/>密碼:<inputtype="password"name="passWord"/><br/><br/><inputtype="checkbox"name="remember"value="remember"/>記住密碼<br/><inputtype="submit"value="登錄"/></form>login.jsp3.2.3操作CookieStringmrem=request.getParameter("remember");intexpiry=0;if(mrem!=null){ expiry=60*60*24*7;}Cookiec1=newCookie("userName",mUserName);c1.setMaxAge(expiry);response.addCookie(c1);Cookiec2=newCookie("passWord",mPassWord);c2.setMaxAge(expiry);response.addCookie(c2);3.2.3操作Cookie2.從客戶端讀取Cookie(1)調(diào)用request.getCookies。要獲取由瀏覽器發(fā)送來的Cookie,需要調(diào)用request的getCookies方法。getCookies方法返回值是一個Cookie對象數(shù)組,對應(yīng)由HTTP請求中Cookie報頭輸入的值。如果請求中不包含Cookie,返回null。3.2.3操作Cookie(2)對數(shù)組進(jìn)行循環(huán),調(diào)用每個Cookie的getName方法,直到找到想找的cookie為止,再通過getValue方法獲取Cookie的值。例如,想讀取Cookie中保存的userName的值:Cookie[]cookies=request.getCookies();if(cookies!=null){for(inti=0;i<cookies.length;i++){Cookiecookie=cookies[i];if(cookie.getName().equals("userName"))dosomething(cookie.getValue());//通過getValue取到userName中保存的值}}3.2.3操作Cookie從Cookie中讀取、顯示用戶名和密碼(login.jsp)<body><%StringrememberedUserName="";StringrememberedPassWord="";Cookie[]cookies=request.getCookies();if(cookies!=null){for(inti=0;i<cookies.length;i++){ Cookiec=cookies[i]; if(c.getName().equals("userName")) rememberedUserName=c.getValue(); if(c.getName().equals("passWord")) rememberedPassWord=c.getValue();}}%>3.2.3操作Cookie<formaction=""method="post">用戶:<inputtype="text"name="userName"value="<%=rememberedUserName%>"/><br/><br/>密碼:<inputtype="password"name="passWord"value="<%=rememberedPassWord%>"/><br/><br/><inputtype="checkbox"name="remember"value="member"<%if(!rememberedUserName.equals("")&&!rememberedPassWord.equals(""))out.print("checked");%>/>記住密碼<br/><inputtype="submit"value="登錄"/></form>3.3Session對象Web基本上是無狀態(tài)的,瀏覽器向服務(wù)器發(fā)送一個請求并取回一個文件,然后服務(wù)器就忘記了它曾經(jīng)見過這個特殊的用戶。如果服務(wù)器想記住這個用戶當(dāng)前這次訪問,服務(wù)器需要記錄客戶當(dāng)前信息??蛻魹g覽器與服務(wù)器間的交互稱為會話,Web中稱為session。3.3.1session工作機(jī)制在客戶第一次訪問網(wǎng)站時,服務(wù)器會為每個客戶創(chuàng)建一個session對象。Session對象是javax.servlet.http.HttpSession類的實例,包括Id、創(chuàng)建時間等屬性,并且可動態(tài)添加自定義屬性來保存用戶數(shù)據(jù)。不同客戶使用自己的session對象,相互之間不會產(chǎn)生影響。用戶從首次訪問服務(wù)器開始,到該用戶關(guān)閉瀏覽器,只要最后訪問的時間不超時,服務(wù)器會一直為用戶保留session對象,保存在session中的用戶信息也就一直存在。建立session對象后,在后續(xù)的連接中,取出當(dāng)前的SessionID,并使用這個ID從服務(wù)器上提取出此會話的相關(guān)信息,稱為會話跟蹤。會話跟蹤可以由自己實現(xiàn),更方便的方式是使用Servlet提供的HttpSession。HttpSession接收到使用Cookie或URL重寫傳遞的SessionID后,會自動完成會話跟蹤,方便地存儲與每個會話相關(guān)聯(lián)的任意對象,不需要Servlet的開發(fā)設(shè)計人員自己實現(xiàn)跟蹤過程。3.3.1session工作機(jī)制1.利用Cookie的會話跟蹤通常,服務(wù)器記錄的客戶信息是通過Cookie字符串查找的。GET請求和POST請求)都包含類似下面的Cookie字符串:Cookie:JSESSIONID=D379891CC461B498441B3D8752270A72在瀏覽器第一次請求服務(wù)器時,會生成一個取值唯一的字符串JSESSIONID,作為用戶當(dāng)前訪問標(biāo)識,服務(wù)器收到請求后,會將JSESSIONID存儲起來,以后其他請求如果攜帶了這個JSESSIONID,服務(wù)器就可以將其從眾多請求中區(qū)分出來,找到它所對應(yīng)的用戶數(shù)據(jù)。3.3.1session工作機(jī)制3.3.1session工作機(jī)制3.3.1session工作機(jī)制2.URL重寫如果瀏覽器不支持Cookie或用戶禁用Cookie,客戶發(fā)送給服務(wù)器的請求中將不會包含Cookie中的SessionID,此時,需要使用其他方法攜帶SessionID。URL重寫時,客戶程序在每個URL的尾部添加一些額外的數(shù)據(jù),這些數(shù)據(jù)標(biāo)識當(dāng)前的會話,服務(wù)器將這個標(biāo)識符與它存儲的用戶相關(guān)數(shù)據(jù)關(guān)聯(lián)起來。例如:http://host/path/file.html;jsessionid=D379891CC461B498441B3D8752270A72使用response對象的encodeURL方法或encodeRedirectURL方法可以實現(xiàn)URL重寫。例如:Stringstr=response.encodeURL("index.jsp");<ahref="<%=str%>">首頁</a>3.3.1session工作機(jī)制3.session作用session對象建立后,客戶瀏覽器訪問的任何頁面都可以使用session對象存儲信息,因此,session對象經(jīng)常用于臨時存儲可供多個頁面共享的數(shù)據(jù)。session中保存和檢索的信息不能是基本數(shù)據(jù)類型如int,double等,而必須是java的相應(yīng)的對象,如Integer,Double,String等。3.3.1session工作機(jī)制session對象以下情況會失效:(1)客戶關(guān)閉瀏覽器。(2)會話超時,即超過session對象的生存時間。當(dāng)用戶在規(guī)定時間內(nèi)沒有再次訪問該網(wǎng)站,則認(rèn)為超時。默認(rèn)超時時間為30分鐘。(3)顯式地調(diào)用invalidate()方法。3.3.2session對象主要方法方法名說明返回類型getId()返回session對象的sessionIdStringsetAttribute(Stringname,Objectvalue)設(shè)置指定名稱的session屬性值。會替換掉任何以前的值。voidgetAttribute(Stringname)返回指定名稱的session屬性值ObjectremoveAttribute(Stringname)刪除指定名稱的session屬性voidgetCreationTime()返回session被創(chuàng)建的時間。最小單位為千分之一秒。longgetLastAccessedTime()返回session最后被客戶發(fā)送的時間。最小單位為千分之一秒。long3.3.2session對象主要方法方法名說明返回類型getMaxInactiveInterval()返回超時時間(秒),負(fù)值表示session永遠(yuǎn)不會超時。intsetMaxInactiveInterval(intn)設(shè)置超時時間(秒)voidgetAttributeNames()獲得session內(nèi)所有屬性名稱的集合EnumerationgetValueNames()返回一個包括session內(nèi)所有可用屬性名稱的數(shù)組String[]invalidate()取消session,使session不可用void3.3.2session對象主要方法1.利用session對象存儲數(shù)據(jù)session對象存在于服務(wù)器端,它們不在網(wǎng)絡(luò)上傳輸,只是通過特定的工作機(jī)制,如使用Cookie或URL重寫,自動與客戶關(guān)聯(lián)在一起。session對象擁有內(nèi)建的數(shù)據(jù)結(jié)構(gòu),可以存儲任意數(shù)量的對象數(shù)據(jù)。存儲的數(shù)據(jù)是以“鍵/值”形式進(jìn)行的。存儲和讀取數(shù)據(jù)使用setAttribute(Stringname,Objectvalue)和getAttribute(Stringname)方法。session.setAttribute(key,value)以鍵/值的方式,將一個對象的值存放到session中。3.3.2session對象主要方法session.getAttribute(key)獲取存儲的鍵值,返回類型為Object,通常需要將它轉(zhuǎn)換成會話中與這個屬性名相關(guān)聯(lián)的的存儲時的數(shù)據(jù)類型。如果屬性不存在,getAttribute返回值為null。setAttribute方法會替換掉任何之前設(shè)定的值,如果想移除某個值,應(yīng)使用removeAttribute方法。3.3.2session對象主要方法利用session實現(xiàn)用戶登錄控制。具體思路是:當(dāng)用戶登錄成功后,設(shè)置一個session范圍的屬性,然后在其他需要驗證的頁面中判斷是否存在此session屬性,如果存在,則表示已經(jīng)是正常登錄過的合法用戶;如果不存在,則跳轉(zhuǎn)回登錄頁提示用戶重新登錄。3.3.2session對象主要方法login.jsp?Useru=newUser(mUserName,mPassWord);if(UserBank.check(u)){session.setAttribute("userName",mUserName);response.sendRedirect("index.jsp");}else{ out.print("用戶名或密碼不對!");}?3.3.2session對象主要方法header.jsp<%@pagepageEncoding="UTF-8"%><%@pageimport="java.util.Date"%><%Datedate=newDate();%>地理知識,共<%=request.getParameter("count")%>題當(dāng)前時間為<%=date.toLocaleString()%>用戶名:<%=request.getParameter("userName")%>用戶名:<%=session.getAttribute("userName")%><hr>3.3.2session對象主要方法index.jsp?<body><%if(session.getAttribute("userName")==null) response.sendRedirect("login.jsp");%>?3.3.2session對象主要方法2.session對象的生命周期session是在用戶第一次訪問的時候創(chuàng)建的,session使用一種平滑超時的方式來控制何時銷毀session。session有默認(rèn)的生存時間,通常為30分鐘,即用戶保持連續(xù)30分鐘不訪問,則session被收回。如果在這30分鐘內(nèi)用戶又訪問了一次頁面,那么30分鐘就重新計時了。超時是連續(xù)不訪問的超時時間,而不是第一次訪問后30分鐘超時。3.3.2session對象主要方法session對象包含多個與時間相關(guān)的變量,包括創(chuàng)建時間、最后訪問時間、最大訪問時間間隔等。session創(chuàng)建后,每次訪問都會更新最后訪問時間。最后訪問時間加上最大訪問時間間隔即是session銷毀的時間。在銷毀時間到來時仍沒有訪問,則session銷毀。最大訪問時間間隔可以通過setMaxInactiveInterval方法設(shè)置,單位是秒。3.3.2session對象主要方法與生命周期相關(guān)的方法:(1)publiclonggetCreationTime()返回session創(chuàng)建時間,這個時間是從1970年1月1日00:00:00GMT以來的毫秒數(shù)。(2)publiclonggetLastAccessedTime()返回客戶端最后一次發(fā)送與session相關(guān)請求的時間,這個時間是從1970年1月1日00:00:00GMT以來的毫秒數(shù)??梢杂脕泶_定客戶端在兩次請求之間的會話的非活動時間。3.3.2session對象主要方法(3)publicvoidsetMaxInactiveInterval(intseconds)用于設(shè)置在session失效前,客戶端的兩個連續(xù)請求之間的最長時間間隔,單位為秒。如果設(shè)置為負(fù)值,表示session永遠(yuǎn)不會失效。Web應(yīng)用程序可以使用這個方法來設(shè)置session的超時時間間隔。(4)publicvoidinvalidate()用于使session失效。例如,用戶在網(wǎng)上書店購買完圖書后,可以選擇退出登錄,服務(wù)器端的Web應(yīng)用程序可以調(diào)用這個方法使session失效,從而讓用戶不再與這個session關(guān)聯(lián)。3.3.2session對象主要方法<%Stringheading;IntegeraccessCount=(Integer)session.getAttribute("accessCount");if(accessCount==null){ accessCount=newInteger(0); heading="welcomenewcomer";}else{accessCount=newInteger(accessCValue()+1);heading="welcomeback";}session.setAttribute("accessCount",accessCount);%>3.3.2session對象主要方法<tableborder="1"><trbgcolor="ffad00"><th>infotype</th><th>value</th></tr><tr><td>Id</td><td><%=session.getId()%></td></tr><tr><td>創(chuàng)建時間</td><td><%=newDate(session.getCreationTime())%></td></tr><tr><td>最后訪問時間</td><td><%=newDate(session.getLastAccessedTime())%></td></tr><tr><td>訪問次數(shù)</td><td><%=accessCount%></td></tr></table>3.3.2session對象主要方法3.4out對象out對象向客戶端發(fā)送數(shù)據(jù),發(fā)送的內(nèi)容是瀏覽器需要顯示的內(nèi)容。out對象的類型為JspWriter,JspWriter相當(dāng)于一種帶緩存功能的PrintWriter,設(shè)置JSP頁面的page指令的buffer屬性可以調(diào)整它的緩存大小,甚至關(guān)閉它的緩存。3.4out對象只有向out對象中寫入了內(nèi)容,且滿足如下任何一個條件時,out對象才去調(diào)用特定方法,將out對象的緩沖區(qū)中的內(nèi)容真正寫入到Tomcat提供的緩沖區(qū)中:(1)設(shè)置page指令的buffer屬性關(guān)閉了out對象的緩存功能;(2)out對象的緩沖區(qū)已滿;(3)整個JSP頁面結(jié)束。3.4out對象3.4out對象out對象是一般使用print()和println()方法向客戶端輸出,println()比print()在輸出字符的后面多了一個空行,但是使用這種方法去實現(xiàn)空行在瀏覽器中一般是無效的,需要使用out.print("<br>")方法來實現(xiàn)。3.4out對象print方法可以輸出各種類型的數(shù)據(jù):<%out.print("out對象的使用方法:<br><br>");//正常輸出一段文字out.print(true);//輸出boolean類型的值out.print('a');//輸出一個字符out.print(newchar[]{'d','j','j','w','z'});//輸出一個字符數(shù)組out.print(newjava.util.Date());//輸出一個日期類型的值%>3.4out對象方法名說明返回類型print(datatypedata)輸出不同數(shù)據(jù)類型的數(shù)據(jù);voidprintln(datatypedata)輸出不同數(shù)據(jù)類型的數(shù)據(jù),并自動換行;voidnewLine()輸出換行voidflush()直接將目前暫存于緩沖區(qū)的數(shù)據(jù)輸出voidclose()關(guān)閉輸出流voidclear()清除緩沖區(qū)中的數(shù)據(jù),若緩沖區(qū)已經(jīng)是空的,則會產(chǎn)生IOException異常voidclearBuffer()清除緩沖區(qū)的數(shù)據(jù),若緩沖區(qū)為空,不會產(chǎn)生IO異常voidgetBufferSize()返回緩沖區(qū)的大小intgetRemaining()返回緩沖區(qū)的剩余空間大小int3.4out對象out對象緩沖區(qū)的默認(rèn)大小為8KB。如果緩沖區(qū)里的內(nèi)容已經(jīng)被輸出,即調(diào)用了flush()方法,再去調(diào)用clear()方法,來清除緩沖區(qū)的內(nèi)容,則產(chǎn)生了IOExeption異常。3.4out對象out.print("緩沖區(qū)大?。?+out.getBufferSize());out.print("<br>");out.print("緩沖區(qū)剩余空間的大小:"+out.getRemaining());out.println();for(inti=0;i<5;i++){out.print("helloworld!");}out.print("<p>緩沖區(qū)剩余空間的大?。?+out.getRemaining()+"</p>");out.flush();out.clearBuffer();out.print("<p>緩沖區(qū)剩余空間的大?。?+out.getRemaining()+"</p>");3.4out對象3.5application對象application對象提供了對javax.servlet.ServletContext對象的訪問,用于多個程序或者多個用戶之間共享數(shù)據(jù)。對于一個容器而言,每個用戶都共用一個application對象。服務(wù)器啟動后就產(chǎn)生了這個application對象,當(dāng)客戶在所訪問的網(wǎng)站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務(wù)器關(guān)閉。與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內(nèi)置的application對象。方法名說明返回類型setAttribute(Stringname,Objectvalue)設(shè)置指定名稱的application屬性值。會替換掉任何以前的值。voidgetAttribute(Stringname)返回指定名稱的application屬性值ObjectremoveAttribute(Stringname)刪除指定名稱的application屬性voidgetInitParameter(Stringname)返回application對象某個屬性的初始值longgetServerInfo()返回當(dāng)前版本Servlet編譯器的信息longgetContext(URI)返回指定URI的ServletContextServletContextgetAttributeNames()獲得application內(nèi)所有屬性名稱的集合EnumerationgetValueNames()返回一個包括application內(nèi)所有可用屬性名稱的數(shù)組String[]getRealPath(URI)返回指定URI的實際路徑String3.5application對象3.5application對象1.getRealPath()方法將指定的虛擬路徑轉(zhuǎn)換為真實路徑。通過URL訪問網(wǎng)頁時,跟在主機(jī)后面的路徑,如http://localhost:8080/geotest/index.jsp中的“/goetest”就是虛擬路徑。通過虛擬路徑訪問,出于安全方面的考慮;將分布在不同位置上的資源組織到同一個虛擬的目錄樹上,方便訪問。如果想在Web應(yīng)用中對實際的文件系統(tǒng)進(jìn)行操作,如創(chuàng)建目錄、刪除文件、查看文件屬性等,則必須知道資源的真實物理路徑,這時就需要將虛擬路徑轉(zhuǎn)換為部署服務(wù)器上的真實路徑。3.5application對象<%@pagelanguage="java"contentType="text/html;charset=utf-8"pageEncoding="utf-8"%><%@pageimport="java.io.*"%>…<body><%Stringrealpath=application.getRealPath("/index.jsp");out.print(realpath);//輸出全路徑,如D:\tomcat8\webapps\GeoTest\index.jspFilef=newFile(realpath);out.print(f.length());%>3.5application對象2.

利用application對象存儲數(shù)據(jù)application對象可以通過自定義屬性方式存儲數(shù)據(jù),使用方式與session對象類似。存儲和讀取數(shù)據(jù)使用setAttribute(Stringname,Objectvalue)和getAttribute(Stringname)方法。application.setAttribute(key,value)以鍵/值的方式,將一個對象的值存放到application中。application.getAttribute(key)獲取application對象中含有關(guān)鍵字key的對象。由于任何對象都可以添加到application中,因此取回對象的時候,需要強(qiáng)制轉(zhuǎn)化為原來的類型。3.5application對象頁面訪問計數(shù)器<%Integernumber=(Integer)application.getAttribute("count");

if(number==null){ number=newInteger(1); application.setAttribute("count",number);}else{ number=newInteger(Value()+1); application.setAttribute("count",number);}%>您是第<%=(Integer)application.getAttribute("count")%>位訪問本站客戶3.6其他內(nèi)置對象page對象是java.lang.Object的對象實例,也是JSP的實現(xiàn)類的實例,類似于Java中的this指針,就是指向當(dāng)前JSP頁面本身。3.6其他內(nèi)置對象config對象對應(yīng)于javax.servlet.ServletConfig類,此類位于servlet-api.jar包中。config對象用于獲取配置信息。配置信息包括初始化參數(shù)以及表示Servlet或JSP頁面所屬Web應(yīng)用的ServletContext對象。具體來說,如果在當(dāng)前Web應(yīng)用的應(yīng)用部署描述文件web.xml文件中,針對某個Servlet文件或JSP文件設(shè)置了初始化參數(shù),則可以通過config對象來獲取這些初始化參數(shù)。3.6其他內(nèi)置對象pageContext對象代表頁面上下文,提供了對JSP頁面所有的對象及命名空間的訪問。該對象主要用于訪問JSP之間的共享數(shù)據(jù)。使用pageContext可以訪問page、request、session、application范圍的變量。pageContext對象是javax.servlet.jsp.pageContext類的對象實例。3.6其他內(nèi)置對象方法名說明返回類型getAttribute(Stringname)取得page范圍內(nèi)的name屬性O(shè)bjectgetAttribute(Stringname[,intscope])獲得某一指定范圍內(nèi)的屬性值,默認(rèn)為page范圍ObjectsetAttribute(Stringname,Objectvalue[,intscope])設(shè)置某一指定范圍內(nèi)的屬性值,默認(rèn)為page范圍voidforward(Stringurl)把頁面重定向到另外一個頁面或者servlet組件上voidgetException()返回當(dāng)前的exception對象exceptiongetRequest()返回當(dāng)前的request對象requestgetServletConfig()返回當(dāng)前的ServletConfig對象ServletConfig3.6其他內(nèi)置對象getAttribute(Stringname,intscope):取得指定范圍內(nèi)的name屬性,其中scope可以是如下4個值:PageContext.PAGE_SCOPE:對應(yīng)于page范圍。PageContext.REQUEST_SCOPE:對應(yīng)于request范圍。PageContext.SESSION_SCOPE:對應(yīng)于session范圍。PageContext.APPLICATION_SCOPE:對應(yīng)于application范圍。與getAttribute()方法相對應(yīng),pageContext也提供了2個對應(yīng)的setAttribute()方法,用于將指定變量放入page、request、session、application范圍內(nèi)。3.6其他內(nèi)置對象用pageContext實現(xiàn)頁面訪問計數(shù)器?application.setAttribute("count",number);pageContext.setAttribute("count",number,pageContext.APPLICATION_SCOPE);?3.7簡單購物車3.7簡單購物車CatalogItem.javapackagecom.ShoppingCart;publicclassCatalogItem{ privateStringitemID; privateStringshortDescription; privateStringlongDescription; privatedoublecost; publicCatalogItem(StringitemID,StringshortDescription,StringlongDescription,doublecost){ this.itemID=itemID; this.shortDescription=shortDescription; this.longDescription=longDescription; this.cost=cost; }….}3.7簡單購物車Catalog.javapackagecom.ShoppingCart;publicclassCatalog{privatestaticCatalogItem[]items={ newCatalogItem("macinery001","簡單的邏輯學(xué)","這是一本足以徹底改變你思維世界的小書。美國著名邏輯學(xué)家、哲學(xué)教授D.Q.麥克倫尼,將一門寬廣、深奧的邏輯科學(xué)以貼近生活、通俗易懂、妙趣橫生的語言娓娓道來。",23.9),….}3.7簡單購物車publicstaticCatalogItemgetItem(StringitemID){ CatalogItemitem; if(itemID==null){ returnnull; } for(inti=0;i<items.length;i++){ item=items[i]; if(itemID.equals(item.getItemID())){ returnitem; } } returnnull;}3.7簡單購物車CatalogPage.jsp<%@pagelanguage="java"contentType="text/html;charset=utf-8"pageEncoding="utf-8"%><%@pageimport="com.ShoppingCart.*"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><title>shoppingcart</title></head><bodybgcolor="#fef5e6">3.7簡單購物車<%!Stringheading="文學(xué)";Str

溫馨提示

  • 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

提交評論