第一篇:JSP內置對象講解教案
第5章 JSP內置對象
在JSP中預先定義好了一些常用的對象,在Web應用中可以直接使用這些對象。內置對象的應用大大簡化了Web開發工作。
5.1 JSP內置對象概述
因為java是區分大小寫的,所以在JSP中對象名要注意字母的大小寫。
JSP內置對象有9個 ? request對象 ? response對象 ? out對象 ? session對象 ? application對象 ? exception對象 ? page對象
? pageContext對象 ? config對象
5.2 request對象
? request對象用于接收客戶端通過HTTP協議傳送給服務器端的數據。
? 而response對象主要用來向客戶發送信息,它包含了Web服務器對客戶的響應信息。
? request和response對象是JSP中很重要的兩個內置對象,是實現客戶端和服務器交互的基礎。
5.2.1 request對象的功能
? request對象用來接收客戶端提交的請求
例如:接收用戶提交的表單信息
infoReceive.jsp代碼
<% String str1=request.getParameter(“RdName”);%> <% String str2=request.getParameter(“PhName”);%> 您輸入的信息為:
姓名: <%=str1%>
電話: <%=str2%>
5.2.4 request對象常用方法
? 在客戶訪問頁面時,向服務器的JSP引擎提交一個HTTP請求,該請求包含一個請求行、主機頭和上載信息。例如:
? POST /chapt5/infoReceive.jsp HTTP/1.1
//請求行 ? Host localhost
//頭,host是頭名字
? request對象也提供了一些其他方法,用來獲得客戶傳來信息的其他部分。? request對象常用方法:
1.getProtocol():獲取客戶端向服務器端傳送數據所使用的協議名稱和版本號 2.getServerName():獲得服務器的名字
3.getServerPort():獲得服務器所使用的端口號。4.getRemoteAddr():獲得客戶端的IP地址。
5.getRemoteHost():獲得客戶端主機的名字,若失敗,則返回客戶端的IP地址。6.getMethod():返回客戶端向服務器端傳送數據的方法,一般方法為get或post。
7.getCookies():返回客戶端的cookie對象,結果是一個cookie數組。如果客戶端沒有發送cookie,則返回空值。
8.getSession(boolean create):返回和當前客戶端請求相關聯的HttpSession對象,如果當前客戶端請求沒有和任何HttpSession對象關聯,那么當create變量為true,則創建一個HttpSession對象并返回;反之,返回null。9.getHeader(String name):獲得http協議定義的傳送文件頭信息。
10.getAttribute(String name):返回name指定的屬性值,若不存在指定的屬性,就返回null。
11.getAttributeNames():返回request對象所有屬性的名字,結果集是一個Enumeration(枚舉)類的實例。12.getHeaderNames():返回所有request header的名字,結果集是一個Enumeration(枚舉)類的實例。
13.getHeaders(String name):返回指定名字的request header的所有值,結果集是一個Enumeration(枚舉)類的實例。
14.getParameter(String name):以字符串的形式返回客戶端傳來的某一個請求參數的值,該參數名由name指定。當傳遞給此方法的參數名沒有實際參數與之對應時,返回null。通常是表單中的參數.15.getParameterNames():返回客戶端傳送給服務器端的所有的參數名,結果集是一個Enumeration(枚舉)類的實例。當傳遞給此方法的參數名沒有實際參數與之對應時,返回null。
16.getParameterValues(String name):以字符串數組的形式返回指定參數所有值。
17.getQueryString():返回查詢字符串,該字符串由客戶端以GET方法向服務器端傳送。18.getRequestURI():獲得發出請求字符串的客戶端地址
19.getServletPath():獲得客戶端所請求的腳本文件的文件路徑。
20.setAttribute(String name,Java.lang.Object o):設定名字為name的request參數值,該值由Object類型的o指定。
21.getContentLength():以字節為單位返回客戶端請求的大小。如果無法得到該請求的大小,則返回-1。22.getContentType():獲取客戶端請求的MIME類型。如果無法得到該請求的MIME類型,那么返回-1。23.getInputStream():以二進制的形式將客戶端的請求以一個ServletInputStream的形式返回。使用此方法可以獲得客戶端的multipart/form-data數據,可以實現文件上傳。
24.isSecure():如果客戶機是通過一個安全的訪問方式訪問的,就返回true;反之,返回false。25.getDateHeader():返回一個long類型的數據,表示客戶端發送到服務器的頭信息中的時間信息。26.getInitHeader():獲取客戶端發送到服務器端的頭信息中的某一個特定的信息,并轉換為int類型。27.getContextPath():返回環境路徑.對于JSP來說,一般是當前Web應用程序的根目錄。
28.isRequestedSessionIdValid():返回一個指示客戶端請求發送Session ID是否仍然有效的布爾值。
29.isRequestedSessionIdFromCookie():返回一個指示客戶端請求發送Session ID是否存在于Cookie中的布爾值。
30.isRequestedSessionIdFromURL():返回一個指示客戶端請求發送Session ID是否存在于URL中的布爾值。
5.2.5 request對象常用方法應用案例
【例5.2】 使用request對象的常用方法,獲取客戶端提交信息的不同部分。
本例中的用戶輸入頁面infoInput2.html只需要把例5.1的文件infoInput.html的form的action屬性值改為infoReceive2.jsp即可。infoReceive2.jsp主要代碼
<%
out.println(“姓名文本框提交信息:” + request.getParameter(“RdName”)+ “
”);out.println(“電話文本框提交信息:” + request.getParameter(“PhName”)+ “
”);out.println(“客戶端協議名和版本號:” + request.getProtocol()+ “
”);out.println(“客戶機名:” + request.getRemoteHost()+ “
”);out.println(“客戶機的IP地址:” + request.getRemoteAddr()+ “
”);out.println(“客戶提交信息的長度:” + request.getContentLength()+ “
”);
%> out.println(“---------
”);
out.println(“getContextPath:” +request.getContextPath()+ “
”);out.println(“requestURI=” + request.getRequestURI()+ “
”);out.println(“requestURL=” + request.getRequestURL()+ “
”);out.println(“servletPath=” + request.getServletPath()+ “
”);// getServletPath 不建議使用 因為當servlet映射成/*時 無法獲得
String uri = request.getRequestURI();String servletPath = uri.substring(request.getContextPath().length());out.println(“servletPath=” + servletPath + “
”);總結:
request.getRequestURI()與request.getRequestURL()與request.getServletPath()區別
a)getRequestURI()獲得的信息:/day6/servlet/RequestServlet b)getRequestURL()獲得的信息:http://localhost/day6/servlet/RequestServlet c)getServletPath()獲得的信息: servlet/RequestServlet
getServletPath 不建議使用
因為當servlet映射成/*時 無法獲得。
d)request.getContextPath()獲得的信息: /day6
那如何獲取serverpath String uri = request.getRequestURI();
// /day06aaa/servlet/RequestDemo1
String servletPath = uri.substring(request.getContextPath().length());
System.out.println(“servletPath=” + servletPath);5.3 response對象
? ? 把服務器端的數據以HTTP的格式發送到客戶端瀏覽器 它的功能和request對象的功能相反
? request對象用于得到用戶提交的信息 ? 而response對象是向用戶發送信息
? 兩者結合起來完成動態頁面的交互功能。
5.3.1 response對象的功能
? response對象提供的幾種輸出結果的主要方法:
? sendRedirect():頁面重定向方法。? setStatus():設置狀態行方法。
? setContentType():設置文本類型方法。
5.3.2 sendRedirect()方法
? 將客戶端瀏覽器轉向新的頁面,頁面中重定向語句后的代碼不再被執行。? 它可以根據用戶的不同要求轉向不同的頁面。? 例如:防盜鏈。(第3章 http協議中講解)
【例5-3】response對象的使用。
? 用戶在登錄界面輸入用戶名和密碼,提交后驗證登錄者輸入的用戶名和密碼是否正確,根據判斷結果轉向不同的頁面。
? 其中userLogin.html為用戶輸入界面
? userReceive.jsp為接收用戶輸入信息并判斷輸入是否正確頁面
? loginCorrect.html和loginError.html分別為登錄成功界面和登錄失敗界面。
userLogin.html頁面主要代碼:
userReceive.jsp頁面源代碼:<% String Name = request.getParameter(“RdName”);String Passwd = request.getParameter(“RdPasswd”);if(Name.equals(“Mary”)&& Passwd.equals(“123456”))
response.sendRedirect(“loginCorrect.html”);else
response.sendRedirect(“loginError.html”);%>
? 需要注意的是,在實際的Web開發中,用戶的信息保存在數據庫中,判斷用戶登錄時所輸入的用戶名和密碼是否正確需要連接到數據庫,和數據庫中的數據進行匹配。此處為了演示sendRedirect方法的使用,簡單的和常量進行比較。
5.3.3 response的狀態行
1.狀態行的作用
當頁面出現錯誤時,服務器會自動響應,將相應的出錯信息返回客戶端。狀態行包含3位數字的狀態代碼,代表錯誤的性質和處理方法。共有5類狀態碼,如下:
1XX(1開頭的3位數):主要是實驗性質的。例如101表示服務器正在升級協議。
2XX:表示請求成功。如200表示請求成功。
3XX:表示在請求滿足之前應采取的進一步行動。如302請求重定向; 305表示請求必須通過代理來訪問。
4XX:瀏覽器不能滿足請求時,返回的狀態碼。如404表示請求的頁面不存在。
5XX:服務器執行出現錯誤時,返回的狀態碼。如500表示服務器內部發生錯誤,不能服務。
2.setStatus()方法
程序中可以使用response對象的setStatus()方法設置狀態碼。在一般情況下,不需要在程序中設置狀態碼。頁面出現問題時,服務器會自動響應,并發送相應的狀態碼提示用戶。
? 使用response.setStatus(int n)方法設置狀態行
? 例如response.setStatus(501)取得錯誤信息為501的出錯信息,返回該出錯頁面到客戶端。? 如果狀態代碼為出錯碼,頁面中 response.setStatus()后面的語句將不被執行。
[例5-4]狀態行的應用
本例包含4個文件 : StatueCode.html
顯示不同的狀態行
href=“statusCode200.jsp”>200請求成功信息
第二篇:JSP內置對象實驗報告
JSP程序設計實驗報告
(三)院系:計算機科學與工程學院
【實驗題目】
JSP內置對象
【實驗目的】
1、了解JSP中4個內置對象request、reponse、session、pagecontext的基本概念。
2、理解JSP內置對象的常用方法的功能。
3、掌握JSP內置對象的應用。
【實驗內容】
1、request對象:客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然后做出響應。它是HttpServletRequest類的實例。
2、response對象:response對象包含了響應客戶請求的有關信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。
3、session對象:session對象指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開連接為止。
4、pageContext對象:pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當于頁面中所有功能的集大成者。
5、練習(自己完成)
【實驗代碼】
實驗1 request對象使用
<%@ page language=“java” import=“java.util.*” pageEncoding=“GBK”%> <%
%>
+ request.getServerName()+ “:” + request.getServerPort()+ path + “/”;
請求方式:<%=request.getMethod()%>
請求的資源:<%=request.getRequestURI()%>
請求用的協議:<%=request.getProtocol()%>
請求的文件名:<%=request.getServletPath()%>
請求的服務器的IP:<%=request.getServerName()%>
請求服務器的端口:<%=request.getServerPort()%>
客戶端IP地址:<%=request.getRemoteAddr()%>
客戶端主機名:<%=request.getRemoteHost()%>
表單提交來的值:<%=request.getParameter(”qwe“)%>
<%
%> String str = ”“;if(request.getParameter(”qwe“)!= null){ Enumeration enumt = request.getParameterNames();while(enumt.hasMoreElements()){ str = enumt.nextElement().toString();out.println(str + ”:“ + request.getParameter(str)+ ”
");} }
第三篇:感恩教案jsp
洪常小學一年級語文上冊第一單元“基于標準的教學”教學設計
第三課 童心 “基于標準的教學”教學設計
(總第 20 學時)
課型:新授課
案序:第三單元
設計者:萬金輝
學習目標:
1.讓學生了解感恩,即讓學生懂得為什么要感恩。
2.讓學生懂得怎樣去感恩,通過活動讓學生真真學會如何做人。3.引導學生暢談理想,展開想象對自己的未來進行美好憧憬。
學習重點:
讓學生了解感恩,即讓學生懂得為什么要感恩,在有理想的目標中懷著感恩心去實現,自己理想.學習難點:
讓學生懂得怎樣去感恩。自己腳踏實地的努力去實現。
評價方案:
興趣激勵:讓學生明確學習的重要價 值,優化導入設計,教師通過精心設 汁教學過程,適當補充與學生生活相關聯的教學材料,激發學生的學習。
氛圍激勵;正確運用肯定和獎勵,采 取適當的競爭方法,適度的競爭,營造民主、平等、和諧、積極向上的課堂氛圍。充分、恰當地運用教材、錄音、錄像等多媒體,讓學生全感官參與學習。
教學過程活動化:組織多種形式的課堂教學討論、交流、等活動形式,完成教學目標,在教學中注重學生自學、指導學生學會自由學習、指導學生學會自我評價。
課前準備:
搜集與主題相關的歌曲,如《感恩的心》 洪常小學一年級語文上冊第一單元“基于標準的教學”教學設計搜集相關的學生對感恩的認識,和對自己理想的憧憬,了解學生。
教學預設:
我們每一個人都獲得過別人的幫助和支持,應該時刻感謝這些幫助你的人,感謝上天的眷顧。一個人的成長,要感謝父母的恩惠,感謝朋友的恩惠,感謝師長的恩惠,感謝社會的恩惠。
一、討論:自己怎樣認識感恩的?
學生1:所謂“感恩”,就是要記住別人對自己的恩惠,學會報答那些給自己幫助的人。
學生2:我認為我們在生活中就是要多幫助父母,多體諒老師,那就是感恩。
學生3:感恩是一種品德,是一種生活態度。我們只有學會了感恩,生活才會快樂,生活中才會有真摯的情感。
學生4:生活中我們要感恩父母,感恩老師,感恩一切幫助過我的人。教師總結:
剛才幾位同學都說了自己對“感恩”的理解,非常好。老師想,在生活中,我們首先要感恩的是父母,因為他們生養了我們;其次,我們要感恩的是老師,因為他們教育了我們;另外,我們還要感恩朋友和對手,因為他們促進了我們的成長;甚至我們還要感恩自然,因為自然給了我們陽光雨露,藍天碧樹,四季變換。可以這樣說,面對生活,我們就要懷著一顆感恩之心。
二、討論:
1.為什么要感恩父母?
2.為什么要感恩老師?為什么要感恩自然和身邊的人? 學生先自己考慮,然后再進行小組交流。
三、繼續討論: 1.怎樣感恩父母? 洪常小學一年級語文上冊第一單元“基于標準的教學”教學設計2.怎樣感恩老師?
3.怎樣感恩自然和身邊其他的人?
學生針對以上三個問題進行討論,而后教師總結。1.分組討論發言 2.教師總結
四、下面進行現場調查:
問題:
1、你母親的生日?
2、你給父親買過生日禮物嗎?
3、你母親最喜歡的是哪套衣服?
4、你父母的結婚紀念日?
5、你爸爸今天40幾歲?屬什么的?
6、你爸爸喜歡喝白酒嗎?那他一般喝什么牌子的?
7、你父親喜歡吃的菜是? ???
總結:通過剛剛的調查我們發現,并不是每個同學都十分了解自己的父母,可是反過來如果被問的是父母,不用調查也會知道結果,父母會對我們的一切記憶的都很深刻!感恩方法大奉獻:(1)為勞累的父母、長輩倒一杯茶,揉揉肩,洗洗腳,說說笑話。
(2)每天好好學習,學會尊重、關心老師,給老師一個好心情。(3)體諒、理解父母、老師的苦楚,不頂嘴、爭吵,多為他們著想。(4)每天分擔些力所能及的事,學會說 “謝謝”、“您辛苦了!”。(5)尊重父母、老師的勞動成果,天天反思過失,學會說“對不起”(6)學會關愛身邊的人,存好心,做好人,及時給他人送上溫暖。(7)多做善事、好事,盡自己最大的力量報效國家、社會、人民。(8)列一張感恩表,記下感恩的事情,感恩的人,時時圖求報答。洪常小學一年級語文上冊第一單元“基于標準的教學”教學設計
一起做一個感恩的人吧!感恩父母,感恩老師,感恩社會??這是我們共同的宣誓,從我做起,從現在做起,總之,希望同學們:1.孝敬父母,學會體貼;2.尊敬老師,努力學習;3.尊重他人,團結友愛。
孩子們,我們帶著感恩的心,懷揣自己的理想讓我們一起飛翔,理想是燈塔,指引人生前進的方向,照亮人生前進的路程。沒有理想,就沒有堅定的方向,沒有堅定的方向,就沒有生活。福爾摩斯也說:世界上最重要的事,不在于我們在何處,而在于我們朝什么方向走。我們頭上的一顆指路明星就是——理想。搜集資料:
1.這些有關理想的名人名言是否給同學們一點啟示,同學們,我們作為風華正茂的青少年,更應該及早立下自己的志向今天的習作課,我們就一起來暢談自己的理想。(板書:我的理想)
2、課前同學們不但搜集了關于理想的名言,還搜集了一些故事,下面請同學為大家講述一個周恩來“為中華崛起而讀書”的故事。
總結:理想是美好的,但現在的我們是六年級的小學生,要實現自己遠大的理想,那我們應該怎么做呢?
(1)、讓學生小組內自由討論這個問題,并把討論的結果要點清楚地寫下來。
(2)、各小組代表在班上匯報本組的討論結果。(教師引導學生適當用上“只有??才??,雖然??但是??”等關聯詞。)
引路:孩子們,我們一起看一看我們的理想樹,你的理想是什么呢?(找學生那自己的理想名片貼在理想樹上)
同學們,你有什么樣的理想呢?在實現自己理想的旅途中做為五年級的學生你準備怎么做?
學生1:努力學習,按時完成作業。學生2:腳踏實地,做自己應該做的事。
學生3:做事不要急于求成,不要放棄,相信自己會實現。學生4:合理認識自己,有條理安排自己時間去學習。
(引導學生從理想回到現實,從眼前的、力所能及的事做起,以實現人生理想。)總結與鼓勵: 洪常小學一年級語文上冊第一單元“基于標準的教學”教學設計
理想是還沒有實現的東西,是對未來的美好憧憬和希望,這要求我們好好把握今天,努力學習,打下堅實的知識基礎,才能擁有美好的明天,理想的實現前提是把握人生。孩子們,我們帶著感恩,一起祝福我們實現理想吧!音樂:《感恩的心》,感恩的心,感謝有你,伴我一生,讓我有勇氣作我自己,感恩的心,感謝命運,花開花落,我依然會珍惜??
伴隨著這動人的歌曲,我宣布“談感恩,暢理想”到此結束。板書設計:
童 心
學會感恩:父母 老師 朋友 社會 ?? 我的理想:醫生 宇航員 科學家 ??課后反思:
第四篇:jsp教案6
湖南城市學院教師備課紙
第 6 次課
題
JSP內置對象(Exception、application、page、PageContext、config)及其應用
目的要求
掌握Exception、application、page、PageContext、config對象的屬性、方法及應用
教學重點
JSP內置對象的含義、屬性、方法及使用 教學難點 各對象的綜合運用 教學課時 4(含2課時上機)
教學方法 講解、示例與啟發式教學相結合 教學內容和步驟
JSP內置對象是不需要聲明,直接可以在JSP中使用的對象,JSP有以下幾種內置對象: request, reponse, out, session, application, config, pagecontext, page, exception.6.1 aplication對象 6.1.1 什么是application application是執行javax.Servlet.ServletContext界面的類,主要用于保存用戶信息,代碼片段的運行環境; 它是一個共享的內置對象,即一個容器中的多個用戶共享一個application對象,故其保存的信息被所有用戶所共享。服務器啟動后就產生了這個application對象,當客戶再所訪問的網站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務器關閉。但是與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內置的application對象。6.1.2 Application對象常用方法
(1)public void setAttribute(String key,Object obj): 將參數Object指定的對象obj添加到application對象中,并為添加的對象指定一個索引關鍵字。
(2)public Object getAttribute(String key): 獲取application對象中含有關 鍵字的對象。(3)public Enumeration getAttributeNames():獲取application對象中含存
儲的對象的名字。
(4)public void removeAttribute(String name)(5)public String getMajorVersion()取得服務器支持的主版本號。(6)public String getMinorVersion()取得服務器支持的次版本號。(7)public String getServerInfo()(8)public String getRealPath()例1:application.jsp
<% Object obj = null;String strNum =(String)application.getAttribute(“Num”);int Num = 0;//檢查是否Num變量是否可取得 if(strNum!= null)Num = Integer.parseInt(strNum)+ 1;//將取得的值增加1 application.setAttribute(“Num”, String.valueOf(Num));//起始Num變量值 %> application對象中的Num變量值為 <%= Num %>
第五篇:jsp教案8
湖南城市學院教師備課紙
第 8 次課
題 JAVA服務器小程序(ServLet)之Servlet鏈、編程應用
目的要求 掌握Servlet鏈的含義及編程應用 教學重點 ServLet鏈的構建與Shtml的使用 教學難點 ServLet鏈的構建 教學課時 4(含2課時上機)
教學方法 講解、示例與啟發式教學相結合 教學內容和步驟 8.1 Servlet鏈
8.1.1 什么是servlet鏈
Servlet鏈,它是JvavServer體系結構的高級特征之一, 與UNIX和DOS命令中的管道類似,你也可以將多個servlet以特定順序鏈接起來。在servlet鏈中,一個servlet的輸出被當作下一個servlet的輸入,而鏈中最后一個servlet的輸出被返回到瀏覽器。8.1.2表過濾器(Table Filter)我們以表過濾器看看如何編寫一個可以被用于鏈接的servlet,這個表過濾器servlet將分析另一個servlet的輸出,查找含有特殊表格式指令的HTML注釋,這些指令包括表有多少列、是否顯示表頭等等。在該表格式指令之后的所有行將會被格式化成一個HTML表格。這樣,鏈中的前一個servlet只要簡單地將數據用逗號分割,數據就可以一行一行地直接輸出了,而無須將這些數據格式化成HTML表格。同樣,當你決定修改這個表格的格式時,你就不必修改產生數據的servlet,而直接修改這個表過濾器servlet就可以了。
這個表過濾器servlet實現了HTTP服務的方法。首先,它必須重復(echo)上一個servlet中設置的頭信息。這些信息包括內容類型、調用的URL、遠程主機等等。TableFilter.java顯示了設置這些頭信息的必要代碼。
例1:TableFilter.java
package javaservlets.samples;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TableFilter extends HttpServlet
{
/**
*
Performs an HTTP service request
* @param req The request from the client
* @param resp The response from the servlet
*/
public void service(HttpServletRequest req,HttpServletResponse resp)
throws ServletException, java.io.IOException
{
// Get all headers set by the previous servlet and echo them
java.util.Enumeration e = req.getHeaderNames();
while(e.hasMoreElements()){
String header =(String)e.nextElement();
String value = req.getHeader(header);
resp.setHeader(header, value);
} // 如下述代碼所示,接下來的步驟是取得一個可以從前一個servlet的輸出流中講讀取數據的輸入流,如果該輸入流的內容類型是某種我們可以分析的類型(如HTML),我們就繼續下一步驟;否則,我們就從輸入流中讀出所有字節并毫不修改地把它們寫回瀏覽器。
// Get the input and output streams
ServletInputStream in = req.getInputStream();
ServletOutputStream out = resp.getOutputStream();
// Only process if this is a recognized MIME type
String type = req.getContentType();
if(type.equals(“text/html”)||
type.equals(“text/table”)||
type.equals(“application/x-www.tmdps.cnmand, process
// the line
if(inTable){
// Search for the end of the table
if(s.startsWith(””);
// Output the table
out.println(“Symbol,Element”);
out.println(“Ac,Actinium”);
out.println(“Ag,Silver”);
out.println(“Al,Aluminum”);
//Etc...out.println(“Y,Yttrium”);
out.println(“Yb,Ytterbium”);
out.println(“Zn,Zinc”);
out.println(“Zr,Zirconium”);
out.println(“”);
// Wrap up
out.println(“”);
out.flush();
out.close();
}
在你瀏覽器的URL中輸出“/Elements”調用我們在Jrun中配置的servlet映射。在刷新時,瀏覽器向Web服務器發出URL請求,Web服務器找到與這個URL信息對應的servlet映射,然后調用Elemetns Servlet。Elements Servlet處理GET請求并返回未格式化的元素周期表數據給Web服務器。之后,Web服務器發現存在servlet鏈接,于是將Elements Servlet的輸出重定向為servlet鏈接中下一個servlet,也就是表過濾器的輸入。表過濾器重新設置所有HTTP首部,以適應表過濾器的需要,然后讀入所有元素周期表數據,表過濾器使用指定的表格格式信息來分析和處理這些數據,最后生成一個格式化的元素周期表。
⑶ Mime類型
觸發servlet鏈接的另外一種方法是將一個servlet與特定Mime類型聯系起來。當這種Mime類型的應答產生時,輸出就會被發送給與之相聯系的servlet。由于MIME類型是在servlet向輸出流中寫入時才確定的,所以用這種方法你可以輕易地將servlet的輸出重定向到其他servlet。
① Java Web Server
如前所述,在所有的工作之前,你必須確認servlet鏈接功能已經啟用(見圖4.4)。截止到本書發稿,還沒有可以管理MIME類型和servlet映射的圖形用戶接口(GUI),所以你不得不手工編輯“mimeservlets.properties”文件。這個文件位于目錄“/
# This file maps mime-types to the servlets which process them
# This is used by the filter manager to set up chains of servlets
# where the ouput of one servlet gets piped to the input of
# another servlet based on the mime-type that the servlet specifies
# with setContentType(“mime-type”)
#
# The default servlet for all mime-types is file.Do not set this
# explicitly.#
# Entries in this file should be of the form
# mime-type/servletname
# ie.# foo/bar=fooServlet
# where fooServlet is defined in servlets.properties
java-internal/parsed-html=ssi
java-internal/template-content=template
② Jrun
在JRun中,你可以通過系統管理應用程序設置MIME類型映射。如圖4.10所示,你可以把一個servlet和特定的MIME類型聯系起來。
MIME類型鏈接的例子:Indy 500
為了說明如何通過MIME類型來觸發servlet鏈接,讓我們編寫一個列出Indianapolis 500自1911年起的所有優勝者。就像Elements Servlet一樣,我們直接將輸入用逗號分隔的各行數據,并用表過濾器將其格式化成HTML表格形式輸出。惟一的不同在于我們設置了一個不同的MIME類型,通過這個MIME類型,Web服務器將Indy 500 Servlet的輸出重定向為表過濾器servlet的輸入(見例3)。
例3 Indy500.java
package javaservlets.samples;
import javax.servlet.*;
import javax.servlet.http.*;
/**
This is a simple servlet that will return a list of
* past Indianapolis 500 winners
*/
public class Indy500 extends HttpServlet
{
/**
*
Performs the HTTP GET operation
* @param req The request from the client
* @param resp The response from the servlet
*/
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException, java.io.IOException{
// Create a PrintWriter to write the response
java.io.PrintWriter out =
new java.io.PrintWriter(resp.getOutputStream());
// Set the content type of the response
resp.setContentType(“text/table”);
// Print the HTML header
out.println(“”);
out.println(“
”);out.println(“
”);// Output special table formatting instructions for // the TableFilter servlet out.println(“”);out.println(“Planet,Avg.Distance from Sun,” + “Time to orbit,Time to spin,Moons”);out.println(“Mercury,58 million km,88 days,58.6 days,0”);out.println(“Venus,108 million km,225 days,243 days,0”);out.println(“Earth,150 million km,365.25 days,24 hours,1”);out.println(“Mars,228 million km,687 days,24.62 hours,2”);out.println(“Jupiter,778 million km,11.9 years,9.83 hours,16”);out.println(“Saturn,1427 million km,29.5 years,10.65 hours,19”);out.println(“Uranus,2870 million km,84 years,17.23 hours,15”);out.println(“Neptune,4497 million km,164.8 years,16 hours,8”);out.println(“Pluto,5913 million km,248 years,6.375 days,1”);out.println(“”);// Wrap up out.println(“”);out.flush();out.close();
} /** *
Initialize the servlet.This is called once when the * servlet is loaded.It is guaranteed to complete before any * requests are made to the servlet * * @param cfg Servlet configuration information */
public void init(ServletConfig cfg)
throws ServletException{
super.init(cfg);
}
/**
*
Destroy the servlet.This is called once when the servlet
* is unloaded.*/
public void destroy()
super.destroy();
}
}
和前面的servlet一樣,Solar System Servlet將直接輸出無格式的數據而將格式化的工作交由表過濾器servlet來完成。由于Java Web Server不支持用HTTP請求觸發servlet鏈接,我們將使用JRun。圖4.14顯示了Solar System Servlet和表過濾器servelt鏈接起來以后的輸出結果。請注意調用servlet時使用的URL,在這種情況下,URL中包含了一個鏈接在一起的servlet名字,它們之間用逗號來間隔。8.2 Java Servlet 編程及應用 8.2.1服務器端包含
服務器端包含(Server-Side Includes)是Web 頁面設計中的一種常用技術,在一個輸出很多網頁的系統中,經常會有一些網頁的組成部分在多個網頁中同時出現。Server-Side Includes 是Java Server 體系結構的一個高級特征,它可以在HTML 文檔中嵌入servlet,這樣就可以利用一個或多個servlet 來組成最終的HTML 文檔,這種特殊的包含了Servlet 輸出和HTML 標記的文件用擴展名.shtml 表示。
Servlet 標記的語法:
<servlet name=Servlet_name code=Servlet.class codebase=類路徑
名稱 1 = 參數值 1
名稱 2 = 參數值 2
........名稱 n = 參數值 n >
<param name =名稱 1 value = 參數值 1 param name =名稱 2 value = 參數值 2........param name =名稱 n value = 參數值 n > </servlet>
編程思路及技巧:下面是一個完整的簡單的服務器包含(SSI)的實例,整個shtml 頁面由2個Servlet 組成,第1個Servlet是Header.java,代表頁頭,主要功能是顯示標題信息;第2個Servlet 是Footer.java,代表頁腳,主要功能是顯示頁腳的版權信息;Together.shtml 是將2個Servlet 組合在一起顯示的服務器包含,它應當從文檔根目錄(如root)中加載。
例5: Header.java
import javax.servlet.*;import java.io.*;public class Header extends GenericServlet { public void service(ServletRequest req,ServletResponse resp)throws ServletException, IOException
{ res.setContentType(“text/html;charset=gb2312”);
PrintWriter out =res.getWriter();
// Get the title of the page.Set to empty string if
// no title parameter was given
String titles[] = req.getParameterValues(“title”);
String title = “";
if(titles!= null){
if(titles.length > 0){
title = titles[0];
}
}
Footer.java import javax.servlet.*;import java.io.*;public class Footer extends GenericServlet{ public void service(ServletRequest req,ServletResponse resp)throws ServletException, IOException
{ res.setContentType(”text/html;charset=gb2312“);
PrintWriter out =res.getWriter();
// Format the standard header
out.println(”<hr>“=;
out.println(”<p align='center'><i> 版權所有,信息公司</i></p>“=;
// Wrap up
out.flush();
out.close();
}
/** * <p>Returns information about this servlet */ public String getServletInfo(){
return ”Footer “;
} public void init(ServletConfig cfg)throws ServletException
{
super.init(cfg);} public void destroy(){
super.destroy();
} } 8.2.2使用Java Servlet API 進行會話管理
javax.servlet.http.HttpSession 接口封裝了HTTP 會話的細節,該會話與一段時間內特定的Web 客戶對Web 服務器的多個請求相關。管理會話數據主要涉及到3個方面:會話交換、會話重定位和會話持久性,只有實現了java.io.Serializable 接口的數據對象才能夠被交換、重定位和保持。這個接口主要是讓對象具有序列化的能力,它可以將對象的狀態信息寫入任意的輸出流中如:文件、網絡連接等。
編程思路:下面是實現一個簡單在商場購物的例子,當用戶選購商品(糖果、收音機和練習簿)放入購物袋中,保存選購的商品信息。編程技巧說明:
在Servlet 中進行會話管理時,首先要獲得會話對象。HttpServletRequest.getSession()對象返回與請求相關的當前HttpSession 對象,并且當該對象不存在時就新創建一個對象;HttpServletRequest.getSession(true)實現相同的功能。如果參數是false,當不存在會話對象時,將返回一個null 值。
8.3 小結
在本講中,我們討論了servlet鏈及編程應用,這是JavaServer體系結構的高級特征之一。servlet鏈接提供了將一個servlet的輸出重定向為另一個servlet的輸入的能力。這樣,你就可以劃分工作,從而使用一系列servlet來實現它。另外,你還可以將servlet組織在一起以提供新的功能。
作
業
①:用ServLet編程完成向瀏覽器輸出一個九九乘法表的表格 ②:在TOMCAT環境下配置shtml頁面的運行環境并完成教案上的例5。教學總結:
上機實驗八:ServLet鏈與Shtml的使用(2課時)
一、實驗目的及要求
1.掌握ServLet鏈在各種WEB服務器中的配置
2.掌握觸發ServLet鏈的各種方法及如何編寫ServLet鏈 3.掌握shtml的使用
二、實驗環境
Myeclipse、Tomcat、JDK
三、實驗內容
1.上機完成教案上所有的示例
2.編寫shtml頁面嵌入如下二個servlet并分析運行結果 Header.java
import javax.servlet.*;import java.io.*;public class Header extends GenericServlet { public void service(ServletRequest req,ServletResponse resp)throws ServletException, IOException
{ res.setContentType(”text/html;charset=gb2312“);
PrintWriter out =res.getWriter();
// Get the title of the page.Set to empty string if
// no title parameter was given
String titles[] = req.getParameterValues(”title“);
String title = ”“;
if(titles!= null){
if(titles.length > 0){
title = titles[0];
}
}
Footer.java import javax.servlet.*;import java.io.*;public class Footer extends GenericServlet{ public void service(ServletRequest req,ServletResponse resp)throws ServletException, IOException
{ res.setContentType(”text/html;charset=gb2312“);
PrintWriter out =res.getWriter();
// Format the standard header
out.println(”<hr>“=;
out.println(”<p align='center'><i> 版權所有,信息公司</i></p>“=;
// Wrap up
out.flush();
out.close();
}
/** * <p>Returns information about this servlet */ public String getServletInfo(){
return ”Footer ";
} public void init(ServletConfig cfg)throws ServletException
{
super.init(cfg);} public void destroy(){
super.destroy();
} } 3.在Myeclipse環境下完成教材P143頁中習題6-1與6-2
四、實驗步驟
略
五、實驗思考
1.怎樣利用Servlet實現頁面重定向?
2.比較在TOMCAT與JRUN下配置Servlet鏈的異同