jsp內(nèi)置對象詳解
JSP基于Java語言,面向?qū)ο笠彩撬囊淮筇厣?JSP中包含大量的內(nèi)置對象和可擴展的組件對象.可以說,對象是JSP編程技術(shù)的精髓.在這一章中,我們將介紹JSP中的對象,重點講述JSP的內(nèi)置對象,說明它們的功能,并通過示例來介紹它們的使用方法. 掌握J(rèn)SP的內(nèi)置對象的用法,基本掌握J(rèn)SP的開發(fā)技巧 要求 能靈活應(yīng)用JSP的內(nèi)置對象來開發(fā)程序 技能 介紹JSP的內(nèi)置對象 理論 3.1 對象與內(nèi)置對象 對象是典型的具有方法,屬性和集合的事物 對象的屬性反映了對象的狀態(tài),可以讀取或設(shè)置.對象的集合是由很多不同的與對象有關(guān)系的屬性和值的配對組成的. 對于一般的對象,要想使用它,必須先聲明一個類,再將它實例化,就會得到一個可以使用的對象. 下面我們通過一個例子來講解一般對象的使用方法. 文件useobject.jsp _____ JSP程序中8個默認(rèn)的內(nèi)置對象 對于它們而言,不用聲明就可以直接使用.這8個對象分別是request,response,pageContext,session,application,out,config和page. page 實現(xiàn)處理本頁當(dāng)前請求的類的實例 java.1ang.Object page page 本 JSP 的 ServletConfig javax.servlet.ServletConfig config page 向輸出流寫入內(nèi)容的對象 Javax.servlet.jsp.JspWriter out application 從 servlet 配置對象獲得的 servlet 上下文(如在 getServletConfig() ,getContext()的調(diào)用中) Javax.servlet.ServletContext application session 為請求的客戶創(chuàng)建的session對象 Javax.servlet.http.HttpSession session page 本 JSP 的頁面上下文 Javax.servlet.jsp.PageContext pageContext page 對請求的應(yīng)答 依賴協(xié)議的java.servlet.ServletResponse 子類(例如,javax.servlet.HttpServletResponse) response request 觸發(fā)服務(wù)調(diào)用的請求 依 ??協(xié)議的java.servlet.ServletRequest 子類(例如,javax.servlet.HttpServletRequest) Request 范圍 代表內(nèi)容 類型 內(nèi)置對象 3.2 request對象 request對象是ServletRequest的一個實例.當(dāng)客戶端請求一個JSP網(wǎng)頁時,JSP引擎會將客戶端的請求信息包裝在這個request對象中,請求信息的內(nèi)容包括請求的標(biāo)題頭(Header),信息(如瀏覽器的版本信息,語言和編碼方式等),請求的方式(如HTTP方法:GET,POST,PUT等),請求的參數(shù)名稱,參數(shù)值和客戶端的主機名稱等,然后將request對象當(dāng)作jspService方法的HttpServletRequest參數(shù)值,所以我們可以通過這個對象來取得有關(guān)客戶端的請求信息. 3.2.1 request對象的方法 方法 返回接收請求的端口 getServerPort 返回接收請求的服務(wù)器的主機名 getServerName 返回發(fā)出請求的 URL 的機制 getScheme 返回發(fā)送請求的接口程序的完全限定的主機名 getRemoteHost 返回發(fā)送請求的接口程序的 IP 地址 getRemoteAddr 返回運用替換規(guī)則從虛擬地址中獲得的實際地址 getRealPath 返回從請求體中讀取的文本的緩存數(shù)據(jù) getReader 返回請求的協(xié)議和版本號 getProtocol 返回作為字符串列舉的指定參數(shù)的值 getParameterValues 返回本次請求的參數(shù)名字 getParameterName 返回包含指定參數(shù)的單獨值的字符串 getParameter 返回在請求體中讀取二進(jìn)制數(shù)據(jù)的輸入流 getlnputStream 返回請求實體數(shù)據(jù)的 InternetMedia 類型 getContenType 返回請求實體數(shù)據(jù)的大小 getContentLength 返回為請求的輸入進(jìn)行編碼的字符集合 getCharacterEncoding 返回請求的給出名字的屬性的值 getAttribute 描述 方法 request對象使用示例 1. request對象獲取服務(wù)器及客戶端的信息 文件 request1.jsp 2. 用request對象來獲取和處理表單傳過來的參數(shù)值 (1) 建立HTML表單 (2) 使用GET和POST方法 (3) 用request對象處理 用戶輸入的數(shù)據(jù)用來存放在request對象里,用javax.servlet.HttpServletRequest來執(zhí)行,你可以在JSP代碼中直接訪問request對象.并且處理表單傳送過來的數(shù)據(jù). 文件 request3.htm request3.jsp 3. 用request對象來獲取和處理表單傳過來的中文參數(shù)值的處理 文件 request2.htm request2.jsp 3.3 response對象 response對象的類型是javax.servlet.ServletResponse類的實例,JSP引擎會根據(jù)客戶端的請求信息建立一個默認(rèn)的response對象.它用于將瀏覽器參考信息,如回應(yīng)的Header,回應(yīng)本體(HTML的內(nèi)容)以及服務(wù)器端的狀態(tài)碼等信息提供給客戶端. 3.3.1 response對象的方法 重定向客戶端的地址 sendRedirect 設(shè)定指定名字的HTTP文件頭的值 setHeader 向客戶端發(fā)送錯誤信息 sendError 判斷指定的HTTP文件頭是否存在 containsHeader 添加HTTP文件頭(Header),將會傳送到客戶端 addHeader 添加一個Cookie對象,用來保存客戶端的用戶信息 addCookie 為應(yīng)答設(shè)置內(nèi)容類型 setContentType 為應(yīng)答設(shè)置內(nèi)容長度 setContentLength 返回用于格式化文本應(yīng)答的打印程序 getWriter 返回用于書寫二進(jìn)制應(yīng)答數(shù)據(jù)的輸出流 getCharacterEncoding 返回用于MIME編碼的字符集合 getCharacterEncoding 3.3.2 response對象使用示例 下面的示例程序?qū)崿F(xiàn)了定時刷新頁面的功能 文件refresh.jsp 這個程序指定頁面每隔5秒鐘自動刷新一遍,服務(wù)器重新執(zhí)行這個程序,產(chǎn)生新的當(dāng)前時間,然后輸出到客戶端.所以,頁面上顯示的時間每隔5秒鐘就增加5秒鐘,實現(xiàn)了類似時鐘的功能. 下面的示例程序?qū)崿F(xiàn)了頁面重定向功能 文件request2.htm 輸入用戶名為admin,進(jìn)入管理界面;否則,則進(jìn)入普通用戶界面. 3.4 session對象 session對象是JSP中一個很重要的內(nèi)部對象,我們使用它來保存某個特定客戶端(訪問者)一次訪問的一些特定信息. 在JSP網(wǎng)絡(luò)編程中,有多種方法可以保存客戶信息,但是最常用,最實用的還是session對象. 3.4.1 session對象介紹 session對象,實際上就是服務(wù)器與客戶端之間的"會話" (1) session可以用來儲存訪問者的一些特定信息.主機服務(wù)器就是根據(jù)session來跟蹤這些信息的. (2) session可以創(chuàng)建訪問者信息容器. (3) session可以用來跟蹤訪問者的訪問路徑,從中挖掘有用的信息,如訪問者的興趣愛好,訪問目的. 用戶在Web應(yīng)用程序中訪問同一頁面時,session變量始終存在,當(dāng)用戶在應(yīng)用程序的頁之間跳轉(zhuǎn)時,存儲在session對象中的變量也不會清除,當(dāng)然也可以使用session方法顯式地結(jié)束一個會話和設(shè)置空閑會話的超時期限. session在JSP程序中是一個內(nèi)置的對象 每一個客戶端都有一個session對象用來存放于這個客戶端相關(guān)的數(shù)據(jù). 在JSP的程序中,通常不用任何代碼,就可以直接使用session對象.不過為了確認(rèn),可以加入以下代碼,以表示需要啟動session功能. 如果設(shè)置上述的session值為false,則說明禁用session功能. session對象的類為HttpSession,它提供了很多使用的方法. 3.4.2 session對象的方法 session對象的類是HttpSession.HttpSession由服務(wù)器的程序?qū)崿F(xiàn),提供HTTP服務(wù)器和HTTP客戶端之間的會話.會話,就是在給定時間段內(nèi)持續(xù)進(jìn)行多路連接和請求.會話被用來在多頁面請求中保持狀態(tài)和用戶認(rèn)證. session對象的常用方法 移去和會話應(yīng)用層數(shù)據(jù)中指定名字相連的對象 removeValue 將指定的對象和使用指定名字的會話應(yīng)用層數(shù)據(jù)相連 putValue 檢查是否客戶端參加了會話 isNew 使會話無效,并將其從上下文中移出 invalidate 返回和會話相連的應(yīng)用層數(shù)據(jù)對象的名字 getValueNames 返回和應(yīng)用層數(shù)據(jù)中指定名字相聯(lián)系的對象 getValue 返回會話相連的上下文 getSessionContext 返回客戶端上一次發(fā)送攜帶會話賬號的時間 getLastAccessTime 返回會話標(biāo)識符 getId 返回會話創(chuàng)建的時間 getCreationTime 3.4.3 session對象使用示例 為說明session對象的具體應(yīng)用,以用三個頁面模擬一個多頁面的Web應(yīng)用為例 (1) 第一個頁面(q1.html)僅包含一個要求輸入用戶名字的HTML表單 . 文件q1.htm (2)第二個頁面是一個JSP頁面(q2.jsp),它通過request對象提取q1.html表單中的thename值,將它存儲為name變量,然后將這個name值保存到session對象中.q2.jsp的另外一個任務(wù)是詢問第二個問題. (3) 第三個頁面也是一個JSP頁面(q3.jsp),主要任務(wù)是顯示問答結(jié)果,另外一個任務(wù)是提取在第二個頁面中的用戶輸入并顯示它. 通常會話管理是通過服務(wù)器將SessionID作為一個cookie存儲在用戶的Web瀏覽器中來唯一標(biāo)識每個用戶會話 如果瀏覽器不支持cookie,或者將瀏覽器設(shè)置為不接受cookie,我們可通過URL重寫來實現(xiàn)會話管理. 文件hello1.jsp 使用session對象在3個不同的JSP文件中保存信息 文件example0.htm(在accountBalance中必須輸入數(shù)字) 3.5 application對象 application對象保存了一個應(yīng)用系統(tǒng)中一些公用的數(shù)據(jù).與session對象相比,application對象是所有客戶共享的,而session對象則是每個客戶專用的.application對象可以是javax.servlet.ServletContext類型的.ServletContext接口讓servlet訪問關(guān)于其環(huán)境的信息.application對象的范圍是application. 3.5.1 application對象的方法 方法 設(shè)置某個application對象的某個屬性值 setAttribute 獲得當(dāng)前版本的Servlet編譯器的信息 getServerInfo 返回application某個屬性的值 getInitParameter 以Enumeration數(shù)據(jù)形式返回所有application對象的屬性名稱 getAttributeNames 以O(shè)bject對象的形式返回對應(yīng)名稱的application對象的屬性值 getAttribute 含義 對象 3.5.2 application對象的使用示例 一個使用了application對象的計數(shù)器 文件 appcount.jsp 應(yīng)用application內(nèi)建對象,將上面的session例子改為application的例子. 文件 application1.htm 3.6 out對象 out對象用于輸出數(shù)據(jù),它可以是javax.servlet.jsp.JspWriter的一個實例.out對象的范圍是page. 從java.io.Writer拓展而來的公共抽象類JspWriter效仿了java.io.BufferedWriter和java.Io.PrintWriter中的某些功能.但是,不同之處在于它會在打印方法中拋出(throw) java.Io.IOException異常,而PrintWriter不這樣做. JSP中的out對象就是這種類型的.如果page指令選擇了autoflush="true",那么當(dāng)出現(xiàn)由于當(dāng)前的操作不清空緩存而造成緩沖區(qū)溢出的情況時,這個類的所有I/O操作會自動清空緩沖區(qū)的內(nèi)容.如果autoflush="false",那么當(dāng)操作造成了緩沖區(qū)溢出時,這個類的所有的I/O操作將拋出一個IOException. 3.6.1 out對象的變量 autoFlush 類型為protected boolean autoflush 如果變量值為真,則當(dāng)當(dāng)前的操作造成緩沖區(qū)溢出時,緩沖區(qū)會被清空. 如果變量值為假,則如果當(dāng)前操作造成緩沖區(qū)溢出就會拋出一個IOException. bufferSize 類型為protectedintbufferSize 表示緩沖區(qū)目前的大小.初始值根據(jù)不同的設(shè)備而不同,但是不少于8KB. DEFAULT_BUFFER 類型為publicstaticfinalintDEFAULT_BUFFER 表示W(wǎng)riter正使用的缺省的緩沖區(qū)大小設(shè)置. No_BUFFER 類型為Public static final int NO_BUFFER 表示W(wǎng)riter是否處于緩存輸出狀態(tài). 3.6.2 Out對象的方法 方法 打印一個對象 Object 打印一個長整數(shù) long 打印一個整數(shù) int 打印一個浮點數(shù) float 打印一個雙精度浮點數(shù) double 打印一個字符數(shù)組 char[] 打印一個字符 char 打印一個布爾值 boolean 寫一行分隔符 _ newLine 獲得autoFlush的當(dāng)前值 _ isAutoFlush 獲得緩沖區(qū)中未使用的字節(jié)數(shù) _ getRemaining 獲得緩沖區(qū)的大小 _ getBufferSize 清除緩沖區(qū)的流 _ clearBuffer Clear 清除緩沖區(qū)內(nèi)容 _ Clear 輸出流 _ flush 關(guān)閉流,并輸出 _ Close 描述 參數(shù) 方法 打印一個字符串,然后結(jié)束行 String println 打印一個對象,然后結(jié)束行 Object println 打印一個長整數(shù),然后結(jié)束行 long println 打印一個整數(shù),然后結(jié)束行 int println 打印一個浮點數(shù),然后結(jié)束行 float println 打印一個雙精度浮點數(shù),然后結(jié)束行 double println 打印一個字符數(shù)組,然后結(jié)束行 char[] println 打印一個字符,然后結(jié)束行 char prinfln 打印一個布爾值,然后結(jié)束行 boolean println 通過寫一個行分隔符來結(jié)束當(dāng)前行 _ println 打印一個字符串 String 3.6.3 Out對象的使用示例 用out對象輸出多種不同類型的數(shù)據(jù),包括輸出中文 文件out.jsp 3.7 其他對象 pageContext對象 pageContext對象是javax.servlet.jsp.PageContext類的一個實例.pageContext對象提供了存取所有關(guān)于JSP程序執(zhí)行時所需要用到的屬性和方法,如session,application,config,out等對象屬性.對于pageContext對象,它的范圍是page. page對象 page對象是java.lang.Object類型的,它是處理當(dāng)前請求的JSP頁的實現(xiàn)類的實例.page對象在頁的正文中可以被看作"this"的同義詞.page對象的范圍是page. config對象 config對象是javax.servlet.ServletConfig類型的.它提供存取servlet class初始參數(shù)及有關(guān)Server環(huán)境信息的ServletContext對象.config對象的范圍是page. |