版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章
JSP隱含對(duì)象本章主要內(nèi)容out隱含對(duì)象HTTP請(qǐng)求與request隱含對(duì)象HTTP響應(yīng)與response隱含對(duì)象Cookies管理session隱含對(duì)象與session跟蹤application隱含對(duì)象3.1JSP頁(yè)面中的隱含對(duì)象在JSP頁(yè)面中,經(jīng)常要處理request請(qǐng)求、response響應(yīng)等信息,為了簡(jiǎn)化程序設(shè)計(jì),JSP規(guī)范定義了常用的隱含對(duì)象,這些隱含對(duì)象不需要在JSP頁(yè)面中用new關(guān)鍵字來(lái)創(chuàng)建,而是由Servlet容器來(lái)創(chuàng)建與管理,并傳遞給JSP頁(yè)面的Servlet實(shí)現(xiàn)類使用。3.1JSP隱含對(duì)象變量名主要功能out用于JSP頁(yè)面輸出信息request可獲得用戶端請(qǐng)求參數(shù)response發(fā)輸出信息給客戶端session終端用戶與后臺(tái)系統(tǒng)交互aplication同一應(yīng)用不同程序間數(shù)據(jù)共享exceptionJSP頁(yè)面產(chǎn)生的異常對(duì)象config用于傳送和獲取初始化參數(shù)page當(dāng)前JSP頁(yè)面所表示的對(duì)象pageContext獲取其他的隱含對(duì)象及實(shí)現(xiàn)跳轉(zhuǎn)3.1JSP隱含對(duì)象在JSP頁(yè)面Servlet實(shí)現(xiàn)類的_jspService()方法內(nèi)部,自動(dòng)初始化JSP隱含對(duì)象的代碼段如下:publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)throwsjava.io.IOException,ServletException{//……HttpSessionsession=null;ServletContextapplication=null;ServletConfigconfig=null;JspWriterout=null;Objectpage=this;try{//……application=pageContext.getServletContext();config=pageContext.getServletConfig();session=pageContext.getSession();out=pageContext.getOut();}}3.2out隱含對(duì)象out對(duì)象屬于javax.servlet.jsp.JspWriter類型3.2.1顯示輸出主要方法1、print()和println()print()和println()用于打印輸出信息,前者輸出的信息在返回客戶端的源代碼中不換行,后者輸出的信息在返回客戶端的源代碼中換行。被打印的信息可以是基本數(shù)據(jù)類型(如int、double等),也可以是對(duì)象(如字符串等)。
3.2out隱含對(duì)象例如,在JSP頁(yè)面中有以下代碼:<body><% out.print("123"); out.print("456"); %></body>3.2out隱含對(duì)象2、newLine()newLine()表示輸出一個(gè)回車換行符,例如:<body><% out.print("123"); out.newLine(); out.print("456"); %></body>3.2out隱含對(duì)象3.2.2緩沖區(qū)相關(guān)的方法
1、flush()方法Java中把I/O操作轉(zhuǎn)化為流操作。out.write()輸出的信息暫時(shí)存儲(chǔ)在流對(duì)象緩沖區(qū)中,flush()刷新操作把緩沖區(qū)中的信息傳遞給目標(biāo)對(duì)象處理。如果緩沖區(qū)滿了,這個(gè)方法被自動(dòng)調(diào)用,輸出緩沖區(qū)中的信息。
3.2out隱含對(duì)象如果流已經(jīng)關(guān)閉,調(diào)用print()或flush()會(huì)引發(fā)一個(gè)IOException異常,例如:在Tomcat命令行窗口中顯示“警告:Internalerrorflushingthebufferinrelease()”的異常信息。
<%out.close();out.flush(); %>3.2out隱含對(duì)象2、clear()方法clear()表示清除緩沖區(qū)中的信息。如果緩沖區(qū)是空的,執(zhí)行此方法會(huì)引發(fā)IOException異常。3、clearBuffer()clearBuffer()的功能與clear()相似,它將輸出緩沖區(qū)清除后返回,與clear()不同的是它不拋出異常。3.2out隱含對(duì)象4、getBufferSize()getBufferSize()返回輸出緩沖區(qū)的大小,單位字節(jié),如果沒(méi)有緩沖區(qū),則返回0。5、getRemaining()getRemaining()返回緩沖區(qū)剩余的空閑空間,單位字節(jié)。3.2out隱含對(duì)象6、isAutoFlush()isAutoFlush()返回一個(gè)真假值,用于標(biāo)示緩沖區(qū)是否自動(dòng)刷新。例:<%out.print("緩沖區(qū)總?cè)萘?"+out.getBufferSize()+"<br>");out.print(“緩沖區(qū)空閑容量="+out.getRemaining()+"<br>");out.print("緩沖區(qū)是否自動(dòng)刷新="+out.isAutoFlush());%>3.3request隱含對(duì)象Request對(duì)象封裝了用戶提交的信息,通過(guò)調(diào)用該對(duì)象相應(yīng)的方法可以獲取封裝的信息。Request所依賴的接口javax.servlet.http.HttpServletRequest3.3.1用request讀取客戶端傳遞來(lái)的參數(shù)客戶端傳遞給服務(wù)器的參數(shù)最常見(jiàn)的是表單數(shù)據(jù)或附在URL中的參數(shù)。例http://localhost/exam.jsp?useId=admin中的“useId=admin”為查詢串參數(shù)。
3.3request隱含對(duì)象1、用request讀取單值參數(shù)所謂單值參數(shù)是指:一個(gè)變量最多有一個(gè)值。用request對(duì)象的getParameter()方法讀取這些參數(shù)。方法的定義為:方法的形參是參數(shù)的變量名,以String形式返回變量的值。如果request對(duì)象中沒(méi)有指定的變量,則返回null。
例如下面操作varValue的值為admin。StringvarValue=request.getParameter(useId)
publicStringgetParameter(java.lang.Stringname)3.3request隱含對(duì)象參數(shù)變量名硬編碼問(wèn)題用request.getParameter()讀取表單傳來(lái)的參數(shù)時(shí),必須要給出參數(shù)的變量名,參數(shù)變量名是以硬編碼形式嵌在代碼中的,即在程序中參數(shù)變量名是給定的,當(dāng)表單提交數(shù)據(jù)中參數(shù)變量名發(fā)生變化時(shí),需要改變程序。為了提高程序的靈活性,可以利用getParameterNames()方法,該能方法能夠返回request對(duì)象中的參數(shù)變量名,從而實(shí)現(xiàn)程序中變量的靈活設(shè)置。3.3request隱含對(duì)象參數(shù)變量名硬編碼問(wèn)題<%@pageimport="java.util.*"%><%Enumeratione=request.getParameterNames();//將request對(duì)象中的變量名置于集合中
While(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=request.getParameter(varName);//獲取集合中的變量值
out.print(varName+"="+varValue);out.print(“<br>”);}%>3.3request隱含對(duì)象【例3-1】制作一個(gè)用戶登錄應(yīng)用,用戶在表單中輸入用戶名和密碼后提交給本JSP頁(yè)面,讀取并顯示用戶輸入信息。3.3request隱含對(duì)象<body><%if(request.getParameter(“submit”!=null){Stringname=request.getParameter(“name”);Stringpw=request.getParameter(“pw”);if(name==null||name.length()==0)name=“用戶名為空“
if(pw==null||pw.length()==0)pw=“口令為空“
}%>3.3request隱含對(duì)象<formaction=“UserLogin.jsp”method=“post”><table><tr><tdalign=“center”>用戶登錄界面</td></tr><tr><tdalign=“right“>用戶名</td><td><inputtpye=“text”name=“name”/></td></tr><tr><tdalign=“right“>密碼</td><td><inputtpye=“password”name=“pw”/></td></tr><tr><td></td><td><inputtpye=“submit”name=“submit”value=“登錄”/></td></tr><tr><td>用戶名參數(shù)為:<%=name%></td><td>密碼參數(shù)為:<%=pw%></td></tr></table>/form></body>3.3request隱含對(duì)象亂碼處理在顯示從request對(duì)象讀取的中文參數(shù)時(shí)可能會(huì)出現(xiàn)亂碼。原因是Java在默認(rèn)情況下采用的是Unicode編碼標(biāo)準(zhǔn),一般是UTF-8,而中文的編碼標(biāo)準(zhǔn)通常是GB2312。解決亂碼問(wèn)題的方法是把UTF-8轉(zhuǎn)換為GB2312簡(jiǎn)體中文編碼即可。具體方法是寫一個(gè)轉(zhuǎn)換方法,顯示字符串前,把字符串轉(zhuǎn)換成簡(jiǎn)體中文后再顯示。JSP程序如下,轉(zhuǎn)換方法為StringtoChinese(Stringstr)。
【例3-2】解決從request對(duì)象讀取參數(shù)時(shí)顯示中文亂碼問(wèn)題。3.3request隱含對(duì)象<%!publicstaticStringtoChinese(Stringstr){//UTF-8轉(zhuǎn)換為GB2312方法
try{bytes1[]=str.getBytes("ISO8859-1");returnnewString(s1,"gb2312");}catch(Exceptione){returnstr;}}%><body><%if(request.getParameter("submit"!=null){Stringname=request.getParameter("userName");Stringpw=request.getParameter("password");if(name==null||name.length()==0)name="用戶名為空";elsename=toChinese(name));//把字符串轉(zhuǎn)換成簡(jiǎn)體中文后再顯示
if(pw==null||pw.length()==0)pw="口令為空";}%></body>3.3request隱含對(duì)象2、用request讀取多值參數(shù)多值參數(shù)的典型代表是表單復(fù)選框,例如上一章會(huì)員注冊(cè)例子中的“教育程度”同名表單就是多值參數(shù),教育程度選項(xiàng)中的表單變量名均為“education”,用戶可以選定多個(gè)教育程度。在服務(wù)器端讀取多值參數(shù),要用到如下方法:String[]request.getParameterValues(Stringname)形參為多值參數(shù)的變量名,多個(gè)參數(shù)值返回后存儲(chǔ)在一個(gè)字符串?dāng)?shù)組中3.3request隱含對(duì)象<%@pageimport="java.util.*"%><%Enumeratione=request.getParameterNames();While(e.hasMoreElements()){StringvarName=(String)e.nextElement();if(!varName.equals("education")){StringvarValue=request.getParameter(varName);out.print(toChinese(varName)+”=”+toChinese(varValue));out.print(“<br>”)}else{StringvarValue[]=request.getParameterValues(varName);
out.print(varName+”=”);
for(intn=0;n<varValue.length;n++){out.print(””+toChinese(varValue[n]));}out.print(“<br>”)}%>3.3request隱含對(duì)象3.3.2request作用范圍變量服務(wù)器端的兩個(gè)JSP/Servlet程序間要交換數(shù)據(jù)時(shí),可通過(guò)request作用范圍變量來(lái)實(shí)現(xiàn)。request作用范圍變量也叫request屬性,是類似于“name=value”的屬性對(duì),由屬性名和屬性值構(gòu)成,屬性值一般是一個(gè)Java對(duì)象,不是Java基本數(shù)據(jù)類型數(shù)據(jù)。3.3request隱含對(duì)象Servlet程序A要把數(shù)據(jù)對(duì)象傳遞給Servlet程序B時(shí),程序A通過(guò)調(diào)用request.setAttribute()把數(shù)據(jù)對(duì)象寫入request作用范圍,并通過(guò)request轉(zhuǎn)發(fā)跳轉(zhuǎn)到程序B,程序A的request對(duì)象被轉(zhuǎn)發(fā)給程序B,在程序B中通過(guò)request.getAttribute()從request作用范圍讀取數(shù)據(jù)對(duì)象。3.3request隱含對(duì)象屬性值對(duì)象本身的生命周期和request對(duì)象的生命周期直接相關(guān),在當(dāng)前request隱含對(duì)象有效的范圍內(nèi),與之綁定的屬性值對(duì)象也是有效的,當(dāng)request對(duì)象生命期結(jié)束時(shí),與之綁定的request屬性變量會(huì)變成垃圾對(duì)象而被回收。3.3request隱含對(duì)象在JSP中,除了request作用范圍變量外,還有page、session和application作用范圍變量,它們的基本含義都是把屬性值對(duì)象與某個(gè)有生命周期的JSP隱含對(duì)象相綁定,使屬性值對(duì)象有一定的生命周期,或者說(shuō)使屬性值對(duì)象在一定的作用范圍內(nèi)有效。3.3request隱含對(duì)象
定義作用范圍變量一般是調(diào)用相應(yīng)JSP隱含對(duì)象中的setAttribute()方法,讀取作用范圍變量一般是調(diào)用getAttribute()方法voidsetAttribute(Stringname,Objecto)用于把一個(gè)屬性對(duì)象按指定的名字寫入request作用范圍ObjectgetAttribute(Stringname)用于從request作用范圍讀出指定名字的屬性對(duì)象<%Useru=newUser();request.setAttribute("loginName",u);
Users=(User)request.getAttribute("loginName");out.print(s);%>3.3request隱含對(duì)象2、getRequestDispatcher(Stringtarget)兩個(gè)Servlet程序間要利用request作用范圍變量來(lái)傳遞數(shù)據(jù)時(shí),要用轉(zhuǎn)發(fā)跳轉(zhuǎn)操作實(shí)現(xiàn)從第一個(gè)Servlet程序A跳轉(zhuǎn)到第二個(gè)Servlet程序B。3.3request隱含對(duì)象request轉(zhuǎn)發(fā)器(RequestDispatcher)的作用是獲得目標(biāo)資源的轉(zhuǎn)發(fā)器,通過(guò)轉(zhuǎn)發(fā)器將當(dāng)前Servlet程序的request和response對(duì)象轉(zhuǎn)發(fā)給目標(biāo)資源,并跳轉(zhuǎn)至目標(biāo)資源上運(yùn)行程序,這樣,目標(biāo)資源就可通過(guò)request對(duì)象讀取上一資源傳遞給它的request屬性。3.3request隱含對(duì)象request.getRequestDispatcher()的作用是返回目標(biāo)資源的RequestDispatcher對(duì)象,語(yǔ)法為:形參是當(dāng)前Web應(yīng)用目標(biāo)資源的URI,可以使用相對(duì)路徑或絕對(duì)路徑。publicRequestDispatchergetRequestDispatcher(java.lang.Stringpath)3.3request隱含對(duì)象RequestDispatcher中主要的方法有:publicvoidforward(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException該方法能夠把當(dāng)前Servlet程序的request和response隱含對(duì)象轉(zhuǎn)發(fā)給目標(biāo)資源,并跳轉(zhuǎn)至目標(biāo)資源運(yùn)行代碼。形參是當(dāng)前Servlet程序的request和response隱含對(duì)象。3.3request隱含對(duì)象publicvoidinclude(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException該方法用于包含目標(biāo)資源。形參是當(dāng)前JSP/Servlet程序的request、response對(duì)象。如果目標(biāo)資源是JSP頁(yè)面,它會(huì)被編譯成Servlet程序后再運(yùn)行。進(jìn)行包含操作前,允許對(duì)當(dāng)前JSP/Servlet程序的response輸出緩沖區(qū)進(jìn)行刷新。3.3request隱含對(duì)象【例3-3】利用request作用范圍變量在兩個(gè)JSP頁(yè)面間傳遞數(shù)據(jù)。操作步驟如下:<body>//jsp程序A<%request.setAttribute("loginName","tom");RequestDispatchergo=request.getRequestDispatcher("exam.jsp");go.forward(request,response);%></body><body>//jsp程序B(exam.jsp)<%Strings=(String)request.getAttribute("loginName");out.print(s)%></body>3.3request隱含對(duì)象3、removeAttribute()此方法的作用是從request作用范圍中刪除指定名字的屬性,它的語(yǔ)法為:形參是屬性名。例如:publicvoidremoveAttribute(Stringname)request.removeAttribute(“name”);3.3request隱含對(duì)象3.3.3用request讀取系統(tǒng)信息1、StringgetProtocol()返回request請(qǐng)求使用的協(xié)議及版本號(hào)2、StringgetRemoteAddr()返回客戶端或最后一個(gè)客戶端代理服務(wù)器的地址3.3request隱含對(duì)象3、StringgetRemoteHost()
返回客戶端主機(jī)名或最后一個(gè)客戶端代理服務(wù)器的主機(jī)名,如果主機(jī)名讀取失敗,則返回主機(jī)的IP地址。4、StringgetScheme()返回當(dāng)前request對(duì)象的構(gòu)造方案,例如http、https和ftp等,不同的構(gòu)造方案有不同的URL構(gòu)造規(guī)則。5、StringgetQueryString()返回URL的查詢字串,即URL中“?”后面的“name=value”對(duì)。3.3request隱含對(duì)象6、StringgetReuquestURI()返回URL請(qǐng)求中目標(biāo)資源的URI。7、StringgetMethod()返回request請(qǐng)求的提交方式,如:GET、POST等。8、StringgetServletPath()返回調(diào)用Servlet程序的URL請(qǐng)求。9、StringgetRealPath()返回虛擬路徑在服務(wù)器上的真實(shí)絕對(duì)路徑。3.4response隱含對(duì)象3.4.1輸出緩沖區(qū)與響應(yīng)提交輸出緩沖區(qū)用于暫存Servlet程序的輸出信息,減少服務(wù)器與客戶端的網(wǎng)絡(luò)通信次數(shù)。傳送給客戶端的信息稱之為響應(yīng)信息(response),如果輸出緩沖區(qū)中的響應(yīng)信息已經(jīng)傳遞給客戶端,稱響應(yīng)是已經(jīng)提交。刷新操作強(qiáng)制把輸出緩沖區(qū)中的內(nèi)容傳送回客戶端。3.4response隱含對(duì)象response對(duì)象中和輸出緩沖區(qū)相關(guān)的方法有:1、publicvoidflushBuffer()throwsjava.io.IOException刷新輸出緩沖區(qū),把信息傳回客戶端。2、publicvoidsetBufferSize(intsize)定義輸出緩沖區(qū)的大小,單位字節(jié)。3、publicbooleanisCommitted()返回緩沖區(qū)中的響應(yīng)信息是否已經(jīng)提交。3.4response隱含對(duì)象3.4.2HTTP響應(yīng)報(bào)頭設(shè)置服務(wù)器通過(guò)HTTP響應(yīng)報(bào)頭向客戶端瀏覽器傳送通信信息。JSP服務(wù)器在默認(rèn)情況下,響應(yīng)信息是以字符形式傳送。如果要用HTTP響應(yīng)報(bào)頭傳輸二進(jìn)制數(shù)據(jù),應(yīng)該通過(guò)response.getOutputStream()獲得一個(gè)ServletOutputStream輸出流對(duì)象輸出二進(jìn)制信息。
3.4response隱含對(duì)象1、publicvoidsetContentType(java.lang.Stringtype)定義返回客戶端的信息類型及編碼標(biāo)準(zhǔn),默認(rèn)是“text/html;charset=UTF-8”。如果返回給客戶端的是二進(jìn)制信息,則應(yīng)該調(diào)用此方法作適當(dāng)?shù)脑O(shè)置。信息類型為MIME-type中定義的類型,瀏覽器會(huì)根據(jù)信息類型自動(dòng)調(diào)用匹配的軟件來(lái)處理,或?qū)⑿畔⒘泶鏋橐粋€(gè)文件。例:response.setContentType("text/html;charset=gb2312");3.4response隱含對(duì)象<%@pageimport="java.io.*"%><%response.setContentType("application/vnd.ms-excel");try{PrintWriterout=response.getWrite();out.println("學(xué)號(hào)\t姓名\t平時(shí)成績(jī)\t考試成績(jī)\t期末成績(jī)");out.println("s001\t張平\t78\t69\t=round(C2*0.3+D2*0.7,0)");out.println("s001\t李麗\t88\t96\t=round(C2*0.3+D2*0.7,0)");out.println("s001\t王宏\t63\t72\t=round(C2*0.3+D2*0.7,0)");}catch(Exceptione){Out.print("錯(cuò)誤信息:"+e);}%>用response返回Excel文檔形式的學(xué)生成績(jī)表。IE瀏覽器接收到返回的Excel數(shù)據(jù)后,會(huì)自動(dòng)嵌入Excel軟件顯示數(shù)據(jù),如果Excel啟動(dòng)失敗,瀏覽器提示把接收到的信息另存為磁盤文件。3.4response隱含對(duì)象2、publicvoidsetCharacterEncoding(java.lang.Stringcharset)
定義返回客戶端信息的編碼標(biāo)準(zhǔn)。如果已經(jīng)用response.setContentType()定義字符集,則調(diào)用此方法將重新設(shè)置字符集。信息字符集的定義要在緩沖區(qū)刷新前進(jìn)行。3.4response隱含對(duì)象3、publicvoidsendError(intsc)throwsjava.io.IOException向客戶端返回HTTP響應(yīng)碼,并清空輸出緩沖區(qū)。HTTP響應(yīng)碼由三位的十進(jìn)制數(shù)構(gòu)成:1xx:請(qǐng)求收到,繼續(xù)處理。2xx:成功,行為被成功地接受、理解和接受。3xx:重定向,為了完成請(qǐng)求,必須進(jìn)一步執(zhí)行的動(dòng)作。4xx:客戶端錯(cuò)誤。5xx:服務(wù)器出錯(cuò)。3.4response隱含對(duì)象例如在IE瀏覽器地址欄中輸入::8080/aabb.jsp,企圖訪問(wèn)Tomcat服務(wù)器中不存在的資源aabb.jsp,則Tomcat會(huì)給客戶端返回一個(gè)HTTP響應(yīng)碼404,在IE瀏覽器上顯示HTTP響應(yīng)碼及錯(cuò)誤信息。3.4response隱含對(duì)象如果要人為地返回HTTP響應(yīng)碼,則調(diào)用sendError(intsc)方法,如:<body><%out.print(“返回一個(gè)404響應(yīng)碼”);response.sendError(404);%></body>
預(yù)覽后,在IE瀏覽器中顯示404狀態(tài)碼信息。3.4response隱含對(duì)象4、publicvoidsetHeader(java.lang.Stringname,java.lang.Stringvalue)第一個(gè)形參為報(bào)頭名,第二個(gè)形參是報(bào)頭值。HTTP報(bào)頭中有一個(gè)名為“Refresh”的響應(yīng)報(bào)頭,它的作用是使IE瀏覽器在若干秒后自動(dòng)刷新當(dāng)前網(wǎng)頁(yè)或跳轉(zhuǎn)至指定的URL資源。3.4response隱含對(duì)象這個(gè)報(bào)頭的語(yǔ)法為:
Response.setHeader("Refresh","定時(shí)秒數(shù)",url=目標(biāo)資源的URL)方法的第一個(gè)形參是響應(yīng)報(bào)頭名"Refresh",第二個(gè)形參由兩部分組成:第一部分定義秒數(shù),即:若干秒后自動(dòng)刷新,第二部分為目標(biāo)資源的URL,缺少時(shí)默認(rèn)刷新當(dāng)前頁(yè)。3.4response隱含對(duì)象<%!Staticintnumber=0;%><body><%number=number+1;out.print("number="+number);response.setHeader("Refresh","2");%></body>3.4response隱含對(duì)象3.4.3用response實(shí)現(xiàn)JSP頁(yè)面重定向重定向是JSP中實(shí)現(xiàn)JSP/Servlet程序跳轉(zhuǎn)至目標(biāo)資源的方法之一。它的基本思想是:服務(wù)器將目標(biāo)資源完整的URL通過(guò)HTTP響應(yīng)報(bào)頭發(fā)送給客戶端瀏覽器,瀏覽器接收到URL后更新至地址欄中,并將目標(biāo)資源的URL提交給服務(wù)器。重定向使目標(biāo)資源的URL從服務(wù)器傳到客戶端瀏覽器,再?gòu)目蛻舳送ㄟ^(guò)HTTP請(qǐng)求傳回服務(wù)器,其中有一定的網(wǎng)絡(luò)時(shí)延。
3.4response隱含對(duì)象實(shí)現(xiàn)JSP頁(yè)面跳轉(zhuǎn)的主要方法有轉(zhuǎn)發(fā)跳轉(zhuǎn)(forward)和重定向跳轉(zhuǎn)(redirect),RequestDispatcher.forward()實(shí)現(xiàn)的是轉(zhuǎn)發(fā)跳轉(zhuǎn),response.sendRedirect()實(shí)現(xiàn)的是重定向跳轉(zhuǎn)。兩者的最大區(qū)別在于:1、重定向是通過(guò)客戶端重新發(fā)送URL來(lái)實(shí)現(xiàn),會(huì)導(dǎo)致瀏覽器地址更新,而轉(zhuǎn)發(fā)是直接在服務(wù)器端切換程序,目標(biāo)資源的URL不出現(xiàn)在瀏覽器的地址欄中;3.4response隱含對(duì)象2、轉(zhuǎn)發(fā)能夠把當(dāng)前JSP頁(yè)面中的request、response對(duì)象轉(zhuǎn)發(fā)給目標(biāo)資源,而重定向會(huì)導(dǎo)致當(dāng)前JSP頁(yè)面的request、response對(duì)象生命期結(jié)束,在目標(biāo)資源中無(wú)法取得上一個(gè)JSP頁(yè)面的request對(duì)象;3、轉(zhuǎn)發(fā)跳轉(zhuǎn)直接在服務(wù)器端進(jìn)行,基本上沒(méi)有網(wǎng)絡(luò)傳輸時(shí)延,重定向有網(wǎng)絡(luò)傳輸時(shí)延。3.4response隱含對(duì)象如果要實(shí)現(xiàn)服務(wù)器中兩個(gè)Servlet程序間跳轉(zhuǎn),并且要使用request作用范圍變量交換數(shù)據(jù),應(yīng)該優(yōu)先使用request轉(zhuǎn)發(fā)跳轉(zhuǎn)。用重定向?qū)崿F(xiàn)程序跳轉(zhuǎn)時(shí),如果要求傳遞數(shù)據(jù)給目標(biāo)資源,一個(gè)簡(jiǎn)單、可行的方法是把數(shù)據(jù)編碼在URL查詢串中。例如::8080/exam.jsp?name=tom3.4response隱含對(duì)象用response實(shí)現(xiàn)重定向,要調(diào)用的方法為:形參是目標(biāo)資源的URL,可以是相對(duì)路徑或絕對(duì)路徑。例如:<%response.sendRedirect(“:8080/exam.jsp?name=tom”);%>publicvoidsendRedirect(Stringlocation)throwsjava.io.IOException3.4response隱含對(duì)象3.4.4用response實(shí)現(xiàn)文件下載在JSP中實(shí)現(xiàn)文件下載最簡(jiǎn)單的方法是定義超鏈接指向目標(biāo)資源,用戶單擊超鏈接后直接下載資源,但直接暴露資源的URL也會(huì)帶來(lái)一些負(fù)面的影響,例如容易被其它網(wǎng)站盜鏈,造成本地服務(wù)器下載負(fù)載過(guò)重。3.4response隱含對(duì)象另外一種下載文件的方法是使用文件輸出流實(shí)現(xiàn)下載,首先通過(guò)response報(bào)頭告知客戶端瀏覽器,將接收到的信息另存為一個(gè)文件,然后用輸出流對(duì)象給客戶端傳輸文件數(shù)據(jù),瀏覽器接收數(shù)據(jù)完畢后將數(shù)據(jù)另存為文件。使用文件輸出流下載方法的優(yōu)點(diǎn)是服務(wù)器端資源路徑的保密性好,并可控制下載的流量以及日志登記等。3.4response隱含對(duì)象二進(jìn)制文件的下載首先將源文件封裝成字節(jié)輸入流對(duì)象,通過(guò)該對(duì)象讀取文件數(shù)據(jù),獲取response對(duì)象的字節(jié)輸出流對(duì)象,通過(guò)輸出流對(duì)象將二進(jìn)制的字節(jié)數(shù)據(jù)傳送給客戶端。把源文件封裝成字節(jié)輸入流對(duì)象將源文件封裝成字節(jié)輸入流,用JDK中的java.io.FileInputStream類,例如:
FileInputStreaminFile=newFileInputStream(“c:\\temp\\my1.exe”);從輸入流中讀取一定數(shù)量的字節(jié)數(shù)據(jù)并將其緩存在數(shù)組b中。publicintread(byte[]b)throwsIOException方法返回值是實(shí)際讀取到的字節(jié)數(shù)。如果檢測(cè)到文件尾,返回-1。3.4response隱含對(duì)象讀取二進(jìn)制字節(jié)數(shù)據(jù)并傳輸給客戶端response對(duì)象的getOutputStream()方法可返回一個(gè)字節(jié)輸出流對(duì)象ServletOutputStreamServletOutputStream中輸出二進(jìn)制字節(jié)數(shù)據(jù)的方法write(byte[]b)將數(shù)組中的b.length個(gè)字節(jié)寫入輸出流。例如:ServletOutputStreammyOut=response.getOutputStream();3.4response隱含對(duì)象【例3-6】用response把ROOT\d.zip文件傳送回客戶端。<%@pagecontentType="application/x-download",import="java.io.*"%><%intstatus=0;byteb[]=newbyte[1024];;FileInputStreamin=null;ServletOutputStreamout=null;try{response.setHeader("content-disposition","attachment;filename=d.zip");in=newFileInputStream("d.zip");out=response.getOutputStream();while(status!=-1){
status=in.read(b)out.write(b);}out.flush();}catch(Exceptione){System.out.println(e);response.sendRedirect("downError.jsp");
//重定向到出錯(cuò)頁(yè)面}finally{if(in!=null)in.close();if(out!=null)out.close();}%>3.4response隱含對(duì)象文本文件的下載文本文件下載時(shí)用的是字符流,而不是字節(jié)流。首先取得源文件的字符輸入流對(duì)象,用java.io.FileReader類封裝,再把FileReader對(duì)象封裝為java.io.BufferedReader,以方便從文本文件中一次讀取一行。字符輸出流直接用JSP的隱含對(duì)象out,out能夠輸出字符數(shù)據(jù)。用到FileReader類的方法有FileReader(StringfileName),該構(gòu)造方法取得文件的字符輸入流對(duì)象,形參fileName是文件的路徑和文件名,路徑分隔符用“//”或“\\”。如果打開(kāi)文件出錯(cuò),會(huì)引發(fā)一個(gè)異常。用到BufferedReader的方法有BufferedReader(Readerin)和readLine(),前者為構(gòu)造方法,后者從文本文件中一次讀取一行。3.4response隱含對(duì)象【例3-7】用JSP下載ROOT\ee.txt文件。<%@pagecontentType="application/x-download",import="java.io.*"%><%Stringtemp=null;FileReaderin=null;BufferedReaderin2=null;try{response.setHeader("content-disposition","attachment;filename=exam.txt");response.setCharacterEncoding("gb2312");in=newFileReader("ee.text");in2=newBufferedReader(in);while((temp=in2.readLine())!=null)out.println(temp);out.close();}catch(Exceptione){System.out.println(e);response.sendRedirect("downError.jsp");//重定向到出錯(cuò)頁(yè)面}finally{if(in2!=null)in2.close();}%>3.5cookie管理Cookie機(jī)制Cookie或稱Cookies,在Web技術(shù)中指Web服務(wù)器暫存在客戶端瀏覽器內(nèi)存或硬盤文件中的少量數(shù)據(jù)。Web服務(wù)器通過(guò)HTTP報(bào)頭來(lái)獲得客戶端中的cookie信息。由于HTTP是無(wú)態(tài)的,無(wú)法記錄用戶的在線狀態(tài)信息,利用cookie可以解決這個(gè)問(wèn)題,把待存儲(chǔ)的信息封裝在cookie對(duì)象中并傳回客戶端保存,需要時(shí)再?gòu)目蛻舳俗x取。3.5cookie管理Cookie機(jī)制如果不設(shè)置過(guò)期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì)話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽器會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里。如果設(shè)置了過(guò)期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie仍然有效,直到超過(guò)設(shè)定的過(guò)期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。Cookie信息的基本結(jié)構(gòu)類似于“name=value”對(duì),每個(gè)數(shù)據(jù)有一個(gè)變量名。3.5cookie管理WindowsXP中,有一個(gè)“C:\DocumentsandSettings\admin\Cookies”文件夾,文件夾中存儲(chǔ)有曾經(jīng)訪問(wèn)過(guò)的網(wǎng)站的cookie文件。在此文件夾中,類似于“admin@127.0.0[1].txt”的文件中會(huì)看到被保存的cookie數(shù)據(jù)。3.5cookie管理在JSP中使用cookie的基本過(guò)程為:在服務(wù)器端生成cookie對(duì)象,把待保存信息寫入cookie對(duì)象中;必要時(shí)設(shè)置cookie對(duì)象的生命期;把cookie對(duì)象傳給客戶端瀏覽器保存;服務(wù)器端程序需要cookie信息時(shí),用代碼讀取cookie信息。3.5cookie管理Cookie類javax.servlet.http.Cookie類用來(lái)生成一個(gè)cookie對(duì)象,這個(gè)類中常用的方法有:構(gòu)造方法的語(yǔ)法為Cookie(java.lang.Stringname,java.lang.Stringvalue)第一個(gè)形參是cookie數(shù)據(jù)的變量名,第二個(gè)形參是待保存的數(shù)據(jù),字符串類型。3.5cookie管理publicvoidsetMaxAge(intexpiry)這個(gè)方法定義cookie對(duì)象的生命期,形參是生命時(shí)間數(shù),單位秒。如果生命周期為負(fù)整數(shù),表示這個(gè)cookie對(duì)象是臨時(shí)的,不要保存在硬盤文件中,關(guān)閉IE瀏覽器后cookie數(shù)據(jù)自動(dòng)丟失。如果生命期為零,表示刪除這個(gè)cookie。默認(rèn)值為-1。Cookie的生命期定義要在cookie對(duì)象傳回客戶端前進(jìn)行。publicintgetMaxAge()用publicintgetMaxAge()方法可讀取cookie對(duì)象的生命周期時(shí)間。3.5cookie管理publicvoidsetSecure(booleanflag)形參取值true時(shí),表示用https或SSL安全協(xié)議將cookie傳回服務(wù)器;取false時(shí)表示用當(dāng)前默認(rèn)的協(xié)議傳回cookie。publicjava.lang.StringgetName()返回當(dāng)前cookie對(duì)象的變量名。publicjava.lang.StringgetValue()返回當(dāng)前cookie對(duì)象的值。3.5cookie管理將cookie對(duì)象傳回客戶端將cookie對(duì)象傳回客戶端,要用到JSP隱含對(duì)象response,用到的方法為:publicvoidaddCookie(Cookiecookie)形參是待保存的cookie對(duì)象。例如<%Cookiemsg=newCookie("login","tom");msg.setMaxAge(60*60*60*60);response.addCookie(msg);%>3.5cookie管理讀取cookie對(duì)象讀取客戶端存儲(chǔ)的cookie,用request對(duì)象的getCookies()方法,它的語(yǔ)法為:
publicCookie[]getCookies()返回的是一個(gè)cookie對(duì)象數(shù)組,當(dāng)前瀏覽器中所有有效的cookie會(huì)通過(guò)HTTP請(qǐng)求報(bào)頭返回給服務(wù)器,每個(gè)數(shù)組分量是一個(gè)返回的cookie對(duì)象。如果客戶端沒(méi)有有效的cookie,則返回null值。3.5cookie管理例如:<%Cookiec[]=request.getCookies();if(c!=null){for(inti=0;i<c.length;i++)out.print(c[i].getName+”=”+c[i].getValue()+”<br>”);}elseout.print(“沒(méi)有返回cookie”);%>3.5cookie管理【例3-6】定義一個(gè)cookie對(duì)象,存儲(chǔ)用戶的登錄名,生命期為30天。在另一個(gè)頁(yè)面中查詢這個(gè)cookie,如果讀取的cookie不為空,則顯示用戶登錄名,否則顯示“沒(méi)有登錄”信息。再定義一個(gè)cookie對(duì)象,記錄客戶最近瀏覽過(guò)的五本圖書的書號(hào):AB001、KC981、DE345、RD332和PC667,如果已經(jīng)登錄,則顯示書號(hào),cookie生命期為30天。3.5cookie管理<body><%StringmyName="John";StringvisitedBook="AB001,KC981,DE345,RD332,PC667"Cookiec1=newCookie("loginName",myName);c1.setMaxAge(30*24*60*60);Cookiec2=newCookie(myName,visitedBook);C2.setMaxAge(30*24*60*60);response.addCookie(c1);response.addCookie(c2);out.print("成功將用戶名、書目Cookie傳回客戶端,有效期30天");%></body>預(yù)覽程序執(zhí)行后網(wǎng)頁(yè)上顯示信息“成功將用戶名、書目cookie傳回客戶端,有效期30天”。3.5cookie管理<body><% StringmyName=null; StringvisitedBook=null;Cookiec[]=request.getCookies(); if(c==null){out.print("沒(méi)有返回cookie"); } else{ for(inti=0;i<c.length;i++){ Stringtemp=c[i].getName(); if(temp.equals("loginName")) myName=c[i].getValue(); if(myName!=null&&temp.equals(myName)) visitedBook=c[i].getValue(); }if(myName!=null){ out.print("您已經(jīng)登錄,用戶名="+myName+"<br>")if(visitedBook!=null)out.print("您最近瀏覽過(guò)的圖書書號(hào)是:"+visitedBook);}else out.print("您沒(méi)有登錄");}%></body>
3.5cookie管理預(yù)覽執(zhí)行結(jié)果頁(yè)面,瀏覽器中顯示的信息為:您已經(jīng)登錄,用戶名=John
您最近瀏覽過(guò)的圖書書號(hào)是:AB001,KC981,DE345,RD332,PC6673.7application隱含對(duì)象一個(gè)Web服務(wù)器通常有多個(gè)Web服務(wù)目錄(網(wǎng)站),當(dāng)Web服務(wù)器啟動(dòng)時(shí),它自動(dòng)為每個(gè)Web服務(wù)目錄都創(chuàng)建一個(gè)application對(duì)象,這些application對(duì)象各自獨(dú)立,而且和Web服務(wù)目錄一一對(duì)應(yīng)。訪問(wèn)同一個(gè)網(wǎng)站的客戶都共享一個(gè)application對(duì)象。具體來(lái)說(shuō):不管哪個(gè)客戶來(lái)訪問(wèn)網(wǎng)站A,也不管客戶訪問(wèn)網(wǎng)站A下哪個(gè)頁(yè)面文件,都可以對(duì)網(wǎng)站A的application對(duì)象進(jìn)行操作。因此,當(dāng)在application對(duì)象中存儲(chǔ)數(shù)據(jù)后,所有訪問(wèn)網(wǎng)站A的客戶都能夠?qū)ζ溥M(jìn)行訪問(wèn),實(shí)現(xiàn)了多個(gè)客戶之間的數(shù)據(jù)共享。訪問(wèn)不同網(wǎng)站的客戶,對(duì)應(yīng)的application對(duì)象不同。與out、request、response只作用于當(dāng)前頁(yè)不同,application對(duì)象的有效范圍是當(dāng)前應(yīng)用,即在同一應(yīng)用程序中,只要應(yīng)用服務(wù)器不關(guān)閉,這個(gè)對(duì)象就一直有效。3.7application隱含對(duì)象application作用范圍變量(屬性)
application作用范圍變量也叫application屬性,是類似于“name=value”的屬性對(duì),由屬性名和屬性值構(gòu)成,屬性值一般是一個(gè)Java對(duì)象,不是Java基本數(shù)據(jù)類型數(shù)據(jù)。application屬性能夠被Web應(yīng)用中的所有程序共享。3.7application隱含對(duì)象application對(duì)象和session對(duì)象的比較兩者的作用范圍不同session對(duì)象是用戶級(jí)的對(duì)象,而application對(duì)象是應(yīng)用程序級(jí)的對(duì)象。一個(gè)用戶一個(gè)session對(duì)象,每個(gè)用戶的session對(duì)象不同,在用戶所訪問(wèn)網(wǎng)站的多個(gè)頁(yè)面之間共享同一個(gè)session對(duì)象。一個(gè)Web應(yīng)用程序一個(gè)application對(duì)象,每個(gè)Web應(yīng)用程序的application對(duì)象不同,但一個(gè)Web應(yīng)用程序的多個(gè)用戶之間共享同一個(gè)application對(duì)象。在同一個(gè)網(wǎng)站下,每個(gè)用戶的session對(duì)象不同,所用用戶的application對(duì)象相同。在不同網(wǎng)站下,每個(gè)用戶的session對(duì)象不同,每個(gè)用戶的application對(duì)象不同。兩者的生命周期不同session對(duì)象的生命周期是用戶首次訪問(wèn)網(wǎng)站創(chuàng)建,用戶離開(kāi)該網(wǎng)站(不一定要關(guān)閉瀏覽器)消亡。application對(duì)象的生命周期是啟動(dòng)Web服務(wù)器創(chuàng)建,關(guān)閉Web服務(wù)器銷毀。3.7application隱含對(duì)象1、publicjava.util.EnumerationgetAttributeNames()返回當(dāng)前上下文中所有可用的appliaction作用范圍變量名,并存儲(chǔ)在枚舉型對(duì)象中。2、publicjava.lang.ObjectgetAttribute(java.lang.Stringname)從application作用范圍中讀取指定名字的屬性值,返回的屬性值是Object類型,一般要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,還原其原本數(shù)據(jù)類型。如果指定的屬性值對(duì)象不存在,則返回null。3.7application隱含對(duì)象以下代碼段是遍歷當(dāng)前Web應(yīng)用中所有的application屬性:<%@pageimport="java.util.*"%><%Enumeratione=application.getAttributeNames();While(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=(String)application.getAttribute(varName);out.print(varName+"="+varValue+"<br>");}%>3.7application隱含對(duì)象3、publicvoidsetAttribute(Stringname,Objectobject)把一個(gè)屬性寫入application作用范圍。第一個(gè)形參name是屬性名,第二個(gè)形參object是屬性值,它是一個(gè)Java對(duì)象。如果屬性值object為null,則相當(dāng)于刪除一個(gè)屬性名為name的屬性。如果容器中已經(jīng)存在指定名字的屬性,寫入操作會(huì)用當(dāng)前的屬性值替換原有的屬性值。4、publicvoidremoveAttribute(java.lang.Stringname)從Servlet容器中刪除指定名字的屬性。形參是屬性名,字符串形式。3.5application隱含對(duì)象4、publicvoidremoveAttribute(java.lang.Stringname)從Servlet容器中刪除指定名字的屬性。形參是屬性名,字符串形式。3.7application隱含對(duì)象【例3.7】用application實(shí)現(xiàn)一個(gè)站點(diǎn)計(jì)數(shù)器。具體要求是當(dāng)訪問(wèn)JSP頁(yè)面時(shí),頁(yè)面進(jìn)行訪問(wèn)次數(shù)統(tǒng)計(jì),并輸出當(dāng)前計(jì)數(shù)值。用request.getRemoteAddr()來(lái)獲取用戶的IP地址,將訪問(wèn)過(guò)的用戶IP地址作為application屬性保存,只有新的IP地址才進(jìn)行計(jì)數(shù)。3.7application隱含對(duì)象<body><%@pageimport="java.util.*"%><%intn=0;Stringip=request.getRemoteAddr();
Stringcounter=(String)application.getAttribute("counter");if(counter!=null)n=Integer.parseInt(counter);Enumeratione=application.getAttributeNames();while(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=(String)application.getAttribute(varName);if(!ip.equals(varValue)){n=n+1;out.print("您是第"+n+"位訪客");counter=String.valueOf(n);application.setAttribute("counter",counter);application.setAttribute("ip"+n,ip);}else{out.print("您已經(jīng)訪問(wèn)過(guò)本站");}}<%</body>3.6session隱含對(duì)象
HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,一次請(qǐng)求和響應(yīng)客戶端與服務(wù)器端的連接就會(huì)關(guān)閉,服務(wù)器并不保存相關(guān)的信息,再次交換數(shù)據(jù)需要建立新的連接。而通常一個(gè)Web應(yīng)用是由多個(gè)web頁(yè)面組成的一個(gè)完整的頁(yè)面訪問(wèn)鏈條。一個(gè)用戶對(duì)一個(gè)Web應(yīng)用包含的多個(gè)web頁(yè)面的訪問(wèn)過(guò)程稱為一個(gè)會(huì)話。保存和跟蹤一個(gè)會(huì)話過(guò)程的各頁(yè)面信息并實(shí)現(xiàn)共享是十分重要的。session對(duì)象是JSP技術(shù)是為解決會(huì)話問(wèn)題而專門提供的一種解決方案。下面的討論中會(huì)話和session對(duì)象的概念會(huì)交替出現(xiàn),要注意區(qū)分它們。3.6session隱含對(duì)象session生命期及跟蹤方法通常把從用戶登錄進(jìn)入系統(tǒng)到注銷退出系統(tǒng)所經(jīng)歷的時(shí)間,稱為一個(gè)session生命周期。生命期結(jié)束,則session對(duì)象被刪除,與之綁定的session屬性也隨之丟失。影響session對(duì)象生命期的主要因素有:客戶端瀏覽器窗口關(guān)閉,服務(wù)器關(guān)閉,session超時(shí),程序主動(dòng)結(jié)束session。要跟蹤該會(huì)話,必須引入一種機(jī)制,就是如何把一個(gè)操作步中產(chǎn)生的有用信息保存下來(lái),供后續(xù)的操作步使用,以及如何標(biāo)識(shí)當(dāng)前session通信等,這些問(wèn)題稱之為session跟蹤問(wèn)題。實(shí)現(xiàn)session跟蹤有多種方法,通過(guò)session隱含對(duì)象屬性設(shè)置是實(shí)現(xiàn)session跟蹤最直接和簡(jiǎn)捷的方法。3.6session隱含對(duì)象用URL重寫實(shí)現(xiàn)session跟蹤URL重寫(URLRewriting)就是把session數(shù)據(jù)編碼成“name=value”對(duì),當(dāng)作URL的查詢串附在URL后,用帶有查詢串的URL訪問(wèn)下一個(gè)目標(biāo)資源時(shí),附在URL查詢串中的session數(shù)據(jù)自然被傳送給下一頁(yè)。用cookie實(shí)現(xiàn)session跟蹤用cookie實(shí)現(xiàn)session跟蹤的基本原理是:把一個(gè)session數(shù)據(jù)封裝在一個(gè)cookie對(duì)象中,將cookie對(duì)象傳回客戶端存儲(chǔ),需要用到時(shí)用代碼從客戶端讀取。用隱藏表單域?qū)崿F(xiàn)session跟蹤隱藏表單域在頁(yè)面上不可視,它相當(dāng)于一個(gè)變量,如果把一個(gè)session數(shù)據(jù)存儲(chǔ)在其中,則提交表單時(shí),隱藏表單域中的數(shù)據(jù)也會(huì)被提交給服務(wù)器。3.6session隱含對(duì)象session對(duì)象和cookie對(duì)象的比較
sessionid當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)sessionid;如果客戶端請(qǐng)求不包含sessionid,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的sessionid,sessionid的值應(yīng)該是唯一的,這個(gè)sessionid將被在本次響應(yīng)中返回給客戶端保存;如果已包含一個(gè)sessionid則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照sessionid把這個(gè)session檢索出來(lái)使用。3.6session隱含對(duì)象session對(duì)象和cookie對(duì)象的比較
cookie機(jī)制和session機(jī)制異同cookie機(jī)制和session機(jī)制是保存客戶端與服務(wù)器端連接狀態(tài)的兩種解決方案。具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),保存這個(gè)sessionid的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器。3.6session隱含對(duì)象session對(duì)象主要方法
1、publicbooleanisNew()判斷session對(duì)象是新創(chuàng)建的,還是已經(jīng)存在。返回true時(shí),表示session對(duì)象是剛創(chuàng)建的,也表示本次客戶端發(fā)出的請(qǐng)求是本次session通信的第一次請(qǐng)求。這個(gè)方法返回true,并不表示客戶端瀏覽器窗口是新打開(kāi)的。2、publicjava.lang.StringgetId()返回當(dāng)前session對(duì)象的ID號(hào)。3.6session隱含對(duì)象3、publiclonggetLastAccessedTime()返回客戶端最后一次請(qǐng)求的發(fā)送時(shí)間,是一個(gè)long型的整數(shù),單位毫秒,是從格林威治時(shí)間1970-1-100:00:00到當(dāng)前所經(jīng)歷的毫秒數(shù)。例如,以下代碼可以取得session通信中最后一次請(qǐng)求時(shí)間并將毫秒時(shí)間格式轉(zhuǎn)換為年月日時(shí)分秒(Calendar)格式。longa=session.getLastAccessedTime();Calendartime=Calendar.getInstance();time.setTimeInMillis(a);3.6session隱含對(duì)象4、publicvoidsetMaxInactiveInterval(intinterval)形參是一個(gè)整數(shù),定義session對(duì)象的超時(shí)時(shí)間,單位秒。如果客戶端從最后一次請(qǐng)求開(kāi)始,在連續(xù)的interval秒內(nèi)一直沒(méi)有再向服務(wù)器發(fā)送HTTP請(qǐng)求,則服務(wù)器認(rèn)為出現(xiàn)了session超時(shí),將刪除本次的session對(duì)象。如果超時(shí)時(shí)間為負(fù)數(shù),表示永不超時(shí)。session對(duì)象的超時(shí)檢測(cè)由服務(wù)器實(shí)現(xiàn),這會(huì)增加系統(tǒng)開(kāi)銷。Tomcat默認(rèn)的超時(shí)時(shí)間是30分鐘。3.6session隱含對(duì)象5、publicintgetMaxInactiveInterval()讀取當(dāng)前的session超時(shí)時(shí)間,單位秒。6、publicvoidinvalidate()使當(dāng)前session無(wú)效,session作用范圍變量也會(huì)隨之丟失。3.6session隱含對(duì)象session隱含對(duì)象屬性的相關(guān)方法為:7、publicvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)定義session作用范圍變量,第一個(gè)形參name是session作用范圍變量名,第二個(gè)形參value是session屬性。如果value為null,則表示取消session屬性和session的綁定關(guān)系。
8、publicjava.lang.ObjectgetAttribute(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025防腐工程合同范文
- 2025合同協(xié)議中外合資經(jīng)營(yíng)企業(yè)章程無(wú)客戶信息版
- 2024至2030年中國(guó)合成稠化內(nèi)燃機(jī)油行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024年電力躉購(gòu)合同規(guī)范3篇
- 2025柜臺(tái)租賃合同書范本
- 2024年私人二手房屋買賣合同附帶維修基金及公共維修合同范本3篇
- 2024年度企業(yè)團(tuán)建活動(dòng)環(huán)保公益活動(dòng)合作合同3篇
- 2025巨方木業(yè)合同管理規(guī)定
- 2024年離岸金融服務(wù)申請(qǐng)盡職調(diào)查合同3篇
- 2024年度土地租賃及配套設(shè)施建設(shè)管理合同范本3篇
- 技術(shù)成熟度評(píng)價(jià)報(bào)告
- HDICT營(yíng)銷工程師認(rèn)證考試題庫(kù)及答案
- 長(zhǎng)沙理工大學(xué)高數(shù)A(一)試卷1新
- 第二十三章旋轉(zhuǎn)復(fù)習(xí)公開(kāi)課一等獎(jiǎng)市優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件
- 唐山市豐潤(rùn)區(qū)七年級(jí)下學(xué)期語(yǔ)文期末考試試卷
- 大學(xué)生心理健康教育高職PPT全套教學(xué)課件
- 合資有限公司章程(設(shè)董事會(huì)設(shè)監(jiān)事會(huì))
- 思想道德與法治知到章節(jié)答案智慧樹2023年韶關(guān)學(xué)院
- 音樂(lè)人音四年級(jí)下冊(cè)(2015年新編)《火車托卡塔》(課件)
- 中國(guó)智能制造產(chǎn)業(yè)發(fā)展報(bào)告
- GB/T 3217-1992永磁(硬磁)材料磁性試驗(yàn)方法
評(píng)論
0/150
提交評(píng)論