第3章 隱含對象_第1頁
第3章 隱含對象_第2頁
第3章 隱含對象_第3頁
第3章 隱含對象_第4頁
第3章 隱含對象_第5頁
已閱讀5頁,還剩98頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章

JSP隱含對象本章主要內(nèi)容out隱含對象HTTP請求與request隱含對象HTTP響應(yīng)與response隱含對象Cookies管理session隱含對象與session跟蹤application隱含對象3.1JSP頁面中的隱含對象在JSP頁面中,經(jīng)常要處理request請求、response響應(yīng)等信息,為了簡化程序設(shè)計,JSP規(guī)范定義了常用的隱含對象,這些隱含對象不需要在JSP頁面中用new關(guān)鍵字來創(chuàng)建,而是由Servlet容器來創(chuàng)建與管理,并傳遞給JSP頁面的Servlet實現(xiàn)類使用。3.1JSP隱含對象變量名主要功能out用于JSP頁面輸出信息request可獲得用戶端請求參數(shù)response發(fā)輸出信息給客戶端session終端用戶與后臺系統(tǒng)交互aplication同一應(yīng)用不同程序間數(shù)據(jù)共享exceptionJSP頁面產(chǎn)生的異常對象config用于傳送和獲取初始化參數(shù)page當(dāng)前JSP頁面所表示的對象pageContext獲取其他的隱含對象及實現(xiàn)跳轉(zhuǎn)3.1JSP隱含對象在JSP頁面Servlet實現(xiàn)類的_jspService()方法內(nèi)部,自動初始化JSP隱含對象的代碼段如下: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隱含對象out對象屬于javax.servlet.jsp.JspWriter類型3.2.1顯示輸出主要方法1、print()和println()print()和println()用于打印輸出信息,前者輸出的信息在返回客戶端的源代碼中不換行,后者輸出的信息在返回客戶端的源代碼中換行。被打印的信息可以是基本數(shù)據(jù)類型(如int、double等),也可以是對象(如字符串等)。

3.2out隱含對象例如,在JSP頁面中有以下代碼:<body><% out.print("123"); out.print("456"); %></body>3.2out隱含對象2、newLine()newLine()表示輸出一個回車換行符,例如:<body><% out.print("123"); out.newLine(); out.print("456"); %></body>3.2out隱含對象3.2.2緩沖區(qū)相關(guān)的方法

1、flush()方法Java中把I/O操作轉(zhuǎn)化為流操作。out.write()輸出的信息暫時存儲在流對象緩沖區(qū)中,flush()刷新操作把緩沖區(qū)中的信息傳遞給目標(biāo)對象處理。如果緩沖區(qū)滿了,這個方法被自動調(diào)用,輸出緩沖區(qū)中的信息。

3.2out隱含對象如果流已經(jīng)關(guān)閉,調(diào)用print()或flush()會引發(fā)一個IOException異常,例如:在Tomcat命令行窗口中顯示“警告:Internalerrorflushingthebufferinrelease()”的異常信息。

<%out.close();out.flush(); %>3.2out隱含對象2、clear()方法clear()表示清除緩沖區(qū)中的信息。如果緩沖區(qū)是空的,執(zhí)行此方法會引發(fā)IOException異常。3、clearBuffer()clearBuffer()的功能與clear()相似,它將輸出緩沖區(qū)清除后返回,與clear()不同的是它不拋出異常。3.2out隱含對象4、getBufferSize()getBufferSize()返回輸出緩沖區(qū)的大小,單位字節(jié),如果沒有緩沖區(qū),則返回0。5、getRemaining()getRemaining()返回緩沖區(qū)剩余的空閑空間,單位字節(jié)。3.2out隱含對象6、isAutoFlush()isAutoFlush()返回一個真假值,用于標(biāo)示緩沖區(qū)是否自動刷新。例:<%out.print("緩沖區(qū)總?cè)萘?"+out.getBufferSize()+"<br>");out.print(“緩沖區(qū)空閑容量="+out.getRemaining()+"<br>");out.print("緩沖區(qū)是否自動刷新="+out.isAutoFlush());%>3.3request隱含對象Request對象封裝了用戶提交的信息,通過調(diào)用該對象相應(yīng)的方法可以獲取封裝的信息。Request所依賴的接口javax.servlet.http.HttpServletRequest3.3.1用request讀取客戶端傳遞來的參數(shù)客戶端傳遞給服務(wù)器的參數(shù)最常見的是表單數(shù)據(jù)或附在URL中的參數(shù)。例http://localhost/exam.jsp?useId=admin中的“useId=admin”為查詢串參數(shù)。

3.3request隱含對象1、用request讀取單值參數(shù)所謂單值參數(shù)是指:一個變量最多有一個值。用request對象的getParameter()方法讀取這些參數(shù)。方法的定義為:方法的形參是參數(shù)的變量名,以String形式返回變量的值。如果request對象中沒有指定的變量,則返回null。

例如下面操作varValue的值為admin。StringvarValue=request.getParameter(useId)

publicStringgetParameter(java.lang.Stringname)3.3request隱含對象參數(shù)變量名硬編碼問題用request.getParameter()讀取表單傳來的參數(shù)時,必須要給出參數(shù)的變量名,參數(shù)變量名是以硬編碼形式嵌在代碼中的,即在程序中參數(shù)變量名是給定的,當(dāng)表單提交數(shù)據(jù)中參數(shù)變量名發(fā)生變化時,需要改變程序。為了提高程序的靈活性,可以利用getParameterNames()方法,該能方法能夠返回request對象中的參數(shù)變量名,從而實現(xiàn)程序中變量的靈活設(shè)置。3.3request隱含對象參數(shù)變量名硬編碼問題<%@pageimport="java.util.*"%><%Enumeratione=request.getParameterNames();//將request對象中的變量名置于集合中

While(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=request.getParameter(varName);//獲取集合中的變量值

out.print(varName+"="+varValue);out.print(“<br>”);}%>3.3request隱含對象【例3-1】制作一個用戶登錄應(yīng)用,用戶在表單中輸入用戶名和密碼后提交給本JSP頁面,讀取并顯示用戶輸入信息。3.3request隱含對象<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隱含對象<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隱含對象亂碼處理在顯示從request對象讀取的中文參數(shù)時可能會出現(xiàn)亂碼。原因是Java在默認(rèn)情況下采用的是Unicode編碼標(biāo)準(zhǔn),一般是UTF-8,而中文的編碼標(biāo)準(zhǔn)通常是GB2312。解決亂碼問題的方法是把UTF-8轉(zhuǎn)換為GB2312簡體中文編碼即可。具體方法是寫一個轉(zhuǎn)換方法,顯示字符串前,把字符串轉(zhuǎn)換成簡體中文后再顯示。JSP程序如下,轉(zhuǎn)換方法為StringtoChinese(Stringstr)。

【例3-2】解決從request對象讀取參數(shù)時顯示中文亂碼問題。3.3request隱含對象<%!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)換成簡體中文后再顯示

if(pw==null||pw.length()==0)pw="口令為空";}%></body>3.3request隱含對象2、用request讀取多值參數(shù)多值參數(shù)的典型代表是表單復(fù)選框,例如上一章會員注冊例子中的“教育程度”同名表單就是多值參數(shù),教育程度選項中的表單變量名均為“education”,用戶可以選定多個教育程度。在服務(wù)器端讀取多值參數(shù),要用到如下方法:String[]request.getParameterValues(Stringname)形參為多值參數(shù)的變量名,多個參數(shù)值返回后存儲在一個字符串?dāng)?shù)組中3.3request隱含對象<%@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隱含對象3.3.2request作用范圍變量服務(wù)器端的兩個JSP/Servlet程序間要交換數(shù)據(jù)時,可通過request作用范圍變量來實現(xiàn)。request作用范圍變量也叫request屬性,是類似于“name=value”的屬性對,由屬性名和屬性值構(gòu)成,屬性值一般是一個Java對象,不是Java基本數(shù)據(jù)類型數(shù)據(jù)。3.3request隱含對象Servlet程序A要把數(shù)據(jù)對象傳遞給Servlet程序B時,程序A通過調(diào)用request.setAttribute()把數(shù)據(jù)對象寫入request作用范圍,并通過request轉(zhuǎn)發(fā)跳轉(zhuǎn)到程序B,程序A的request對象被轉(zhuǎn)發(fā)給程序B,在程序B中通過request.getAttribute()從request作用范圍讀取數(shù)據(jù)對象。3.3request隱含對象屬性值對象本身的生命周期和request對象的生命周期直接相關(guān),在當(dāng)前request隱含對象有效的范圍內(nèi),與之綁定的屬性值對象也是有效的,當(dāng)request對象生命期結(jié)束時,與之綁定的request屬性變量會變成垃圾對象而被回收。3.3request隱含對象在JSP中,除了request作用范圍變量外,還有page、session和application作用范圍變量,它們的基本含義都是把屬性值對象與某個有生命周期的JSP隱含對象相綁定,使屬性值對象有一定的生命周期,或者說使屬性值對象在一定的作用范圍內(nèi)有效。3.3request隱含對象

定義作用范圍變量一般是調(diào)用相應(yīng)JSP隱含對象中的setAttribute()方法,讀取作用范圍變量一般是調(diào)用getAttribute()方法voidsetAttribute(Stringname,Objecto)用于把一個屬性對象按指定的名字寫入request作用范圍ObjectgetAttribute(Stringname)用于從request作用范圍讀出指定名字的屬性對象<%Useru=newUser();request.setAttribute("loginName",u);

Users=(User)request.getAttribute("loginName");out.print(s);%>3.3request隱含對象2、getRequestDispatcher(Stringtarget)兩個Servlet程序間要利用request作用范圍變量來傳遞數(shù)據(jù)時,要用轉(zhuǎn)發(fā)跳轉(zhuǎn)操作實現(xiàn)從第一個Servlet程序A跳轉(zhuǎn)到第二個Servlet程序B。3.3request隱含對象request轉(zhuǎn)發(fā)器(RequestDispatcher)的作用是獲得目標(biāo)資源的轉(zhuǎn)發(fā)器,通過轉(zhuǎn)發(fā)器將當(dāng)前Servlet程序的request和response對象轉(zhuǎn)發(fā)給目標(biāo)資源,并跳轉(zhuǎn)至目標(biāo)資源上運行程序,這樣,目標(biāo)資源就可通過request對象讀取上一資源傳遞給它的request屬性。3.3request隱含對象request.getRequestDispatcher()的作用是返回目標(biāo)資源的RequestDispatcher對象,語法為:形參是當(dāng)前Web應(yīng)用目標(biāo)資源的URI,可以使用相對路徑或絕對路徑。publicRequestDispatchergetRequestDispatcher(java.lang.Stringpath)3.3request隱含對象RequestDispatcher中主要的方法有:publicvoidforward(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException該方法能夠把當(dāng)前Servlet程序的request和response隱含對象轉(zhuǎn)發(fā)給目標(biāo)資源,并跳轉(zhuǎn)至目標(biāo)資源運行代碼。形參是當(dāng)前Servlet程序的request和response隱含對象。3.3request隱含對象publicvoidinclude(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException該方法用于包含目標(biāo)資源。形參是當(dāng)前JSP/Servlet程序的request、response對象。如果目標(biāo)資源是JSP頁面,它會被編譯成Servlet程序后再運行。進(jìn)行包含操作前,允許對當(dāng)前JSP/Servlet程序的response輸出緩沖區(qū)進(jìn)行刷新。3.3request隱含對象【例3-3】利用request作用范圍變量在兩個JSP頁面間傳遞數(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隱含對象3、removeAttribute()此方法的作用是從request作用范圍中刪除指定名字的屬性,它的語法為:形參是屬性名。例如:publicvoidremoveAttribute(Stringname)request.removeAttribute(“name”);3.3request隱含對象3.3.3用request讀取系統(tǒng)信息1、StringgetProtocol()返回request請求使用的協(xié)議及版本號2、StringgetRemoteAddr()返回客戶端或最后一個客戶端代理服務(wù)器的地址3.3request隱含對象3、StringgetRemoteHost()

返回客戶端主機(jī)名或最后一個客戶端代理服務(wù)器的主機(jī)名,如果主機(jī)名讀取失敗,則返回主機(jī)的IP地址。4、StringgetScheme()返回當(dāng)前request對象的構(gòu)造方案,例如http、https和ftp等,不同的構(gòu)造方案有不同的URL構(gòu)造規(guī)則。5、StringgetQueryString()返回URL的查詢字串,即URL中“?”后面的“name=value”對。3.3request隱含對象6、StringgetReuquestURI()返回URL請求中目標(biāo)資源的URI。7、StringgetMethod()返回request請求的提交方式,如:GET、POST等。8、StringgetServletPath()返回調(diào)用Servlet程序的URL請求。9、StringgetRealPath()返回虛擬路徑在服務(wù)器上的真實絕對路徑。3.4response隱含對象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隱含對象response對象中和輸出緩沖區(qū)相關(guān)的方法有:1、publicvoidflushBuffer()throwsjava.io.IOException刷新輸出緩沖區(qū),把信息傳回客戶端。2、publicvoidsetBufferSize(intsize)定義輸出緩沖區(qū)的大小,單位字節(jié)。3、publicbooleanisCommitted()返回緩沖區(qū)中的響應(yīng)信息是否已經(jīng)提交。3.4response隱含對象3.4.2HTTP響應(yīng)報頭設(shè)置服務(wù)器通過HTTP響應(yīng)報頭向客戶端瀏覽器傳送通信信息。JSP服務(wù)器在默認(rèn)情況下,響應(yīng)信息是以字符形式傳送。如果要用HTTP響應(yīng)報頭傳輸二進(jìn)制數(shù)據(jù),應(yīng)該通過response.getOutputStream()獲得一個ServletOutputStream輸出流對象輸出二進(jìn)制信息。

3.4response隱含對象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中定義的類型,瀏覽器會根據(jù)信息類型自動調(diào)用匹配的軟件來處理,或?qū)⑿畔⒘泶鏋橐粋€文件。例:response.setContentType("text/html;charset=gb2312");3.4response隱含對象<%@pageimport="java.io.*"%><%response.setContentType("application/vnd.ms-excel");try{PrintWriterout=response.getWrite();out.println("學(xué)號\t姓名\t平時成績\t考試成績\t期末成績");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("錯誤信息:"+e);}%>用response返回Excel文檔形式的學(xué)生成績表。IE瀏覽器接收到返回的Excel數(shù)據(jù)后,會自動嵌入Excel軟件顯示數(shù)據(jù),如果Excel啟動失敗,瀏覽器提示把接收到的信息另存為磁盤文件。3.4response隱含對象2、publicvoidsetCharacterEncoding(java.lang.Stringcharset)

定義返回客戶端信息的編碼標(biāo)準(zhǔn)。如果已經(jīng)用response.setContentType()定義字符集,則調(diào)用此方法將重新設(shè)置字符集。信息字符集的定義要在緩沖區(qū)刷新前進(jìn)行。3.4response隱含對象3、publicvoidsendError(intsc)throwsjava.io.IOException向客戶端返回HTTP響應(yīng)碼,并清空輸出緩沖區(qū)。HTTP響應(yīng)碼由三位的十進(jìn)制數(shù)構(gòu)成:1xx:請求收到,繼續(xù)處理。2xx:成功,行為被成功地接受、理解和接受。3xx:重定向,為了完成請求,必須進(jìn)一步執(zhí)行的動作。4xx:客戶端錯誤。5xx:服務(wù)器出錯。3.4response隱含對象例如在IE瀏覽器地址欄中輸入::8080/aabb.jsp,企圖訪問Tomcat服務(wù)器中不存在的資源aabb.jsp,則Tomcat會給客戶端返回一個HTTP響應(yīng)碼404,在IE瀏覽器上顯示HTTP響應(yīng)碼及錯誤信息。3.4response隱含對象如果要人為地返回HTTP響應(yīng)碼,則調(diào)用sendError(intsc)方法,如:<body><%out.print(“返回一個404響應(yīng)碼”);response.sendError(404);%></body>

預(yù)覽后,在IE瀏覽器中顯示404狀態(tài)碼信息。3.4response隱含對象4、publicvoidsetHeader(java.lang.Stringname,java.lang.Stringvalue)第一個形參為報頭名,第二個形參是報頭值。HTTP報頭中有一個名為“Refresh”的響應(yīng)報頭,它的作用是使IE瀏覽器在若干秒后自動刷新當(dāng)前網(wǎng)頁或跳轉(zhuǎn)至指定的URL資源。3.4response隱含對象這個報頭的語法為:

Response.setHeader("Refresh","定時秒數(shù)",url=目標(biāo)資源的URL)方法的第一個形參是響應(yīng)報頭名"Refresh",第二個形參由兩部分組成:第一部分定義秒數(shù),即:若干秒后自動刷新,第二部分為目標(biāo)資源的URL,缺少時默認(rèn)刷新當(dāng)前頁。3.4response隱含對象<%!Staticintnumber=0;%><body><%number=number+1;out.print("number="+number);response.setHeader("Refresh","2");%></body>3.4response隱含對象3.4.3用response實現(xiàn)JSP頁面重定向重定向是JSP中實現(xiàn)JSP/Servlet程序跳轉(zhuǎn)至目標(biāo)資源的方法之一。它的基本思想是:服務(wù)器將目標(biāo)資源完整的URL通過HTTP響應(yīng)報頭發(fā)送給客戶端瀏覽器,瀏覽器接收到URL后更新至地址欄中,并將目標(biāo)資源的URL提交給服務(wù)器。重定向使目標(biāo)資源的URL從服務(wù)器傳到客戶端瀏覽器,再從客戶端通過HTTP請求傳回服務(wù)器,其中有一定的網(wǎng)絡(luò)時延。

3.4response隱含對象實現(xiàn)JSP頁面跳轉(zhuǎn)的主要方法有轉(zhuǎn)發(fā)跳轉(zhuǎn)(forward)和重定向跳轉(zhuǎn)(redirect),RequestDispatcher.forward()實現(xiàn)的是轉(zhuǎn)發(fā)跳轉(zhuǎn),response.sendRedirect()實現(xiàn)的是重定向跳轉(zhuǎn)。兩者的最大區(qū)別在于:1、重定向是通過客戶端重新發(fā)送URL來實現(xiàn),會導(dǎo)致瀏覽器地址更新,而轉(zhuǎn)發(fā)是直接在服務(wù)器端切換程序,目標(biāo)資源的URL不出現(xiàn)在瀏覽器的地址欄中;3.4response隱含對象2、轉(zhuǎn)發(fā)能夠把當(dāng)前JSP頁面中的request、response對象轉(zhuǎn)發(fā)給目標(biāo)資源,而重定向會導(dǎo)致當(dāng)前JSP頁面的request、response對象生命期結(jié)束,在目標(biāo)資源中無法取得上一個JSP頁面的request對象;3、轉(zhuǎn)發(fā)跳轉(zhuǎn)直接在服務(wù)器端進(jìn)行,基本上沒有網(wǎng)絡(luò)傳輸時延,重定向有網(wǎng)絡(luò)傳輸時延。3.4response隱含對象如果要實現(xiàn)服務(wù)器中兩個Servlet程序間跳轉(zhuǎn),并且要使用request作用范圍變量交換數(shù)據(jù),應(yīng)該優(yōu)先使用request轉(zhuǎn)發(fā)跳轉(zhuǎn)。用重定向?qū)崿F(xiàn)程序跳轉(zhuǎn)時,如果要求傳遞數(shù)據(jù)給目標(biāo)資源,一個簡單、可行的方法是把數(shù)據(jù)編碼在URL查詢串中。例如::8080/exam.jsp?name=tom3.4response隱含對象用response實現(xiàn)重定向,要調(diào)用的方法為:形參是目標(biāo)資源的URL,可以是相對路徑或絕對路徑。例如:<%response.sendRedirect(“:8080/exam.jsp?name=tom”);%>publicvoidsendRedirect(Stringlocation)throwsjava.io.IOException3.4response隱含對象3.4.4用response實現(xiàn)文件下載在JSP中實現(xiàn)文件下載最簡單的方法是定義超鏈接指向目標(biāo)資源,用戶單擊超鏈接后直接下載資源,但直接暴露資源的URL也會帶來一些負(fù)面的影響,例如容易被其它網(wǎng)站盜鏈,造成本地服務(wù)器下載負(fù)載過重。3.4response隱含對象另外一種下載文件的方法是使用文件輸出流實現(xiàn)下載,首先通過response報頭告知客戶端瀏覽器,將接收到的信息另存為一個文件,然后用輸出流對象給客戶端傳輸文件數(shù)據(jù),瀏覽器接收數(shù)據(jù)完畢后將數(shù)據(jù)另存為文件。使用文件輸出流下載方法的優(yōu)點是服務(wù)器端資源路徑的保密性好,并可控制下載的流量以及日志登記等。3.4response隱含對象二進(jìn)制文件的下載首先將源文件封裝成字節(jié)輸入流對象,通過該對象讀取文件數(shù)據(jù),獲取response對象的字節(jié)輸出流對象,通過輸出流對象將二進(jìn)制的字節(jié)數(shù)據(jù)傳送給客戶端。把源文件封裝成字節(jié)輸入流對象將源文件封裝成字節(jié)輸入流,用JDK中的java.io.FileInputStream類,例如:

FileInputStreaminFile=newFileInputStream(“c:\\temp\\my1.exe”);從輸入流中讀取一定數(shù)量的字節(jié)數(shù)據(jù)并將其緩存在數(shù)組b中。publicintread(byte[]b)throwsIOException方法返回值是實際讀取到的字節(jié)數(shù)。如果檢測到文件尾,返回-1。3.4response隱含對象讀取二進(jìn)制字節(jié)數(shù)據(jù)并傳輸給客戶端response對象的getOutputStream()方法可返回一個字節(jié)輸出流對象ServletOutputStreamServletOutputStream中輸出二進(jìn)制字節(jié)數(shù)據(jù)的方法write(byte[]b)將數(shù)組中的b.length個字節(jié)寫入輸出流。例如:ServletOutputStreammyOut=response.getOutputStream();3.4response隱含對象【例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");

//重定向到出錯頁面}finally{if(in!=null)in.close();if(out!=null)out.close();}%>3.4response隱含對象文本文件的下載文本文件下載時用的是字符流,而不是字節(jié)流。首先取得源文件的字符輸入流對象,用java.io.FileReader類封裝,再把FileReader對象封裝為java.io.BufferedReader,以方便從文本文件中一次讀取一行。字符輸出流直接用JSP的隱含對象out,out能夠輸出字符數(shù)據(jù)。用到FileReader類的方法有FileReader(StringfileName),該構(gòu)造方法取得文件的字符輸入流對象,形參fileName是文件的路徑和文件名,路徑分隔符用“//”或“\\”。如果打開文件出錯,會引發(fā)一個異常。用到BufferedReader的方法有BufferedReader(Readerin)和readLine(),前者為構(gòu)造方法,后者從文本文件中一次讀取一行。3.4response隱含對象【例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");//重定向到出錯頁面}finally{if(in2!=null)in2.close();}%>3.5cookie管理Cookie機(jī)制Cookie或稱Cookies,在Web技術(shù)中指Web服務(wù)器暫存在客戶端瀏覽器內(nèi)存或硬盤文件中的少量數(shù)據(jù)。Web服務(wù)器通過HTTP報頭來獲得客戶端中的cookie信息。由于HTTP是無態(tài)的,無法記錄用戶的在線狀態(tài)信息,利用cookie可以解決這個問題,把待存儲的信息封裝在cookie對象中并傳回客戶端保存,需要時再從客戶端讀取。3.5cookie管理Cookie機(jī)制如果不設(shè)置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內(nèi)存里。如果設(shè)置了過期時間,瀏覽器就會把cookie保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie仍然有效,直到超過設(shè)定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個IE窗口。Cookie信息的基本結(jié)構(gòu)類似于“name=value”對,每個數(shù)據(jù)有一個變量名。3.5cookie管理WindowsXP中,有一個“C:\DocumentsandSettings\admin\Cookies”文件夾,文件夾中存儲有曾經(jīng)訪問過的網(wǎng)站的cookie文件。在此文件夾中,類似于“admin@127.0.0[1].txt”的文件中會看到被保存的cookie數(shù)據(jù)。3.5cookie管理在JSP中使用cookie的基本過程為:在服務(wù)器端生成cookie對象,把待保存信息寫入cookie對象中;必要時設(shè)置cookie對象的生命期;把cookie對象傳給客戶端瀏覽器保存;服務(wù)器端程序需要cookie信息時,用代碼讀取cookie信息。3.5cookie管理Cookie類javax.servlet.http.Cookie類用來生成一個cookie對象,這個類中常用的方法有:構(gòu)造方法的語法為Cookie(java.lang.Stringname,java.lang.Stringvalue)第一個形參是cookie數(shù)據(jù)的變量名,第二個形參是待保存的數(shù)據(jù),字符串類型。3.5cookie管理publicvoidsetMaxAge(intexpiry)這個方法定義cookie對象的生命期,形參是生命時間數(shù),單位秒。如果生命周期為負(fù)整數(shù),表示這個cookie對象是臨時的,不要保存在硬盤文件中,關(guān)閉IE瀏覽器后cookie數(shù)據(jù)自動丟失。如果生命期為零,表示刪除這個cookie。默認(rèn)值為-1。Cookie的生命期定義要在cookie對象傳回客戶端前進(jìn)行。publicintgetMaxAge()用publicintgetMaxAge()方法可讀取cookie對象的生命周期時間。3.5cookie管理publicvoidsetSecure(booleanflag)形參取值true時,表示用https或SSL安全協(xié)議將cookie傳回服務(wù)器;取false時表示用當(dāng)前默認(rèn)的協(xié)議傳回cookie。publicjava.lang.StringgetName()返回當(dāng)前cookie對象的變量名。publicjava.lang.StringgetValue()返回當(dāng)前cookie對象的值。3.5cookie管理將cookie對象傳回客戶端將cookie對象傳回客戶端,要用到JSP隱含對象response,用到的方法為:publicvoidaddCookie(Cookiecookie)形參是待保存的cookie對象。例如<%Cookiemsg=newCookie("login","tom");msg.setMaxAge(60*60*60*60);response.addCookie(msg);%>3.5cookie管理讀取cookie對象讀取客戶端存儲的cookie,用request對象的getCookies()方法,它的語法為:

publicCookie[]getCookies()返回的是一個cookie對象數(shù)組,當(dāng)前瀏覽器中所有有效的cookie會通過HTTP請求報頭返回給服務(wù)器,每個數(shù)組分量是一個返回的cookie對象。如果客戶端沒有有效的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(“沒有返回cookie”);%>3.5cookie管理【例3-6】定義一個cookie對象,存儲用戶的登錄名,生命期為30天。在另一個頁面中查詢這個cookie,如果讀取的cookie不為空,則顯示用戶登錄名,否則顯示“沒有登錄”信息。再定義一個cookie對象,記錄客戶最近瀏覽過的五本圖書的書號:AB001、KC981、DE345、RD332和PC667,如果已經(jīng)登錄,則顯示書號,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)頁上顯示信息“成功將用戶名、書目cookie傳回客戶端,有效期30天”。3.5cookie管理<body><% StringmyName=null; StringvisitedBook=null;Cookiec[]=request.getCookies(); if(c==null){out.print("沒有返回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("您最近瀏覽過的圖書書號是:"+visitedBook);}else out.print("您沒有登錄");}%></body>

3.5cookie管理預(yù)覽執(zhí)行結(jié)果頁面,瀏覽器中顯示的信息為:您已經(jīng)登錄,用戶名=John

您最近瀏覽過的圖書書號是:AB001,KC981,DE345,RD332,PC6673.7application隱含對象一個Web服務(wù)器通常有多個Web服務(wù)目錄(網(wǎng)站),當(dāng)Web服務(wù)器啟動時,它自動為每個Web服務(wù)目錄都創(chuàng)建一個application對象,這些application對象各自獨立,而且和Web服務(wù)目錄一一對應(yīng)。訪問同一個網(wǎng)站的客戶都共享一個application對象。具體來說:不管哪個客戶來訪問網(wǎng)站A,也不管客戶訪問網(wǎng)站A下哪個頁面文件,都可以對網(wǎng)站A的application對象進(jìn)行操作。因此,當(dāng)在application對象中存儲數(shù)據(jù)后,所有訪問網(wǎng)站A的客戶都能夠?qū)ζ溥M(jìn)行訪問,實現(xiàn)了多個客戶之間的數(shù)據(jù)共享。訪問不同網(wǎng)站的客戶,對應(yīng)的application對象不同。與out、request、response只作用于當(dāng)前頁不同,application對象的有效范圍是當(dāng)前應(yīng)用,即在同一應(yīng)用程序中,只要應(yīng)用服務(wù)器不關(guān)閉,這個對象就一直有效。3.7application隱含對象application作用范圍變量(屬性)

application作用范圍變量也叫application屬性,是類似于“name=value”的屬性對,由屬性名和屬性值構(gòu)成,屬性值一般是一個Java對象,不是Java基本數(shù)據(jù)類型數(shù)據(jù)。application屬性能夠被Web應(yīng)用中的所有程序共享。3.7application隱含對象application對象和session對象的比較兩者的作用范圍不同session對象是用戶級的對象,而application對象是應(yīng)用程序級的對象。一個用戶一個session對象,每個用戶的session對象不同,在用戶所訪問網(wǎng)站的多個頁面之間共享同一個session對象。一個Web應(yīng)用程序一個application對象,每個Web應(yīng)用程序的application對象不同,但一個Web應(yīng)用程序的多個用戶之間共享同一個application對象。在同一個網(wǎng)站下,每個用戶的session對象不同,所用用戶的application對象相同。在不同網(wǎng)站下,每個用戶的session對象不同,每個用戶的application對象不同。兩者的生命周期不同session對象的生命周期是用戶首次訪問網(wǎng)站創(chuàng)建,用戶離開該網(wǎng)站(不一定要關(guān)閉瀏覽器)消亡。application對象的生命周期是啟動Web服務(wù)器創(chuàng)建,關(guān)閉Web服務(wù)器銷毀。3.7application隱含對象1、publicjava.util.EnumerationgetAttributeNames()返回當(dāng)前上下文中所有可用的appliaction作用范圍變量名,并存儲在枚舉型對象中。2、publicjava.lang.ObjectgetAttribute(java.lang.Stringname)從application作用范圍中讀取指定名字的屬性值,返回的屬性值是Object類型,一般要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,還原其原本數(shù)據(jù)類型。如果指定的屬性值對象不存在,則返回null。3.7application隱含對象以下代碼段是遍歷當(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隱含對象3、publicvoidsetAttribute(Stringname,Objectobject)把一個屬性寫入application作用范圍。第一個形參name是屬性名,第二個形參object是屬性值,它是一個Java對象。如果屬性值object為null,則相當(dāng)于刪除一個屬性名為name的屬性。如果容器中已經(jīng)存在指定名字的屬性,寫入操作會用當(dāng)前的屬性值替換原有的屬性值。4、publicvoidremoveAttribute(java.lang.Stringname)從Servlet容器中刪除指定名字的屬性。形參是屬性名,字符串形式。3.5application隱含對象4、publicvoidremoveAttribute(java.lang.Stringname)從Servlet容器中刪除指定名字的屬性。形參是屬性名,字符串形式。3.7application隱含對象【例3.7】用application實現(xiàn)一個站點計數(shù)器。具體要求是當(dāng)訪問JSP頁面時,頁面進(jìn)行訪問次數(shù)統(tǒng)計,并輸出當(dāng)前計數(shù)值。用request.getRemoteAddr()來獲取用戶的IP地址,將訪問過的用戶IP地址作為application屬性保存,只有新的IP地址才進(jìn)行計數(shù)。3.7application隱含對象<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)訪問過本站");}}<%</body>3.6session隱含對象

HTTP協(xié)議是一種無狀態(tài)協(xié)議,一次請求和響應(yīng)客戶端與服務(wù)器端的連接就會關(guān)閉,服務(wù)器并不保存相關(guān)的信息,再次交換數(shù)據(jù)需要建立新的連接。而通常一個Web應(yīng)用是由多個web頁面組成的一個完整的頁面訪問鏈條。一個用戶對一個Web應(yīng)用包含的多個web頁面的訪問過程稱為一個會話。保存和跟蹤一個會話過程的各頁面信息并實現(xiàn)共享是十分重要的。session對象是JSP技術(shù)是為解決會話問題而專門提供的一種解決方案。下面的討論中會話和session對象的概念會交替出現(xiàn),要注意區(qū)分它們。3.6session隱含對象session生命期及跟蹤方法通常把從用戶登錄進(jìn)入系統(tǒng)到注銷退出系統(tǒng)所經(jīng)歷的時間,稱為一個session生命周期。生命期結(jié)束,則session對象被刪除,與之綁定的session屬性也隨之丟失。影響session對象生命期的主要因素有:客戶端瀏覽器窗口關(guān)閉,服務(wù)器關(guān)閉,session超時,程序主動結(jié)束session。要跟蹤該會話,必須引入一種機(jī)制,就是如何把一個操作步中產(chǎn)生的有用信息保存下來,供后續(xù)的操作步使用,以及如何標(biāo)識當(dāng)前session通信等,這些問題稱之為session跟蹤問題。實現(xiàn)session跟蹤有多種方法,通過session隱含對象屬性設(shè)置是實現(xiàn)session跟蹤最直接和簡捷的方法。3.6session隱含對象用URL重寫實現(xiàn)session跟蹤URL重寫(URLRewriting)就是把session數(shù)據(jù)編碼成“name=value”對,當(dāng)作URL的查詢串附在URL后,用帶有查詢串的URL訪問下一個目標(biāo)資源時,附在URL查詢串中的session數(shù)據(jù)自然被傳送給下一頁。用cookie實現(xiàn)session跟蹤用cookie實現(xiàn)session跟蹤的基本原理是:把一個session數(shù)據(jù)封裝在一個cookie對象中,將cookie對象傳回客戶端存儲,需要用到時用代碼從客戶端讀取。用隱藏表單域?qū)崿F(xiàn)session跟蹤隱藏表單域在頁面上不可視,它相當(dāng)于一個變量,如果把一個session數(shù)據(jù)存儲在其中,則提交表單時,隱藏表單域中的數(shù)據(jù)也會被提交給服務(wù)器。3.6session隱含對象session對象和cookie對象的比較

sessionid當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session的時候,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個sessionid;如果客戶端請求不包含sessionid,則為此客戶端創(chuàng)建一個session并且生成一個與此session相關(guān)聯(lián)的sessionid,sessionid的值應(yīng)該是唯一的,這個sessionid將被在本次響應(yīng)中返回給客戶端保存;如果已包含一個sessionid則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照sessionid把這個session檢索出來使用。3.6session隱含對象session對象和cookie對象的比較

cookie機(jī)制和session機(jī)制異同cookie機(jī)制和session機(jī)制是保存客戶端與服務(wù)器端連接狀態(tài)的兩種解決方案。具體來說cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。同時我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個標(biāo)識,保存這個sessionid的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)送給服務(wù)器。3.6session隱含對象session對象主要方法

1、publicbooleanisNew()判斷session對象是新創(chuàng)建的,還是已經(jīng)存在。返回true時,表示session對象是剛創(chuàng)建的,也表示本次客戶端發(fā)出的請求是本次session通信的第一次請求。這個方法返回true,并不表示客戶端瀏覽器窗口是新打開的。2、publicjava.lang.StringgetId()返回當(dāng)前session對象的ID號。3.6session隱含對象3、publiclonggetLastAccessedTime()返回客戶端最后一次請求的發(fā)送時間,是一個long型的整數(shù),單位毫秒,是從格林威治時間1970-1-100:00:00到當(dāng)前所經(jīng)歷的毫秒數(shù)。例如,以下代碼可以取得session通信中最后一次請求時間并將毫秒時間格式轉(zhuǎn)換為年月日時分秒(Calendar)格式。longa=session.getLastAccessedTime();Calendartime=Calendar.getInstance();time.setTimeInMillis(a);3.6session隱含對象4、publicvoidsetMaxInactiveInterval(intinterval)形參是一個整數(shù),定義session對象的超時時間,單位秒。如果客戶端從最后一次請求開始,在連續(xù)的interval秒內(nèi)一直沒有再向服務(wù)器發(fā)送HTTP請求,則服務(wù)器認(rèn)為出現(xiàn)了session超時,將刪除本次的session對象。如果超時時間為負(fù)數(shù),表示永不超時。session對象的超時檢測由服務(wù)器實現(xiàn),這會增加系統(tǒng)開銷。Tomcat默認(rèn)的超時時間是30分鐘。3.6session隱含對象5、publicintgetMaxInactiveInterval()讀取當(dāng)前的session超時時間,單位秒。6、publicvoidinvalidate()使當(dāng)前session無效,session作用范圍變量也會隨之丟失。3.6session隱含對象session隱含對象屬性的相關(guān)方法為:7、publicvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)定義session作用范圍變量,第一個形參name是session作用范圍變量名,第二個形參value是session屬性。如果value為null,則表示取消session屬性和session的綁定關(guān)系。

8、publicjava.lang.ObjectgetAttribute(

溫馨提示

  • 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

提交評論