《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第9章_第1頁(yè)
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第9章_第2頁(yè)
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第9章_第3頁(yè)
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第9章_第4頁(yè)
《Web網(wǎng)站設(shè)計(jì)與開發(fā)教程》課件第9章_第5頁(yè)
已閱讀5頁(yè),還剩123頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章JSP內(nèi)置對(duì)象9.1out對(duì)象 9.2request對(duì)象9.3response對(duì)象9.4session對(duì)象9.5application對(duì)象9.6exception對(duì)象9.7其他內(nèi)置對(duì)象

【學(xué)習(xí)提示】JSP除了運(yùn)用基本語(yǔ)法和基本技術(shù)在HTML中插入Java代碼并實(shí)現(xiàn)特定的動(dòng)作之外,如何動(dòng)態(tài)響應(yīng)客戶端的請(qǐng)求?JSP中包含了9個(gè)內(nèi)置對(duì)象可以用于獲取客戶端的請(qǐng)求,向客戶端發(fā)送響應(yīng)以及記錄與客戶端的對(duì)話等。在本章將詳細(xì)介紹每個(gè)內(nèi)置對(duì)象的屬性、方法和使用實(shí)例。內(nèi)置對(duì)象不需要聲明。可以直接在JSP中使用的對(duì)象是ServletAPI接口的實(shí)例,由JSP規(guī)范對(duì)其進(jìn)行了默認(rèn)初始化。即JSP引擎將JSP頁(yè)面編譯成Servlet時(shí)會(huì)調(diào)用_jspServlet()方法創(chuàng)建這些實(shí)例,具體創(chuàng)建過程可以參見下面的代碼段。

publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)

throwsjava.io.IOException,ServletException{

PageContextpageContext=null;

HttpSessionsession=null;

ServletContextapplication=null;

ServletConfigconfig=null;

JspWriterout=null;

Objectpage=this;

JspWriter_jspx_out=null;

PageContext_jspx_page_context=null;

try{

response.setContentType("text/html;charset=UTF-8");

pageContext=_jspxFactory.getPageContext(this,request,response,

null,true,8192,true);

_jspx_page_context=pageContext;

application=pageContext.getServletContext();

config=pageContext.getServletConfig();

session=pageContext.getSession();

out=pageContext.getOut();

_jspx_out=out;

}

}

內(nèi)置對(duì)象具有以下特點(diǎn):

(1)由JSP規(guī)范提供,不用編寫者實(shí)例化。

(2)通過Web容器實(shí)現(xiàn)和管理。

(3)所有JSP頁(yè)面均可使用。

(4)只有在腳本元素的表達(dá)式或代碼段中才可使用(<%=使用內(nèi)置對(duì)象%>或<%使用內(nèi)置對(duì)象%>)。

目前JSP一共包含九個(gè)內(nèi)置對(duì)象,其對(duì)象名稱和功能描述如表9-1所示。表9-1JSP內(nèi)置對(duì)象列表根據(jù)內(nèi)置對(duì)象的作用可以分成如下四類:

第一類:與Servlet有關(guān),如page和config。

第二類:與Input/Output有關(guān),如out,request和response。

第三類:與Context有關(guān),如application,session和pageContext。

第四類:與Error有關(guān),如exception。

JSP提供了四種不同時(shí)長(zhǎng)的作用域:page、request、session和application。下面分別對(duì)其具體有效期進(jìn)行說明:

●page:只在當(dāng)前頁(yè)面有效?!駌equest:在一次請(qǐng)求范圍內(nèi)有效。所謂請(qǐng)求周期,就是指從http請(qǐng)求發(fā)起到服務(wù)器處理結(jié)束,并返回響應(yīng)的整個(gè)過程。如果頁(yè)面從一個(gè)頁(yè)面跳轉(zhuǎn)到另一個(gè)頁(yè)面,那么就會(huì)生成一個(gè)新的request對(duì)象。這里所指的跳轉(zhuǎn)是指客戶端跳轉(zhuǎn),比如客戶單擊超鏈接跳轉(zhuǎn)到其他頁(yè)面或者通過瀏覽器地址欄瀏覽其他頁(yè)面。如果使用服務(wù)器端跳轉(zhuǎn)<jsp:forward>,則仍屬于同一個(gè)request。

●session:指客戶瀏覽器在一次會(huì)話范圍內(nèi),如果與服務(wù)器連接斷開,那么session就結(jié)束?!馻pplication:有效范圍是整個(gè)應(yīng)用,即從應(yīng)用啟動(dòng)到應(yīng)用結(jié)束。在application對(duì)象中設(shè)置的屬性只要應(yīng)用不結(jié)束,就能在任意頁(yè)面中獲取,就算重新打開瀏覽器也是可以獲取屬性的,而且這些屬性被所有用戶共用。

out對(duì)象表示一個(gè)頁(yè)面輸出流。out對(duì)象發(fā)送的內(nèi)容是瀏覽器需要顯示的內(nèi)容,可以在頁(yè)面上輸出變量值及常量,是文本一級(jí)的。開發(fā)者通常使用out.print()和out.println()這兩個(gè)方法把結(jié)果輸出到網(wǎng)頁(yè)上。out對(duì)象提供的方法如表9-2所示。9.1out對(duì)象表9-2out對(duì)象常用方法

out對(duì)象的用法示例(out_test.jsp)的代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<%@pagebuffer="2kb"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>out對(duì)象示例</title>

</head>

<body>

<h3>out對(duì)象常用方法示例</h3>

<hr>

<%

for(inti=0;i<10;i++)

out.println(i+"{剩余"+out.getRemaining()+"字節(jié)}<br>");

%>

緩存大?。?lt;%=out.getBufferSize()+"字節(jié)<br>"%>

剩余緩存大小:<%=out.getRemaining()+"字節(jié)<br>"%>自動(dòng)刷新:<%=out.isAutoFlush()%>

</body>

</html>

out_test.jsp的運(yùn)行結(jié)果如圖9-1所示。

圖9-1out對(duì)象的用法示例

request對(duì)象是JSP中最常用的對(duì)象之一,它封裝了由客戶端生成的HTTP請(qǐng)求的所有內(nèi)容,包括請(qǐng)求參數(shù)、屬性、請(qǐng)求頭信息、cookies及數(shù)據(jù)。通過調(diào)用request對(duì)象的相應(yīng)方法可以獲取具體的參數(shù)值。另外,還可以在request的生命周期內(nèi)設(shè)置額外的屬性。request對(duì)象的常用方法如表9-3所示。9.2request對(duì)象表9-3request對(duì)象的常用方法9.2.1getParameter方法示例

在表9-3列出的方法中,使用頻率最高的是getParameter(Stringstr1)方法,用來獲取用戶通過表單提交到服務(wù)器的參數(shù)值。下面的例子(request_param.jsp)獲取用戶通過user_info.html提交的參數(shù)值,并顯示在客戶端的瀏覽器上。user_info.html的具體代碼如下:

<html>

<head>

<title>用戶信息</title>

</head>

<body>

<h2>用戶個(gè)人信息填寫</h2>

<hr>

<formname="user-info"action="request_param.jsp"method="post">

<!--從上一行代碼可知單擊表單user-info的

"提交"

按鈕,以post方式向request_param.jsp提交信息-->姓名:<inputtype="text"size="10"name="name">

<p>

性別:男<inputtype="radio"value="male"name="sex"checked="checked"> 女<inputtype="radio"value="female"name="sex">

</p>

<p>

年齡:<inputtype="text"size="5"name="age">

</p>個(gè)人愛好:<selectname="hobbies"><optionselectedvalue="音樂">音樂</option><optionvalue="繪畫">繪畫</option><optionvalue="運(yùn)動(dòng)">體育</option><optionvalue="讀書">讀書</option></select>

<p>

</p>

<inputtype="submit"value="提交"name="submit"> <inputtype="reset"value="重置"name="reset">

</form>

</body>

</html>

user_info.html的運(yùn)行結(jié)果如圖9-2所示,在頁(yè)面上輸入相關(guān)個(gè)人信息,點(diǎn)擊“提交”按鈕,根據(jù)表單“user-info”的action屬性可知頁(yè)面將跳轉(zhuǎn)到request_param.jsp,運(yùn)行結(jié)果如圖9-3所示。

圖9-2user_info.html的運(yùn)行結(jié)果

圖9-3request_param.jsp的運(yùn)行結(jié)果

request_param.jsp的代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>request對(duì)象示例</title>

</head>

<body>

<%request.setCharacterEncoding("UTF-8");%>

<h3>收集用戶信息如下:

</h3>

<br>

您的姓名是:<%=request.getParameter("name")%>

<!--上一行代碼采用request.getParameter()方法獲取表單user-info中名字為"name"的文本框中用戶輸入的信息,數(shù)據(jù)類型為String-->

<br>您的性別是:<%=request.getParameter("sex")%>

<br>

您的年齡是:<%=request.getParameter("age")%>

<br>

您的個(gè)人愛好是:<%=request.getParameter("hobbies")%>

<!--上一行代碼采用request.getParameter()方法獲取表單user-info中名字為"hobbies"的下拉列表菜單中用戶所選項(xiàng)的value值-->

<br>

</body>

</html>

request對(duì)象的getParameter(Stringstr)方法輸入的參數(shù)必須為字符串(String)類型,而且返回值也是String類型。因此,要想對(duì)由getParameter方法獲取的進(jìn)行運(yùn)算等操作時(shí),要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。9.2.2解決request中文亂碼問題

由于getParameter方法獲取的參數(shù)值默認(rèn)是按照ISO-8859-1的方式進(jìn)行編碼的,此種編碼方式不能正常顯示中文,就會(huì)在瀏覽器上呈現(xiàn)亂碼。解決request的中文亂碼問題,常用方法有兩種。第一種,在第一次使用request.getParameter()之前采用setCharacterEncoding

(charset)設(shè)置,可以正常顯示中文的編碼方式(gb2312、utf-8、gbk)。但是setCharacterEncoding

(charset)方法只對(duì)HTTP消息體中的數(shù)據(jù)起作用,對(duì)于URL字段中的參數(shù)不起作用。所以,當(dāng)表單的method屬性取值為get時(shí),依然會(huì)出現(xiàn)中文亂碼問題。第二種,先使用getBytes方法將getParameter獲取的字符串轉(zhuǎn)換成字節(jié)數(shù)組,然后再按照UTF-8等編碼方式重新生成字符串。這種方法對(duì)于表單的兩種提交方式get和post均適用,具體代碼如下:

<%

Stringname=request.getParameter("name");

Stringnew_name=newString(name.getBytes("ISO-8859-1"),"UTF-8");

%>9.2.3request范圍內(nèi)的屬性設(shè)置與獲取

在request對(duì)象的生命周期內(nèi),即一次請(qǐng)求中,可以通過setAttribute方法設(shè)置屬性名和對(duì)應(yīng)的屬性值。也可用getAttribute方法讀取屬性值。這兩個(gè)方法一般和forward動(dòng)作結(jié)合使用。下面的例子request_attribute.jsp為request對(duì)象添加了屬性info,跳轉(zhuǎn)到頁(yè)面get_attribute.jsp獲取屬性值,并將其顯示在頁(yè)面上,具體代碼如下:

request_attribute.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>request的setAttribute方法</title>

</head>

<body>

本頁(yè)采用request對(duì)象設(shè)置屬性info

<%request.setAttribute("info","網(wǎng)站設(shè)計(jì)與開發(fā)");%>

<!--上一行代碼為request對(duì)象設(shè)置屬性info,及其值-->

<jsp:forwardpage="get_Attribute.jsp"/>

<!--上一行代碼會(huì)將頁(yè)面跳轉(zhuǎn)到get_Attribute.jsp-->

</body>

</html>

get_attribute.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>request對(duì)象的getAttribute方法</title>

</head>

<body>

request對(duì)象中添加的屬性info的值為:

<%=request.getAttribute("info")%>

<!--上一行代碼獲取reqeust對(duì)象的屬性info的值-->

</body>

</html>

request_attribute.jsp的運(yùn)行結(jié)果如圖9-4所示。從圖中可以看出雖然網(wǎng)頁(yè)發(fā)生了跳轉(zhuǎn),但是URL地址沒有發(fā)生變化,所以兩個(gè)頁(yè)面都屬于一次請(qǐng)求,可以讀取添加的屬性值。如果URL地址發(fā)生改變,則會(huì)生成新的request對(duì)象,就無法讀取前一個(gè)頁(yè)面為request對(duì)象添加的屬性值。

圖9-4request對(duì)象的屬性設(shè)置與獲取示例9.2.4request執(zhí)行forward或include動(dòng)作

request對(duì)象還有一個(gè)功能就是執(zhí)行forward和include動(dòng)作,替代原有的動(dòng)作標(biāo)簽。HttpServletRequest類提供了一個(gè)getRequestDipacher(Stringpath)方法,其中path就是要跳轉(zhuǎn)或包含的目標(biāo)路徑,該方法返回RequestDisPatcher,該對(duì)象提供了如下兩個(gè)方法:

forward(ServletRequestrequest,ServletResponseresponse):執(zhí)行forward動(dòng)作。

include(ServletRequestrequest,ServletResponseresponse):執(zhí)行include動(dòng)作。具體示例如下:

getRequestDispatcher("/test.jsp").include(request,response);

getRequestDispatcher("/test.jsp").forward(request,response);

response對(duì)象是服務(wù)器對(duì)客戶端請(qǐng)求的響應(yīng),但在JSP中很少直接用它來響應(yīng)客戶端的請(qǐng)求,一般用out對(duì)象直接輸出對(duì)客戶的響應(yīng)信息。由于out對(duì)象只能輸出字符內(nèi)容,當(dāng)需要輸出非字符內(nèi)容(如:動(dòng)態(tài)生成圖片,PDF文檔)時(shí),則必須使用response作為響應(yīng)輸出。此外,response對(duì)象還可以重定向請(qǐng)求,以及向客戶端增加Cookie。

response對(duì)象的常用方法見表9-4。9.3response對(duì)象表9-4response對(duì)象常用方法9.3.1setContentType方法

當(dāng)要向客戶端輸出非字符響應(yīng)時(shí),可以采用response對(duì)象,并設(shè)置contentType的MIME類型。常用的MIME類型如下:

text/html:HTML超文本文件,后綴為“.html”。

text/plain:plain文本文件,后綴為“.txt”。

application/msword:word文檔文件,后綴為“.doc”。

application/x-msexcel:excel表格文件,后綴為“.xls”。

image/jpeg:jpeg圖像,后綴為“.jpeg”。

image/gif:gif圖像,后綴為“.gif”。下面是一個(gè)txt文檔,可以采用excel打開該文檔,顯示效果如圖9-5所示。

test.txt文檔內(nèi)容如下:

英語(yǔ)數(shù)學(xué)語(yǔ)文物理<BR>

34

79

51

99<BR>

40

89

92

99<BR>

64

99

30

99<BR>

74

56

80

99<BR>

87

97

88

99<BR>

74

65

56

99<BR>

67

75

67

99<BR>

89

77

88

99<BR>注意:在輸入該txt的過程中,為了能在execl中顯示該文本,要把輸入法切換到全角。

response_content.jsp的代碼如下:

<%@pagecontentType="text/html;charset=gb2312"language="java"import="java.sql.*"errorPage=""%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"

"/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">

<title>setContentType用法示例</title>

</head>

<body>

<%response.setContentType("application/x-msexcel;charset=gb2312");%>

<!--上一行代碼設(shè)置客戶端的內(nèi)容類型為excel-->

<jsp:includepage="test.txt"></jsp:include>

</body>

</html>

圖9-5excel類型顯示9.3.2response重定向

response對(duì)象另外一個(gè)重要功能是頁(yè)面重定向,即重新生成一個(gè)新的請(qǐng)求,客戶端的URL地址會(huì)發(fā)生變化,而且會(huì)丟失重定向之前的所有請(qǐng)求參數(shù)和request范圍的屬性,與forward動(dòng)作有很大的差異。sendRedirect方法用于實(shí)現(xiàn)該功能。

在下面的例子中,登錄頁(yè)面login.jsp要求用戶輸入用戶名和密碼,如果用戶名和密碼分別是admin和123,就重定向到welcome.jsp頁(yè)面,否則重定向到登錄頁(yè)面。具體代碼

如下:

login.jsp代碼如下:

<%@pagelanguage="java"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>登錄頁(yè)面</title>

</head>

<body>

<formaction="verify.jsp"method="post">

<!--上一行代碼將表單中輸入的信息以post方式提交給verify.jsp進(jìn)行處理-->

用戶名:<inputtype="text"name="username"><br>

密碼:<inputtype="password"name="password"><br>

<inputtype="submit"value="登錄">

</form>

</body>

</html>

verify.jsp代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>用戶認(rèn)證</title>

</head>

<body>

<%

Stringusername=request.getParameter("username");

//獲取login.jsp的表單中名字為username的文本框中用戶輸入的值

Stringpassword=request.getParameter("password");

//獲取login.jsp的表單中名字為password的文本框中用戶輸入的值

if("admin".equals(username)&&"123".equals(password))

//通過if語(yǔ)句判斷將客戶端的頁(yè)面重定向到哪個(gè)頁(yè)面

{

response.sendRedirect("welcome.jsp");

}

else{

response.sendRedirect("login.jsp");

}

%>

</body>

</html>

welcome.jsp代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>歡迎頁(yè)面</title>

</head>

<body>

<fontsize="4"><strong><fontsize="6">歡迎您的光臨!</font></strong></font><br>

</body>

</html>

登錄頁(yè)面顯示結(jié)果如圖9-6所示。歡迎頁(yè)面的運(yùn)行結(jié)果如圖9-7所示。

圖9-6登錄頁(yè)面

圖9-7歡迎頁(yè)面9.3.3增加Cookie

Cookie通常用于網(wǎng)站記錄客戶的某些信息,如客戶的用戶名及客戶的喜好等。一旦用戶下次登錄,網(wǎng)站可以獲取到客戶的相關(guān)信息,根據(jù)這些客戶信息,網(wǎng)站可以對(duì)客戶提供更好的服務(wù)。Session在關(guān)閉瀏覽器后就失效,但Cookie會(huì)一直存放在客戶端瀏覽器上,除非超出Cookie的生命期限。

使用response對(duì)象的addCookie方法可以向客戶端增加Cookie,但客戶端瀏覽器必須支持Cookie。在增加Cookie之前,必須先創(chuàng)建Cookie對(duì)象,具體步驟如下:

(1)創(chuàng)建Cookie實(shí)例;

(2)設(shè)置Cookie的有效期,單位為秒;

(3)向客戶端寫Cookie。

在下面的例子response_addCookie.jsp中,向客戶端寫入兩個(gè)Cookie,一個(gè)名為username,另一個(gè)名為age。具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<%@pageisELIgnored="false"%>

<html>

<head>

<title>增加Cookie</title>

</head>

<body>

姓名:<%=request.getParameter("username")%><br>

年齡:<%=request.getParameter("age")%>

<%

Stringusername=request.getParameter("username");

Stringage=request.getParameter("age");

//創(chuàng)建一個(gè)新的Cookie對(duì)象c1

Cookiec1=newCookie("username",username);

//創(chuàng)建一個(gè)新的Cookie對(duì)象c2

Cookiec2=newCookie("age",age);

//設(shè)置Cookie對(duì)象c1和c2的有效期為24*3600秒,即24小時(shí)

c1.setMaxAge(24*3600);

c2.setMaxAge(24*3600);

//向客戶端增加Cookiec1和c2

response.addCookie(c1);

response.addCookie(c2);

%>

</body>

</html>

當(dāng)客戶端的瀏覽器沒有禁用Cookie時(shí),在地址欄中輸入http://localhost:8080/Chapter9

/response_addcookie.jsp?username=zhangsan&age=25,執(zhí)行該頁(yè)面后,tomcat服務(wù)器會(huì)向客戶端寫入兩個(gè)Cookie,它們的有效期為24小時(shí)。在有效期內(nèi),這兩個(gè)Cookie會(huì)一直存在客戶端的硬盤上。該頁(yè)面的執(zhí)行效果如圖9-8所示。

圖9-8response對(duì)象增加Cookie示例通過調(diào)用request對(duì)象的getCookies(

)方法,能夠以數(shù)組的方式獲取客戶端存儲(chǔ)的所有Cookie。get_Cookie.jsp文件讀取并顯示Cookies的名字和值,具體代碼如下:

<%@pagelanguage="java"pageEncoding="UTF-8"%>

<%@pageisELIgnored="false"%>

<html>

<head>

<title>獲取Cookie</title>

</head>

<body>

<%

//以數(shù)組形式獲取所有的Cookie

Cookie[]cookies=request.getCookies();

for(Cookiec:cookies)

//運(yùn)用for循環(huán)輸出所有Cookie的名字和值

{

out.println(c.getName()+""+c.getValue()+"<br>");

}

%>

</body>

</html>

get_Cookie.jsp的運(yùn)行結(jié)果如圖9-9所示。在圖中最后一行顯示的是客戶端和服務(wù)器之間建立的session的ID,在下一節(jié)將會(huì)對(duì)session對(duì)象進(jìn)行詳述。

圖9-9獲取Cookie示例默認(rèn)情況下,Cookie值不允許出現(xiàn)中文字符,如果需要值為中文的Cookie,可以借助.URLEncoder先對(duì)中文字符進(jìn)行編碼,將編碼后的結(jié)果設(shè)為Cookie值。程序要讀取Cookie時(shí),則應(yīng)該先讀取編碼后的Cookie值,然后使用.URLDecoder對(duì)其進(jìn)行解碼。

下面Cookie_chinese.jsp在Cookie中設(shè)置了“西安電子科技大學(xué)”的中文編碼,get_chineseCookie.jsp讀取出該中文信息,頁(yè)面運(yùn)行結(jié)果如圖9-10所示。

Cookie_chinese.jsp的具體代碼如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>在Cookie中存儲(chǔ)中文值</title>

</head>

<body>

<%

Cookiec3=newCookie("chineseName",.URLEncoder.encode("西安電子科技大學(xué)",

"gbk"));//采用gbk格式對(duì)"西安電子科技大學(xué)"進(jìn)行URL編碼再存到Cookie中

c3.setMaxAge(24*3600);

response.addCookie(c3);

%>

</body>

</html>

get_chineseCookie.jsp的代碼如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>讀取Cookie的中文值</title>

</head>

<body>

<%Cookie[]cookies=request.getCookies();

for(Cookiec:cookies)

{

if(c.getName().equals("chineseName"))

{//對(duì)Cookie中chineseName的值先解碼再輸出

out.println(.URLDecoder.decode(c.getValue()));

}

}

%>

</body>

</html>

圖9-10get_chineseCookie頁(yè)面運(yùn)行結(jié)果

session對(duì)象是一個(gè)常用的JSP內(nèi)置對(duì)象,它在第一個(gè)JSP頁(yè)面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理。

從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)服務(wù)器結(jié)束,被稱為一個(gè)會(huì)話。當(dāng)一個(gè)客戶訪問一個(gè)服務(wù)器時(shí),可能會(huì)在這個(gè)服務(wù)器的幾個(gè)頁(yè)面之間反復(fù)連接,反復(fù)刷新一個(gè)頁(yè)面。服務(wù)器要通過某種辦法知道這是否為同一個(gè)客戶,就需要session對(duì)象。為了對(duì)不同的客戶加以區(qū)分,采用ID號(hào)對(duì)不同客戶的session加以標(biāo)識(shí)。9.4session對(duì)象

session對(duì)象的ID:當(dāng)一個(gè)客戶首次訪問服務(wù)器上的一個(gè)JSP頁(yè)面時(shí),JSP引擎會(huì)產(chǎn)生一個(gè)session對(duì)象,同時(shí)分配一個(gè)String類型的ID號(hào),JSP引擎則將這個(gè)ID號(hào)發(fā)送到客戶端,存放在Cookie中,這樣session對(duì)象和客戶之間就建立了一一對(duì)應(yīng)的關(guān)系。當(dāng)客戶再次訪問、連接該服務(wù)器的其他頁(yè)面時(shí),不再分配給客戶新的session對(duì)象,直到客戶關(guān)閉瀏覽器,服務(wù)器端該客戶的session對(duì)象才被取消,并且和客戶的會(huì)話對(duì)應(yīng)關(guān)系消失。服務(wù)器還可以調(diào)用session對(duì)象的invalidate()方法來取消某個(gè)session。當(dāng)客戶重新打開瀏覽器再次連接到該服務(wù)器時(shí),服務(wù)器會(huì)為該客戶創(chuàng)建一個(gè)新的session對(duì)象。

session對(duì)象存在一定時(shí)間的過期問題,所以存儲(chǔ)在session中的屬性名、值對(duì)會(huì)在一定時(shí)間后失去,可以通過更改session有效時(shí)間來避免這種情況。同時(shí),編程時(shí)盡量避免將大量有效信息存儲(chǔ)在session中,而request是一個(gè)不錯(cuò)的替代對(duì)象。

session對(duì)象的常用方法如表9-5所示。表9-5session對(duì)象的常用方法下面使用session對(duì)象實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的猜字母游戲,由guess_char.jsp和guess_result.jsp組成,其運(yùn)行結(jié)果如圖9-11和9-12所示。

guess_char.jsp的代碼如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>猜字母游戲</title>

</head>

<body>

下面,我們一起來玩一個(gè)游戲:猜字母游戲<br>

游戲規(guī)則:電腦會(huì)隨機(jī)自動(dòng)生成一個(gè)字母,請(qǐng)您猜出這個(gè)字母是什么。字母忽略大小寫。<br>

<%

//聲明一個(gè)包含26個(gè)英文字母的字符串?dāng)?shù)組

StringcharString=newString("abcdedfghijklmnopqrstuvwxyz");

//隨機(jī)生成了一個(gè)1-26個(gè)之間的整數(shù)數(shù)字

intcharNumber=(int)(Math.random()*100+1)%26-1;

//以charNumber為下標(biāo)取對(duì)應(yīng)字母的字符串中的字符

CharacterTempCharacter=newCharacter(charString.charAt(charNumber));

//將TempCharacter作為屬性存儲(chǔ)到session中

session.setAttribute("TempCharacter",TempCharacter);%>

<br>

<p>請(qǐng)輸入您所猜的字母:

<formname="form"action="guess_result.jsp"method="post">

<inputtype="text"name="guesschar">

<inputtype="submit"value="提交"name="submit">

</form>

</body>

</html>

guess_result.jsp的代碼如下:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>猜字母游戲</title>

</head>

<body>

<%

//獲取用戶在表單的文本框guesschar中輸入的字母

StringtempString=request.getParameter("guesschar");

//獲取session中存儲(chǔ)的屬性TempCharacter的值并轉(zhuǎn)化成String類型

StringTempCharacter=session.getAttribute("TempCharacter").toString();

//通過if語(yǔ)句判斷用戶猜測(cè)是否正確

if(tempString!=null)

{if(TempCharacter.equalsIgnoreCase(tempString))

out.println("恭喜您,您猜對(duì)了!");

else

out.println("您猜錯(cuò)了,加油哦!");

}

%>

<br>

<p>輸入您所猜的字母:

<formname="form1"action="guess_result.jsp"method="post">

<inputtype="text"name="guesschar">

<inputtype="submit"value="提交"name="submit">

</form>

<ahref="guess_char.jsp">重新開始新游戲</a>

</body>

</html>

圖9-11guess_char.jsp的運(yùn)行結(jié)果

圖9-12guess_result.jsp的運(yùn)行結(jié)果在guess_char.jsp文件中,首先聲明了一個(gè)包含有26個(gè)英文字母的字符串?dāng)?shù)組,然后隨機(jī)生成了一個(gè)1~26個(gè)之間的數(shù)字,以這個(gè)數(shù)字為下標(biāo)取對(duì)應(yīng)字母的字符串中的字符,并將字符轉(zhuǎn)換為一個(gè)字符后放入到session對(duì)象中,最后聲明一個(gè)表單,用于輸入用戶猜測(cè)的字母,并提交給guess_result.jsp。

在guess_result.jsp文件中,接受用戶提交的猜測(cè)字母并與session對(duì)象中保存的字母進(jìn)行比較,如果相等則報(bào)告給用戶,表示猜對(duì)了;如果錯(cuò)了則繼續(xù)猜測(cè)。

服務(wù)器啟動(dòng)后就產(chǎn)生application對(duì)象,當(dāng)客戶在所訪問網(wǎng)站的各個(gè)頁(yè)面之間瀏覽時(shí),這個(gè)application對(duì)象都是同一個(gè),直到服務(wù)器關(guān)閉。但是與session不同的是,所有客戶的application對(duì)象都是同一個(gè),即所有客戶共享這個(gè)內(nèi)置的application對(duì)象。9.5application對(duì)象在application對(duì)象的生命周期中,服務(wù)器上運(yùn)行的每一個(gè)JSP程序都可以任意存取這個(gè)application對(duì)象綁定參數(shù)(或者Java對(duì)象)的值。application對(duì)象的這些特性為我們?cè)诙鄠€(gè)JSP程序中、多個(gè)用戶共享某些全局信息(如當(dāng)前的在線人數(shù)等)提供了方便。該對(duì)象還常被用于存取環(huán)境(ServletContext)信息。

application對(duì)象的常用方法如表9-6所示。表9-6application對(duì)象常用方法下面的示例application.jsp對(duì)站點(diǎn)在線人數(shù)進(jìn)行了統(tǒng)計(jì),根據(jù)session的ID判斷是否是一個(gè)新客戶,并把在線人數(shù)的統(tǒng)計(jì)值以屬性的形式存儲(chǔ)在application對(duì)象中。這樣所有訪問該服務(wù)器的客戶可以共享該屬性。具體代碼如下:

<%@pagelanguage="java"pageEncoding="utf-8"%>

<html>

<head>

<title>application對(duì)象實(shí)例</title>

</head>

<body>

<H2>application對(duì)象實(shí)例</H2>

<hr>

<%

intuserCounter=1;

StringsessionID=session.getId();

StringBufferusers=newStringBuffer();

if(application.getAttribute("count")!=null){

users=users.append(application.getAttribute("users").toString());

//根據(jù)sessionID判斷是否是新的客戶

if(users.indexOf(sessionID)==-1){

userCounter=Integer.parseInt(application.getAttribute("count").toString());

userCounter++;

application.setAttribute("count",newInteger(userCounter));

users=users.append("<br>"+sessionID);

application.setAttribute("users",users.toString());

}

}else{

//如果是第一位訪問的客戶

users=users.append("<br>"+sessionID);

application.setAttribute("users",users.toString());

application.setAttribute("count",newInteger(userCounter));

}

out.println("當(dāng)前容器的版本信息為:"+application.getServerInfo()+"<br>");

out.println("在線人數(shù)為:"+application.getAttribute("count")+"<br>");

out.println("在線SessionID為:"+users.toString()+"<br>");

%>

</body>

</html>

上述代碼的運(yùn)行結(jié)果如圖9-13所示。

圖9-13application.jsp的運(yùn)行結(jié)果

exception對(duì)象是一個(gè)例外對(duì)象,用來發(fā)現(xiàn)、捕獲和處理異常。它是JSP文件運(yùn)行異常時(shí)產(chǎn)生的對(duì)象,當(dāng)JSP文件運(yùn)行時(shí)如果有異常發(fā)生,則拋出異常,該異常只能被設(shè)置為<%@pageisErrorPage="true"%>的JSP頁(yè)面捕獲。

exception對(duì)象的常用方法見表9-7。9.6exception對(duì)象表9-7exception對(duì)象的常用方法下面exception_test.jsp和error.jsp解釋了exception對(duì)象的具體使用方法。

exception_test.jsp的代碼如下:

<%@pagelanguage="java"pageEncoding="utf-8"errorPage="error.jsp"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>exception對(duì)象示例</title>

</head>

<body>

<%

//制造一個(gè)數(shù)字格式異常

inti=Integer.parseInt("test");

%>

</body>

</html>

error.jsp的代碼如下:

<%@pagelanguage="java"import="java.io.*"pageEncoding="utf-8"isErrorPage="true"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>捕獲exception對(duì)象</title>

</head>

<body>捕捉到如下異常:<br>

<%

out.println(exception.getMessage()+"<br>");

out.println("異常的堆棧信息為:<br>");

exception.printStackTrace(newPrintWriter(out));

%>

</body>

</html>客戶在瀏覽器URL地址欄中輸入http://localhost:8080/Chapter9/exception_test.jsp后,由于出現(xiàn)數(shù)字格式異常,錯(cuò)誤信息會(huì)被error.jsp捕獲,具體顯示結(jié)果如圖9-14所示。

圖9-14exception對(duì)象示例注意:要正常顯示error.jsp頁(yè)面,不能勾選客戶端瀏覽器的“Internet選項(xiàng)→高級(jí)→顯示友好http錯(cuò)誤信息”復(fù)選框。

9.7.1page對(duì)象

page對(duì)象是當(dāng)前JSP頁(yè)面本身的一個(gè)實(shí)例,page對(duì)象在當(dāng)前JSP頁(yè)面中可以用this關(guān)鍵字來替代。在JSP頁(yè)面的Java程序片和JSP表達(dá)式中可以使用page對(duì)象。該對(duì)象不經(jīng)常使用,其包含的方法如表9-8所示。9.7其他內(nèi)置對(duì)象表9-8page對(duì)象的常用方法注意:如果直接通過page對(duì)象來調(diào)用方法,就只能調(diào)用Object類中的那些方法。

下面的示例page.jsp解釋了page對(duì)象部分方法的應(yīng)用,具體代碼如下:

<%@pagelanguage="java"pageEncoding="utf-8"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

<html>

<head>

<title>page對(duì)象示例</title>

</head>

<body>

<h2>page對(duì)象方法舉例</h2><hr>

<%

out.println("JSP文件的類型是:"+"<br>"+page.getClass()+"<p>");

out.println("page對(duì)象的哈希碼值是:"+"<br>"+this.hashCode()+"<p>");

out.println("page對(duì)象的Servlet信息是:"+"<br>"+this.getServletInfo()+"<p>");

%>

</body>

</html>

page.jsp的運(yùn)行結(jié)果如圖9-15所示。

圖9-15page對(duì)象應(yīng)用示例9.7.2pageContext對(duì)象

一般常用pageContext對(duì)象獲取當(dāng)前頁(yè)面運(yùn)行的一些屬性,還可以直接操作與某些JSP對(duì)象綁定在一起的參數(shù)或者Java對(duì)象。該對(duì)象為我們提供了四個(gè)范圍常量:

●PAGE_SCOPE代表Page范圍。

●REQUEST_SCOPE代表Request范圍。

●SESSION_SCOPE代表Session范圍。

●APPLICATION_SCOPE代表Ap

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論