




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章JSP內(nèi)置對象9.1out對象 9.2request對象9.3response對象9.4session對象9.5application對象9.6exception對象9.7其他內(nèi)置對象
【學(xué)習(xí)提示】JSP除了運(yùn)用基本語法和基本技術(shù)在HTML中插入Java代碼并實(shí)現(xiàn)特定的動作之外,如何動態(tài)響應(yīng)客戶端的請求?JSP中包含了9個內(nèi)置對象可以用于獲取客戶端的請求,向客戶端發(fā)送響應(yīng)以及記錄與客戶端的對話等。在本章將詳細(xì)介紹每個內(nèi)置對象的屬性、方法和使用實(shí)例。內(nèi)置對象不需要聲明??梢灾苯釉贘SP中使用的對象是ServletAPI接口的實(shí)例,由JSP規(guī)范對其進(jìn)行了默認(rèn)初始化。即JSP引擎將JSP頁面編譯成Servlet時會調(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)置對象具有以下特點(diǎn):
(1)由JSP規(guī)范提供,不用編寫者實(shí)例化。
(2)通過Web容器實(shí)現(xiàn)和管理。
(3)所有JSP頁面均可使用。
(4)只有在腳本元素的表達(dá)式或代碼段中才可使用(<%=使用內(nèi)置對象%>或<%使用內(nèi)置對象%>)。
目前JSP一共包含九個內(nèi)置對象,其對象名稱和功能描述如表9-1所示。表9-1JSP內(nèi)置對象列表根據(jù)內(nèi)置對象的作用可以分成如下四類:
第一類:與Servlet有關(guān),如page和config。
第二類:與Input/Output有關(guān),如out,request和response。
第三類:與Context有關(guān),如application,session和pageContext。
第四類:與Error有關(guān),如exception。
JSP提供了四種不同時長的作用域:page、request、session和application。下面分別對其具體有效期進(jìn)行說明:
●page:只在當(dāng)前頁面有效。●request:在一次請求范圍內(nèi)有效。所謂請求周期,就是指從http請求發(fā)起到服務(wù)器處理結(jié)束,并返回響應(yīng)的整個過程。如果頁面從一個頁面跳轉(zhuǎn)到另一個頁面,那么就會生成一個新的request對象。這里所指的跳轉(zhuǎn)是指客戶端跳轉(zhuǎn),比如客戶單擊超鏈接跳轉(zhuǎn)到其他頁面或者通過瀏覽器地址欄瀏覽其他頁面。如果使用服務(wù)器端跳轉(zhuǎn)<jsp:forward>,則仍屬于同一個request。
●session:指客戶瀏覽器在一次會話范圍內(nèi),如果與服務(wù)器連接斷開,那么session就結(jié)束。●application:有效范圍是整個應(yīng)用,即從應(yīng)用啟動到應(yīng)用結(jié)束。在application對象中設(shè)置的屬性只要應(yīng)用不結(jié)束,就能在任意頁面中獲取,就算重新打開瀏覽器也是可以獲取屬性的,而且這些屬性被所有用戶共用。
out對象表示一個頁面輸出流。out對象發(fā)送的內(nèi)容是瀏覽器需要顯示的內(nèi)容,可以在頁面上輸出變量值及常量,是文本一級的。開發(fā)者通常使用out.print()和out.println()這兩個方法把結(jié)果輸出到網(wǎng)頁上。out對象提供的方法如表9-2所示。9.1out對象表9-2out對象常用方法
out對象的用法示例(out_test.jsp)的代碼如下:
<%@pagelanguage="java"pageEncoding="UTF-8"%>
<%@pagebuffer="2kb"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>out對象示例</title>
</head>
<body>
<h3>out對象常用方法示例</h3>
<hr>
<%
for(inti=0;i<10;i++)
out.println(i+"{剩余"+out.getRemaining()+"字節(jié)}<br>");
%>
緩存大?。?lt;%=out.getBufferSize()+"字節(jié)<br>"%>
剩余緩存大?。?lt;%=out.getRemaining()+"字節(jié)<br>"%>自動刷新:<%=out.isAutoFlush()%>
</body>
</html>
out_test.jsp的運(yùn)行結(jié)果如圖9-1所示。
圖9-1out對象的用法示例
request對象是JSP中最常用的對象之一,它封裝了由客戶端生成的HTTP請求的所有內(nèi)容,包括請求參數(shù)、屬性、請求頭信息、cookies及數(shù)據(jù)。通過調(diào)用request對象的相應(yīng)方法可以獲取具體的參數(shù)值。另外,還可以在request的生命周期內(nèi)設(shè)置額外的屬性。request對象的常用方法如表9-3所示。9.2request對象表9-3request對象的常用方法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>用戶個人信息填寫</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>個人愛好:<selectname="hobbies"><optionselectedvalue="音樂">音樂</option><optionvalue="繪畫">繪畫</option><optionvalue="運(yùn)動">體育</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所示,在頁面上輸入相關(guān)個人信息,點(diǎn)擊“提交”按鈕,根據(jù)表單“user-info”的action屬性可知頁面將跳轉(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對象示例</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>
您的個人愛好是:<%=request.getParameter("hobbies")%>
<!--上一行代碼采用request.getParameter()方法獲取表單user-info中名字為"hobbies"的下拉列表菜單中用戶所選項(xiàng)的value值-->
<br>
</body>
</html>
request對象的getParameter(Stringstr)方法輸入的參數(shù)必須為字符串(String)類型,而且返回值也是String類型。因此,要想對由getParameter方法獲取的進(jìn)行運(yùn)算等操作時,要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。9.2.2解決request中文亂碼問題
由于getParameter方法獲取的參數(shù)值默認(rèn)是按照ISO-8859-1的方式進(jìn)行編碼的,此種編碼方式不能正常顯示中文,就會在瀏覽器上呈現(xiàn)亂碼。解決request的中文亂碼問題,常用方法有兩種。第一種,在第一次使用request.getParameter()之前采用setCharacterEncoding
(charset)設(shè)置,可以正常顯示中文的編碼方式(gb2312、utf-8、gbk)。但是setCharacterEncoding
(charset)方法只對HTTP消息體中的數(shù)據(jù)起作用,對于URL字段中的參數(shù)不起作用。所以,當(dāng)表單的method屬性取值為get時,依然會出現(xiàn)中文亂碼問題。第二種,先使用getBytes方法將getParameter獲取的字符串轉(zhuǎn)換成字節(jié)數(shù)組,然后再按照UTF-8等編碼方式重新生成字符串。這種方法對于表單的兩種提交方式get和post均適用,具體代碼如下:
<%
Stringname=request.getParameter("name");
Stringnew_name=newString(name.getBytes("ISO-8859-1"),"UTF-8");
%>9.2.3request范圍內(nèi)的屬性設(shè)置與獲取
在request對象的生命周期內(nèi),即一次請求中,可以通過setAttribute方法設(shè)置屬性名和對應(yīng)的屬性值。也可用getAttribute方法讀取屬性值。這兩個方法一般和forward動作結(jié)合使用。下面的例子request_attribute.jsp為request對象添加了屬性info,跳轉(zhuǎn)到頁面get_attribute.jsp獲取屬性值,并將其顯示在頁面上,具體代碼如下:
request_attribute.jsp
<%@pagelanguage="java"pageEncoding="UTF-8"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>request的setAttribute方法</title>
</head>
<body>
本頁采用request對象設(shè)置屬性info
<%request.setAttribute("info","網(wǎng)站設(shè)計(jì)與開發(fā)");%>
<!--上一行代碼為request對象設(shè)置屬性info,及其值-->
<jsp:forwardpage="get_Attribute.jsp"/>
<!--上一行代碼會將頁面跳轉(zhuǎn)到get_Attribute.jsp-->
</body>
</html>
get_attribute.jsp
<%@pagelanguage="java"pageEncoding="UTF-8"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>request對象的getAttribute方法</title>
</head>
<body>
request對象中添加的屬性info的值為:
<%=request.getAttribute("info")%>
<!--上一行代碼獲取reqeust對象的屬性info的值-->
</body>
</html>
request_attribute.jsp的運(yùn)行結(jié)果如圖9-4所示。從圖中可以看出雖然網(wǎng)頁發(fā)生了跳轉(zhuǎn),但是URL地址沒有發(fā)生變化,所以兩個頁面都屬于一次請求,可以讀取添加的屬性值。如果URL地址發(fā)生改變,則會生成新的request對象,就無法讀取前一個頁面為request對象添加的屬性值。
圖9-4request對象的屬性設(shè)置與獲取示例9.2.4request執(zhí)行forward或include動作
request對象還有一個功能就是執(zhí)行forward和include動作,替代原有的動作標(biāo)簽。HttpServletRequest類提供了一個getRequestDipacher(Stringpath)方法,其中path就是要跳轉(zhuǎn)或包含的目標(biāo)路徑,該方法返回RequestDisPatcher,該對象提供了如下兩個方法:
●
forward(ServletRequestrequest,ServletResponseresponse):執(zhí)行forward動作。
●
include(ServletRequestrequest,ServletResponseresponse):執(zhí)行include動作。具體示例如下:
getRequestDispatcher("/test.jsp").include(request,response);
getRequestDispatcher("/test.jsp").forward(request,response);
response對象是服務(wù)器對客戶端請求的響應(yīng),但在JSP中很少直接用它來響應(yīng)客戶端的請求,一般用out對象直接輸出對客戶的響應(yīng)信息。由于out對象只能輸出字符內(nèi)容,當(dāng)需要輸出非字符內(nèi)容(如:動態(tài)生成圖片,PDF文檔)時,則必須使用response作為響應(yīng)輸出。此外,response對象還可以重定向請求,以及向客戶端增加Cookie。
response對象的常用方法見表9-4。9.3response對象表9-4response對象常用方法9.3.1setContentType方法
當(dāng)要向客戶端輸出非字符響應(yīng)時,可以采用response對象,并設(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”。下面是一個txt文檔,可以采用excel打開該文檔,顯示效果如圖9-5所示。
test.txt文檔內(nèi)容如下:
英語數(shù)學(xué)語文物理<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對象另外一個重要功能是頁面重定向,即重新生成一個新的請求,客戶端的URL地址會發(fā)生變化,而且會丟失重定向之前的所有請求參數(shù)和request范圍的屬性,與forward動作有很大的差異。sendRedirect方法用于實(shí)現(xiàn)該功能。
在下面的例子中,登錄頁面login.jsp要求用戶輸入用戶名和密碼,如果用戶名和密碼分別是admin和123,就重定向到welcome.jsp頁面,否則重定向到登錄頁面。具體代碼
如下:
login.jsp代碼如下:
<%@pagelanguage="java"pageEncoding="utf-8"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>登錄頁面</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語句判斷將客戶端的頁面重定向到哪個頁面
{
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>歡迎頁面</title>
</head>
<body>
<fontsize="4"><strong><fontsize="6">歡迎您的光臨!</font></strong></font><br>
</body>
</html>
登錄頁面顯示結(jié)果如圖9-6所示。歡迎頁面的運(yùn)行結(jié)果如圖9-7所示。
圖9-6登錄頁面
圖9-7歡迎頁面9.3.3增加Cookie
Cookie通常用于網(wǎng)站記錄客戶的某些信息,如客戶的用戶名及客戶的喜好等。一旦用戶下次登錄,網(wǎng)站可以獲取到客戶的相關(guān)信息,根據(jù)這些客戶信息,網(wǎng)站可以對客戶提供更好的服務(wù)。Session在關(guān)閉瀏覽器后就失效,但Cookie會一直存放在客戶端瀏覽器上,除非超出Cookie的生命期限。
使用response對象的addCookie方法可以向客戶端增加Cookie,但客戶端瀏覽器必須支持Cookie。在增加Cookie之前,必須先創(chuàng)建Cookie對象,具體步驟如下:
(1)創(chuàng)建Cookie實(shí)例;
(2)設(shè)置Cookie的有效期,單位為秒;
(3)向客戶端寫Cookie。
在下面的例子response_addCookie.jsp中,向客戶端寫入兩個Cookie,一個名為username,另一個名為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)建一個新的Cookie對象c1
Cookiec1=newCookie("username",username);
//創(chuàng)建一個新的Cookie對象c2
Cookiec2=newCookie("age",age);
//設(shè)置Cookie對象c1和c2的有效期為24*3600秒,即24小時
c1.setMaxAge(24*3600);
c2.setMaxAge(24*3600);
//向客戶端增加Cookiec1和c2
response.addCookie(c1);
response.addCookie(c2);
%>
</body>
</html>
當(dāng)客戶端的瀏覽器沒有禁用Cookie時,在地址欄中輸入http://localhost:8080/Chapter9
/response_addcookie.jsp?username=zhangsan&age=25,執(zhí)行該頁面后,tomcat服務(wù)器會向客戶端寫入兩個Cookie,它們的有效期為24小時。在有效期內(nèi),這兩個Cookie會一直存在客戶端的硬盤上。該頁面的執(zhí)行效果如圖9-8所示。
圖9-8response對象增加Cookie示例通過調(diào)用request對象的getCookies(
)方法,能夠以數(shù)組的方式獲取客戶端存儲的所有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é)將會對session對象進(jìn)行詳述。
圖9-9獲取Cookie示例默認(rèn)情況下,Cookie值不允許出現(xiàn)中文字符,如果需要值為中文的Cookie,可以借助.URLEncoder先對中文字符進(jìn)行編碼,將編碼后的結(jié)果設(shè)為Cookie值。程序要讀取Cookie時,則應(yīng)該先讀取編碼后的Cookie值,然后使用.URLDecoder對其進(jìn)行解碼。
下面Cookie_chinese.jsp在Cookie中設(shè)置了“西安電子科技大學(xué)”的中文編碼,get_chineseCookie.jsp讀取出該中文信息,頁面運(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中存儲中文值</title>
</head>
<body>
<%
Cookiec3=newCookie("chineseName",.URLEncoder.encode("西安電子科技大學(xué)",
"gbk"));//采用gbk格式對"西安電子科技大學(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"))
{//對Cookie中chineseName的值先解碼再輸出
out.println(.URLDecoder.decode(c.getValue()));
}
}
%>
</body>
</html>
圖9-10get_chineseCookie頁面運(yùn)行結(jié)果
session對象是一個常用的JSP內(nèi)置對象,它在第一個JSP頁面被裝載時自動創(chuàng)建,完成會話期管理。
從一個客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個服務(wù)器結(jié)束,被稱為一個會話。當(dāng)一個客戶訪問一個服務(wù)器時,可能會在這個服務(wù)器的幾個頁面之間反復(fù)連接,反復(fù)刷新一個頁面。服務(wù)器要通過某種辦法知道這是否為同一個客戶,就需要session對象。為了對不同的客戶加以區(qū)分,采用ID號對不同客戶的session加以標(biāo)識。9.4session對象
session對象的ID:當(dāng)一個客戶首次訪問服務(wù)器上的一個JSP頁面時,JSP引擎會產(chǎn)生一個session對象,同時分配一個String類型的ID號,JSP引擎則將這個ID號發(fā)送到客戶端,存放在Cookie中,這樣session對象和客戶之間就建立了一一對應(yīng)的關(guān)系。當(dāng)客戶再次訪問、連接該服務(wù)器的其他頁面時,不再分配給客戶新的session對象,直到客戶關(guān)閉瀏覽器,服務(wù)器端該客戶的session對象才被取消,并且和客戶的會話對應(yīng)關(guān)系消失。服務(wù)器還可以調(diào)用session對象的invalidate()方法來取消某個session。當(dāng)客戶重新打開瀏覽器再次連接到該服務(wù)器時,服務(wù)器會為該客戶創(chuàng)建一個新的session對象。
session對象存在一定時間的過期問題,所以存儲在session中的屬性名、值對會在一定時間后失去,可以通過更改session有效時間來避免這種情況。同時,編程時盡量避免將大量有效信息存儲在session中,而request是一個不錯的替代對象。
session對象的常用方法如表9-5所示。表9-5session對象的常用方法下面使用session對象實(shí)現(xià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>
下面,我們一起來玩一個游戲:猜字母游戲<br>
游戲規(guī)則:電腦會隨機(jī)自動生成一個字母,請您猜出這個字母是什么。字母忽略大小寫。<br>
<%
//聲明一個包含26個英文字母的字符串?dāng)?shù)組
StringcharString=newString("abcdedfghijklmnopqrstuvwxyz");
//隨機(jī)生成了一個1-26個之間的整數(shù)數(shù)字
intcharNumber=(int)(Math.random()*100+1)%26-1;
//以charNumber為下標(biāo)取對應(yīng)字母的字符串中的字符
CharacterTempCharacter=newCharacter(charString.charAt(charNumber));
//將TempCharacter作為屬性存儲到session中
session.setAttribute("TempCharacter",TempCharacter);%>
<br>
<p>請輸入您所猜的字母:
<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中存儲的屬性TempCharacter的值并轉(zhuǎn)化成String類型
StringTempCharacter=session.getAttribute("TempCharacter").toString();
//通過if語句判斷用戶猜測是否正確
if(tempString!=null)
{if(TempCharacter.equalsIgnoreCase(tempString))
out.println("恭喜您,您猜對了!");
else
out.println("您猜錯了,加油哦!");
}
%>
<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文件中,首先聲明了一個包含有26個英文字母的字符串?dāng)?shù)組,然后隨機(jī)生成了一個1~26個之間的數(shù)字,以這個數(shù)字為下標(biāo)取對應(yīng)字母的字符串中的字符,并將字符轉(zhuǎn)換為一個字符后放入到session對象中,最后聲明一個表單,用于輸入用戶猜測的字母,并提交給guess_result.jsp。
在guess_result.jsp文件中,接受用戶提交的猜測字母并與session對象中保存的字母進(jìn)行比較,如果相等則報(bào)告給用戶,表示猜對了;如果錯了則繼續(xù)猜測。
服務(wù)器啟動后就產(chǎn)生application對象,當(dāng)客戶在所訪問網(wǎng)站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務(wù)器關(guān)閉。但是與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內(nèi)置的application對象。9.5application對象在application對象的生命周期中,服務(wù)器上運(yùn)行的每一個JSP程序都可以任意存取這個application對象綁定參數(shù)(或者Java對象)的值。application對象的這些特性為我們在多個JSP程序中、多個用戶共享某些全局信息(如當(dāng)前的在線人數(shù)等)提供了方便。該對象還常被用于存取環(huán)境(ServletContext)信息。
application對象的常用方法如表9-6所示。表9-6application對象常用方法下面的示例application.jsp對站點(diǎn)在線人數(shù)進(jìn)行了統(tǒng)計(jì),根據(jù)session的ID判斷是否是一個新客戶,并把在線人數(shù)的統(tǒng)計(jì)值以屬性的形式存儲在application對象中。這樣所有訪問該服務(wù)器的客戶可以共享該屬性。具體代碼如下:
<%@pagelanguage="java"pageEncoding="utf-8"%>
<html>
<head>
<title>application對象實(shí)例</title>
</head>
<body>
<H2>application對象實(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對象是一個例外對象,用來發(fā)現(xiàn)、捕獲和處理異常。它是JSP文件運(yùn)行異常時產(chǎn)生的對象,當(dāng)JSP文件運(yùn)行時如果有異常發(fā)生,則拋出異常,該異常只能被設(shè)置為<%@pageisErrorPage="true"%>的JSP頁面捕獲。
exception對象的常用方法見表9-7。9.6exception對象表9-7exception對象的常用方法下面exception_test.jsp和error.jsp解釋了exception對象的具體使用方法。
exception_test.jsp的代碼如下:
<%@pagelanguage="java"pageEncoding="utf-8"errorPage="error.jsp"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>exception對象示例</title>
</head>
<body>
<%
//制造一個數(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對象</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ù)字格式異常,錯誤信息會被error.jsp捕獲,具體顯示結(jié)果如圖9-14所示。
圖9-14exception對象示例注意:要正常顯示error.jsp頁面,不能勾選客戶端瀏覽器的“Internet選項(xiàng)→高級→顯示友好http錯誤信息”復(fù)選框。
9.7.1page對象
page對象是當(dāng)前JSP頁面本身的一個實(shí)例,page對象在當(dāng)前JSP頁面中可以用this關(guān)鍵字來替代。在JSP頁面的Java程序片和JSP表達(dá)式中可以使用page對象。該對象不經(jīng)常使用,其包含的方法如表9-8所示。9.7其他內(nèi)置對象表9-8page對象的常用方法注意:如果直接通過page對象來調(diào)用方法,就只能調(diào)用Object類中的那些方法。
下面的示例page.jsp解釋了page對象部分方法的應(yīng)用,具體代碼如下:
<%@pagelanguage="java"pageEncoding="utf-8"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>page對象示例</title>
</head>
<body>
<h2>page對象方法舉例</h2><hr>
<%
out.println("JSP文件的類型是:"+"<br>"+page.getClass()+"<p>");
out.println("page對象的哈希碼值是:"+"<br>"+this.hashCode()+"<p>");
out.println("page對象的Servlet信息是:"+"<br>"+this.getServletInfo()+"<p>");
%>
</body>
</html>
page.jsp的運(yùn)行結(jié)果如圖9-15所示。
圖9-15page對象應(yīng)用示例9.7.2pageContext對象
一般常用pageContext對象獲取當(dāng)前頁面運(yùn)行的一些屬性,還可以直接操作與某些JSP對象綁定在一起的參數(shù)或者Java對象。該對象為我們提供了四個范圍常量:
●PAGE_SCOPE代表Page范圍。
●REQUEST_SCOPE代表Request范圍。
●SESSION_SCOPE代表Session范圍。
●APPLICATION_SCOPE代表Ap
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年注會考試中的知識點(diǎn)整合與早期規(guī)劃的必要性探討試題及答案
- 電聲器件在智能語音助手平板中的應(yīng)用考核試卷
- 2025年注會考生反饋試題及答案
- 糧食大豆生產(chǎn)方案范本
- 2025年會計(jì)核算方法試題及答案
- 財(cái)務(wù)報(bào)表分析技巧試題及答案2025
- 2024年行政管理師考前準(zhǔn)備試題及答案
- 項(xiàng)目管理財(cái)務(wù)知識考題試題及答案
- 項(xiàng)目管理主動溝通試題及答案
- 石棉水泥制品國際貿(mào)易實(shí)務(wù)考核試卷
- 危險性較大的分部分項(xiàng)工程監(jiān)理實(shí)施細(xì)則1
- 供貨進(jìn)度及保證方案
- 腳手架穩(wěn)定計(jì)算
- 信息系統(tǒng)網(wǎng)絡(luò)安全應(yīng)急預(yù)案
- 掉落物落地品管理規(guī)定
- 科姆龍變頻器說明書kv2000
- 小學(xué)生讀書知識競賽試題
- 藍(lán)色簡約法律通用PPT模板
- 旅行社掛靠協(xié)議(樣板)
- 皮爾遜Ⅲ型曲線模比系數(shù)計(jì)算表(共享版)
- 房屋租賃合以裝修費(fèi)抵租金
評論
0/150
提交評論