JSP的內(nèi)置對(duì)象

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è)頁面。



undefined_騰訊視頻

提問與回答

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 : 魏振恒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容