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í)體的長度(以字節(jié)為單位)。
gtUestPrincipal():返回java.security 類的Principal 對(duì)象挤土,其中包含有目前授權(quán)用戶的名字琴庵。
iUserInRole(String role):返回一個(gè)布爾值,指示某個(gè)授權(quán)用戶是否包含在某個(gè)具體的邏輯角色role 中仰美。
gtRemoteHost():如果用戶已經(jīng)被授權(quán)迷殿,則返回提交請(qǐng)求的用戶的注冊名字,否則返回一個(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)頭的長度。
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):檢測指定的頭信息是否存在洗出。返回一個(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ì)象,但使用也是最為簡單的慕的。
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ò)誤的簡單消息描述额港。
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 : 魏振恒