JSP的內(nèi)置對(duì)象
大家好,我是IT修真院深圳分院第4期的學(xué)員,一枚正直純潔善良的JAVA程序員
今天給大家分享一下,修真院官網(wǎng)JAVA任務(wù)四,深度思考中的知識(shí)點(diǎn)——JSP的內(nèi)置對(duì)象。
分享人:魏振恒
1.背景介紹
JSP內(nèi)置對(duì)象
雖然目前web開發(fā)更為常見的組合SpringMVC+AJAX,但作為一個(gè)合格的java工程師還是很有必要了解一下JSP的九大內(nèi)置對(duì)象的。像request、response、session這些常用的對(duì)象,即便使用其他框架也是會(huì)經(jīng)常用到的。因此十分有了解的必要。
這些對(duì)象可以在JSP頁面中調(diào)用,而不需要事先定義,這使得JSP編程更加的方便和快捷。其實(shí)這些內(nèi)置對(duì)象都對(duì)應(yīng)著某個(gè)Servlet類,在JSP被翻譯成Servlet之后,這些內(nèi)置對(duì)象會(huì)相應(yīng)轉(zhuǎn)換成對(duì)應(yīng)的類實(shí)例。
九大內(nèi)置對(duì)象
request客戶端請(qǐng)求-----response服務(wù)器響應(yīng)-----page頁面本身
session會(huì)話-----applicationWEB 應(yīng)用本身-----out輸出流
exception錯(cuò)誤異常-----config JSP配置信息-----pageContext頁面上下文
request
request內(nèi)置對(duì)象是最常用的對(duì)象之一,它代表的是java.servlet.HttpServletRequest類的對(duì)象。request內(nèi)置對(duì)象中包含了有關(guān)瀏覽器請(qǐng)求的信息,并提供了多個(gè)用于獲取cookie、header以及session內(nèi)數(shù)據(jù)的方法。所以他的方法很多。
getMethod():返回HTTP請(qǐng)求信息中所使用到的方法名稱;
getServletPath():返回請(qǐng)求信息中調(diào)用Servlet的URL部分;
getQueryString():返回HTTP GET請(qǐng)求信息中URL之后的查詢字符串;
getContentType():返回請(qǐng)求實(shí)體的MIME類型;
getProtocol():返回請(qǐng)求信息中的協(xié)議名名字與版本號(hào);
getPathInfo():返回有關(guān)任何路徑信息;
getServletName():返回接受請(qǐng)求的服務(wù)器主機(jī);
getServletPort():返回服務(wù)器的端口號(hào);
getRemoteHost():返回提交請(qǐng)求的客戶機(jī)的規(guī)范名字;
getRemoteAddr():返回提交請(qǐng)求的客戶機(jī)的IP地址;
getScheme():返回請(qǐng)求使用的模式(協(xié)議)名字;
getParameter():返回客戶端通過表單提交過來的參數(shù)值。例如request.getParameter(“myname”),通過該語句來獲取客戶端傳遞過來的myname 參數(shù)。
getContextPath():返回HTTP 請(qǐng)求中指示請(qǐng)求上下文的部分。
getHeaderNames():返回一個(gè)枚舉類型,此枚舉集合中包含了請(qǐng)求所含有的所有請(qǐng)求名。
getAuthType():返回用于保護(hù)Servlet 的認(rèn)證模式的名字。例如,BASIC,SSL 或者NULL(沒有保護(hù))。
gtRequestURL():返回HTTP 請(qǐng)求信息中的第一行從協(xié)議名開始直至查詢字符串之間的URL 部分。例如,對(duì)HTTP GET 請(qǐng)求http://www.zzbsite.com/helloworld?name=johnson&age=20,這個(gè)方法將返回http://www.zzbsite.com/helloworld 字符串。
gtCountLength():返回整數(shù),表示請(qǐng)求實(shí)體的長(zhǎng)度(以字節(jié)為單位)。
gtUestPrincipal():返回java.security 類的Principal 對(duì)象,其中包含有目前授權(quán)用戶的名字。
iUserInRole(String role):返回一個(gè)布爾值,指示某個(gè)授權(quán)用戶是否包含在某個(gè)具體的邏輯角色role 中。
gtRemoteHost():如果用戶已經(jīng)被授權(quán),則返回提交請(qǐng)求的用戶的注冊(cè)名字,否則返回一個(gè)NULL。
response
response對(duì)象提供了多個(gè)方法用來處理HTTP響應(yīng),可以調(diào)用response中的方法修改ContentType中的MIME類型以及實(shí)現(xiàn)頁面的跳轉(zhuǎn)等等
以下列出常用的方法
setContentLength(int len):此方法用于設(shè)置響應(yīng)頭的長(zhǎng)度。
setContentType(String type):用于設(shè)置HTTP響應(yīng)的contentType中的MIME類型,其中可以包含字符編碼的規(guī)則。例如可以把contentType設(shè)置為“text/html;char
set=GBK”。在Servelet編寫過程中,需要調(diào)用此方法進(jìn)行設(shè)置,但是在JSP中一般都是使用page指令直接指定contentType的屬性。
getOutputStream():此方法返回一個(gè)Servlet的輸出流。用于在響應(yīng)中寫入二進(jìn)制數(shù)據(jù)。Servlet容器不對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼。
getWriter():此方法返回一個(gè)PrintWriter對(duì)象,在Servlet編寫過程使用的比較頻繁,而在JSP文件中,由于out是用getWriter()創(chuàng)建的PrintWriter對(duì)象的隱含對(duì)象,所以可以直接調(diào)用out對(duì)象作輸出響應(yīng)。
getCharacterEncoding():該方法獲得此時(shí)響應(yīng)所采用的字符編碼類型。
sendError(int status):使用指定錯(cuò)誤狀態(tài)碼向客戶機(jī)發(fā)送相應(yīng)的錯(cuò)誤信息。
sendError(int status, String message):使用自定義的錯(cuò)誤狀態(tài)碼以及描述信息向客戶機(jī)發(fā)送錯(cuò)誤的提示信息。
sendRedirect(String location):將請(qǐng)求重新定位到一個(gè)不同的URL(頁面)上。此方法在實(shí)際開發(fā)過程中會(huì)經(jīng)常使用到。
setDateHeader(String headername, long date):把指定的頭名稱以及日期設(shè)置為響應(yīng)頭信息。其中日期是用long值表示的,這是按照從新紀(jì)元開始算起的毫秒數(shù)。
ContainsHeader(String name):檢測(cè)指定的頭信息是否存在。返回一個(gè)布爾類型。
setHeader(String headername, String value):此方法使用指定的頭名字以及相應(yīng)的值來設(shè)置頭信息。如果此頭信息已經(jīng)設(shè)置,則新的值會(huì)覆蓋掉舊的值。如果頭信息已經(jīng)被發(fā)送出去,則此方法的設(shè)置將被忽略。
addheader(String headername, String value):把指定的頭名字以及相應(yīng)值添加到頭信息當(dāng)中去。
addIntHeader(String headername, int value):把指定的頭名字以及整數(shù)值設(shè)置為頭信息。如果頭信息已經(jīng)設(shè)置了,則新的設(shè)置值將覆蓋掉以前的值。
setStatus(int sc):給響應(yīng)設(shè)置狀態(tài)的代碼。
setStatus(int sc, String sm):為響應(yīng)設(shè)置狀態(tài)代碼以及信息。這是在沒有錯(cuò)誤的時(shí)候使用的。
上述方法中,getWriter()和sendRedirect(String location)在實(shí)際開發(fā)中使用的最為頻繁。? ? ? ? ? ? getWriter()常出現(xiàn)在Servlet編寫中。所以這個(gè)代碼展示就用這兩個(gè)。
page
page對(duì)象有點(diǎn)類似于Java編程中的this指針,就是指當(dāng)前JSP頁面本身。page是java.lang.Object類的對(duì)象。
以下列出常用的方法
getClass():返回當(dāng)時(shí)Object的類。
hashCode():返回此Object的哈希代碼。
toString():把此時(shí)的Object類轉(zhuǎn)換成字符串。
equals(Object o):比較此對(duì)象是否和指定的對(duì)象是否相等。
copy(Object o):把此對(duì)象復(fù)制到指定的對(duì)象當(dāng)中去。
clone():對(duì)此對(duì)象進(jìn)行克隆。
session
session是與請(qǐng)求有關(guān)的會(huì)話期,它是java.servlet.http.HttpSession類的對(duì)象,用來表示和存儲(chǔ)當(dāng)前頁面的請(qǐng)求信息。
在實(shí)際的Web應(yīng)用開發(fā)過程會(huì)經(jīng)常遇到這樣的一個(gè)問題:會(huì)話狀態(tài)的維持。當(dāng)然有很多種方法可以用來解決這個(gè)問題,例如:Cookies、隱藏的表單輸入域或者將狀態(tài)信息直接附加到URL當(dāng)中去,但是這些方法使用非常不便。
Java Servlet提供了一個(gè)可以在多個(gè)請(qǐng)求之間持續(xù)有效的會(huì)話對(duì)象HttpSession,此對(duì)象允許用戶存儲(chǔ)和提取會(huì)話狀態(tài)的信息。JSP同樣也支持了Servlet中的這個(gè)概念。JSP中的session內(nèi)置對(duì)象就是對(duì)應(yīng)于Servlet中的HttpSession對(duì)象。當(dāng)Web應(yīng)用系統(tǒng)希望通過多個(gè)頁面完成一個(gè)事務(wù)的時(shí)候,session的使用是非常有用和方便的。
session一般在服務(wù)器上設(shè)置了一個(gè)30分鐘的過期時(shí)間,當(dāng)客戶端停止操作后30分鐘,session中存儲(chǔ)的信息會(huì)自動(dòng)失效。
此外需要注意的,session中保存和查找的信息不能是基本的類型,如int、double等,而必須是Java相對(duì)應(yīng)的對(duì)象,例如Integer、Double等。
以下列出常用的方法
getId():此方法返回唯一的標(biāo)識(shí),這些標(biāo)識(shí)為每個(gè)session而產(chǎn)生。當(dāng)只有一個(gè)單一的值與一個(gè)session聯(lián)合時(shí),或當(dāng)日志信息與先前的sessions有關(guān)時(shí),它被當(dāng)作鍵名用。
getCreationTime():返回session被創(chuàng)建的時(shí)間。最小單位為千分之一秒。為得到一個(gè)對(duì)打印輸出很有用的值,可將此值傳給Date constructor 或者GregorianCalendar的方法setTimeInMillis。
getLastAccessedTime():返回session最后被客戶發(fā)送的時(shí)間。最小單位為千分之一秒。
getMaxInactiveInterval():返回總時(shí)間(秒),負(fù)值表示session永遠(yuǎn)不會(huì)超時(shí)。
getAttribute(String key):通過給定的關(guān)鍵字獲取一個(gè)存儲(chǔ)在session中相對(duì)應(yīng)的信息。例如,Integer item = (Integer) session.getAttrobute("item")。
setAttribute(String key, Object obj):提供一個(gè)關(guān)鍵詞和一個(gè)對(duì)象值,然后存在session當(dāng)中。例如,session.setAttribute("ItemValue", itemName)。
application
application是javax.servlet.ServletContext類對(duì)象的一個(gè)實(shí)例,用于實(shí)現(xiàn)用戶之間的數(shù)據(jù)共享(多使用于網(wǎng)絡(luò)聊天系統(tǒng))。
application對(duì)象與session對(duì)象的區(qū)別
它的作用有點(diǎn)類似session內(nèi)置對(duì)象。但是它們之間還是有區(qū)別的,一般來說,一個(gè)用戶對(duì)應(yīng)著一個(gè)session,并且隨著用戶的離開session中的信息也會(huì)消失,所以不同客戶之間的會(huì)話必須要確保某一時(shí)刻至少有一個(gè)客戶沒有終止會(huì)話;而applicat則不同,它會(huì)一直存在,類似于系統(tǒng)的“全局變量”,而且只有一個(gè)實(shí)例。
application常用方法
getAttribute(String key):通過一個(gè)關(guān)鍵字返回用戶所需要的信息,返回類型為對(duì)象(Object),類似于session中的getAttribute(String key)方法。
getAttributeNames():返回所有可用的屬性名,返回類型為枚舉(Enumeration)。
setAttribute(String key, Object obj):保存一個(gè)對(duì)象信息,并指定給一個(gè)關(guān)鍵字。
removeAttribute(String key):通過關(guān)鍵字來刪除一個(gè)對(duì)象信息。
getServletInfo():返回JSP引擎的相關(guān)信息。
getRealPath(String path):返回虛擬路徑的真實(shí)路徑。
getContext(String URLPath):返回執(zhí)行Web應(yīng)用的application對(duì)象。
getMajorVersion()和getMinorVersion():返回服務(wù)器所支持的Servlet API最大和最小版本號(hào)。
getMineType(String file):返回指定文件的MIME類型。
getResource(String path):返回指定資源的URL路徑。
getResourceAsStream(String path):返回指定資源的輸入流。
getRequestDispatcher(String URLPath):返回指定資源的RequestDispatcher對(duì)象。
getServlet(String name):返回指定名稱的Servlet。
getServlets():返回所有的Servlet,返回類型為枚舉型。
getServletNames():返回所有的Servlet名稱,返回類型為枚舉型。
log(String msg):把指定信息寫入到Servlet的日志文件中。
log(String msg, Throwable throwable):把棧軌跡以及給出的Throwable異常的說明信息寫入Servlet的日志文件。
本次用的是瀏覽器計(jì)數(shù),本段代碼證明application是基于服務(wù)器的,不會(huì)因?yàn)闀?huì)話關(guān)閉就清除。? ? ? ? ? ? 和session對(duì)象一樣,application存儲(chǔ)的是對(duì)象類型而不是普通的數(shù)值類型。此處調(diào)用了application對(duì)象中的getAttribute()方法來獲取前一個(gè)頁面所存儲(chǔ)的信息,并把讀取出的計(jì)數(shù)值加一,然后重新存儲(chǔ)在application當(dāng)中去。
out
out對(duì)象是在JSP開發(fā)過程中使用得最為頻繁的對(duì)象,但使用也是最為簡(jiǎn)單的。
print():在頁面中打印出字符串信息,不換行;
println():在頁面中打印出字符串信息,并且換行;
clear():清除掉緩沖區(qū)中尚存在的內(nèi)容。
clearBuffer():此方法清除掉當(dāng)前緩沖區(qū)中尚存在的內(nèi)容。
flush():清除掉數(shù)據(jù)流。
getBufferSize():返回緩沖區(qū)的內(nèi)存大小,單位為字節(jié)流。如果不進(jìn)行緩沖區(qū)的設(shè)置,大小為0。
getRemaining():此方法返回緩沖區(qū)還剩下多少字節(jié)數(shù)可以使用。
isAutoFlush():檢查當(dāng)前緩沖區(qū)是設(shè)置為自動(dòng)清空,還是滿了就拋出異常。
close():關(guān)閉輸出流。
exception
exception內(nèi)置對(duì)象是用來處理頁面出現(xiàn)的異常錯(cuò)誤,它是java.lang.Throwable類的一個(gè)對(duì)象。前面已經(jīng)講過,在實(shí)際JSP網(wǎng)站開發(fā)過程中,通常是在其頁面中加入page指令的errorPage屬性來將其指向一個(gè)專門處理異常錯(cuò)誤的頁面。如果這個(gè)錯(cuò)誤處理頁面已經(jīng)封裝了這個(gè)頁面收到的錯(cuò)誤信息,并且錯(cuò)誤處理頁面頁面含有的isErrorpage屬性設(shè)置為true,則這個(gè)錯(cuò)誤處理頁面可以使用以下方法來訪問錯(cuò)誤的信息:
getMessage()和getLocalizedMessage():這兩種方法分別返回exception對(duì)象的異常消息字符串和本地化語言的異常錯(cuò)誤。
printStackTrace():顯示異常的棧跟蹤軌跡。
toString():返回關(guān)于異常錯(cuò)誤的簡(jiǎn)單消息描述。
fillInStackTrace():重寫異常錯(cuò)誤的棧執(zhí)行軌跡。
config
config內(nèi)置對(duì)象是ServletConfig類的一個(gè)實(shí)例。在Servlet初始化的時(shí)候,JSP引擎通過config向它傳遞信息。這種信息可以是屬性名/值匹配的參數(shù),也可以是通過ServletContext對(duì)象傳遞的服務(wù)器的有關(guān)信息。
getServletContext():此方法將返回一個(gè)含有服務(wù)器相關(guān)信息的ServletContext對(duì)象。
getInitParameter(String name):返回初始化參數(shù)的值。
getInitParameterNames():返回包含了Servlet初始化所需要的所有參數(shù),返回類型是枚舉型。
一般在JSP開發(fā)過程很少使用到config內(nèi)置對(duì)象。只有在編寫Servlet時(shí),需要重載Servlet的init()方式時(shí)才用到。
pagecontext
pageContext對(duì)象是一個(gè)比較特殊的對(duì)象。它相當(dāng)于頁面中所有其他對(duì)象功能的最大集成者,即使用它可以訪問到本頁面中所有其他對(duì)象,例如前面已經(jīng)描述的request、response以及application對(duì)象等。
getRequest():返回當(dāng)前頁面中的request對(duì)象。
getResponse():使用此方法將返回當(dāng)前頁面中的response對(duì)象。
getPage():此方法返回當(dāng)前頁面中的page對(duì)象。
getSession():返回當(dāng)前頁面中的session對(duì)象。
getOut():返回當(dāng)前頁面中的out對(duì)象。
getException():返回當(dāng)前頁面中的exception對(duì)象。
getServletConfig():返回當(dāng)前頁的config對(duì)象。
getServletContext():返回當(dāng)前頁中的application對(duì)象。
setAttribute(String name):給指定的屬性名設(shè)置屬性值。
getAttribute(String name):根據(jù)屬性名稱找到相應(yīng)的屬性值。
setAttribute(String name, Object obj, int scope):在給定的范圍內(nèi)設(shè)置相應(yīng)的屬性值。
getAttribute(String name, int scope):在指定的范圍內(nèi)獲取到相應(yīng)的屬性值。
findAttribute(String name):尋找一個(gè)屬性并返回,如果沒有找到則返回一個(gè)null。
removeAttribute(String name):通過屬性名刪除掉某個(gè)屬性。
removeAttribute(String name, int scope):在指定的某個(gè)范圍內(nèi)刪除某個(gè)屬性。
getAttributeScope(String scope):返回某屬性的作用域。
getAttributeNamesInScope(int scope):返回指定范圍內(nèi)的所有屬性名的枚舉。
release():釋放掉pageContext()所占的所有資源。
forward(String relativeURLpath):使用當(dāng)前頁面重導(dǎo)到另一個(gè)頁面。
include(String relativeURLpath):使用當(dāng)前位置包含的另一個(gè)頁面。
提問與回答
1、request、session和application的作用域的區(qū)別?
答:request的作用域是當(dāng)前頁面,是生命周期最短的,只在一次提交中有效;session指的是會(huì)話,定義是只要不退出當(dāng)前頁面,這個(gè)session就一直存在;application是項(xiàng)目本身,作用域是所有用戶共享的,生命周期和項(xiàng)目一樣,項(xiàng)目關(guān)閉時(shí)銷毀。?
2、pagecontext怎么使用
pagecontext是頁面上下文,相當(dāng)于spring的配置文件,可以從里面加載內(nèi)置對(duì)象中的所有對(duì)象。
3、Forword和SendRedirect區(qū)別
前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;
后者則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。
所以,前者更加高效,在前者可以滿足需要時(shí),盡量使用forward()方法,并且,這樣也有助于隱藏實(shí)際的鏈接。但在有些情況下,
比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用sendRedirect()方法。
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,
瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,
告訴瀏覽器重新去請(qǐng)求那個(gè)地址,一般來說瀏覽器會(huì)用剛才請(qǐng)求的所有參數(shù)重新請(qǐng)求,所以session,request參數(shù)都可以獲取。
7.參考文獻(xiàn)
網(wǎng)絡(luò)
8.更多討論
歡迎大家交流和討論
鳴謝
感謝大家觀看
BY : 魏振恒