JavaWeb-JSP內(nèi)置對象和域?qū)ο?/h1>

每個(gè)JSP 頁面在第一次被訪問時(shí)竟贯,WEB容器都會(huì)把請求交給JSP引擎(即一個(gè)Java程序)去處理。JSP引擎先將JSP翻譯成一個(gè)_jspServlet(實(shí)質(zhì)上也是一個(gè)servlet) 捏卓,然后按照servlet的調(diào)用方式進(jìn)行調(diào)用惑畴。

由于JSP第一次訪問時(shí)會(huì)翻譯成servlet诱渤,所以第一次訪問通常會(huì)比較慢蚌铜,但第二次訪問,JSP引擎如果發(fā)現(xiàn)JSP沒有變化饺谬,就不再翻譯捂刺,而是直接調(diào)用,所以程序的執(zhí)行效率不會(huì)受到影響募寨。

JSP引擎在調(diào)用JSP對應(yīng)的_jspServlet時(shí)族展,會(huì)傳遞或創(chuàng)建9個(gè)與web開發(fā)相關(guān)的對象供_jspServlet使用。

JSP技術(shù)的設(shè)計(jì)者為便于開發(fā)人員在編寫JSP頁面時(shí)獲得這些web對象的引用拔鹰,特意定義了9個(gè)相應(yīng)的變量仪缸,開發(fā)人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用(不需要預(yù)先聲明就可以在腳本代碼和表達(dá)式中隨意使用)。

9大內(nèi)置對象

內(nèi)置對象是在JSP頁面中無需創(chuàng)建就可以直接使用的變量格郁,在JSP中一共有9個(gè)

序號 內(nèi)置對象 含義 類型 作用域
1 pageContext 頁面上下文對象 javax.servlet.jsp.PageContext Page
2 request 請求對象 javax.servlet.http.HttpServletRequest Request
3 response 響應(yīng)對象 javax.servlet.http.HttpServletResponse Page
4 session 會(huì)話對象 javax.servlet.http.HttpSession Session
5 application 應(yīng)用程序?qū)ο?/td> javax.servlet.ServletContext Application
6 config 配置對象 javax.servlet.ServletConfig Page
7 out 輸出對象 javax.servlet.jsp.JspWriter Page
8 page 頁面對象 java.lang.Object Page
9 exception 異常對象 java.lang.Throwable Page

內(nèi)置對象說明

1.pageContext

“頁面上下文”對象腹殿,代表的是當(dāng)前頁面運(yùn)行的一些屬性独悴。
pageContext對象是JSP技術(shù)中最重要的一個(gè)對象例书,它代表JSP頁面的運(yùn)行環(huán)境,這個(gè)對象不僅封裝了對其它8大隱式對象的引用刻炒,它自身還是一個(gè)域?qū)ο?容器)决采,可以用來保存數(shù)據(jù)。并且坟奥,這個(gè)對象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作树瞭,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?/p>

通過pageContext獲取其他對象:
  • getException方法返回exception隱式對象
  • getPage方法返回page隱式對象
  • getRequest方法返回request隱式對象
  • getResponse方法返回response隱式對象
  • getServletConfig方法返回config隱式對象
  • getServletContext方法返回application隱式對象
  • getSession方法返回session隱式對象
  • getOut方法返回out隱式對象

pageContext對象可以作為容器來使用爱谁,因此可以將一些數(shù)據(jù)存儲在pageContext對象中晒喷。
pageContext對象的常用方法:

1 public void setAttribute(java.lang.String name,java.lang.Object value)
2 public java.lang.Object getAttribute(java.lang.String name)
3 public void removeAttribute(java.lang.String name)
4 public java.lang.Object findAttribute(java.lang.String name

重點(diǎn)介紹一下findAttribute方法,這個(gè)方法是用來查找各個(gè)域中的屬性的访敌,查看這個(gè)方法的API可以看到關(guān)于這個(gè)方法的描述:
  Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

當(dāng)要查找某個(gè)屬性時(shí)凉敲,findAttribute方法按照查找順序"page→request→session→application"在這四個(gè)對象中去查找,只要找到了就返回屬性值寺旺,如果四個(gè)對象都沒有找到要查找的屬性爷抓,則返回一個(gè)null。
范例:使用pageContext的findAttribute方法查找屬性值
運(yùn)行結(jié)果:


EL表達(dá)式語句在執(zhí)行時(shí)阻塑,會(huì)調(diào)用pageContext.findAttribute方法献雅,用標(biāo)識符為關(guān)鍵字瀑晒,分別從page、request、 session、application四個(gè)域中查找相應(yīng)的對象鹰霍,找到則返回相應(yīng)對象,找不到則返回”” (注意,不是null极颓,而是空字符串)。

pageContext對象中封裝了訪問其它域的方法

1 public java.lang.Object getAttribute(java.lang.String name,int scope)
2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
3 public void removeAttribute(java.lang.String name,int scope)

代表各個(gè)域的常量有:

1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE 
通過pageContext引入和跳轉(zhuǎn)到其他的資源:

PageContext類中定義了一個(gè)forward方法(用來跳轉(zhuǎn)頁面)和兩個(gè)include方法(用來引入頁面)來分別簡化和替代RequestDispatcher.forward方法和include方法群嗤。
方法接收的資源如果以“/”開頭菠隆, “/”代表當(dāng)前web應(yīng)用。
1.范例:使用pageContext的forward方法跳轉(zhuǎn)到其他頁面

<%@page contentType="text/html;charset=UTF-8"%> 
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
  <title>使用pageContext的forward方法跳轉(zhuǎn)頁面</title>
</head>
<%
    //使用pageContext的forward方法跳轉(zhuǎn)到pageContextDemo05.jsp頁面狂秘,/代表了當(dāng)前的web應(yīng)用
    pageContext.forward("/pageContextDemo05.jsp");
    //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
    //使用RequestDispatcher的forward方法實(shí)現(xiàn)的跳轉(zhuǎn)方式
    //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
%>

注意:
pageContext.forward("/pageContextDemo05.jsp");這種寫法是用來簡化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);這種寫法的骇径。在實(shí)際開發(fā)中,使用pageContext.forward(relativeUrlPath)方法跳轉(zhuǎn)頁面用得不多者春,主要是因?yàn)橐贘sp頁面中嵌套java代碼破衔,所以這種做法簡單了解一下即可,在開發(fā)中钱烟,要想從一個(gè)Jsp頁面采用服務(wù)器端跳轉(zhuǎn)的方式跳轉(zhuǎn)到另一個(gè)Jsp頁面晰筛,那么一般會(huì)使用<jsp:forward>標(biāo)簽,<jsp:forward>標(biāo)簽用于把請求轉(zhuǎn)發(fā)給另外一個(gè)資源拴袭。

使用pageContext的include方法引入資源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
    <title>使用pageContext的include方法引入資源</title>
</head>
<%
    pageContext.include("/jspfragments/head.jsp");
%>
使用pageContext的include方法引入資源
<%
    pageContext.include("/jspfragments/foot.jsp");
%>
<hr/>
<%--
<jsp:include page="/jspfragments/head.jsp"/>
使用jsp:include標(biāo)簽引入資源
<jsp:include page="/jspfragments/foot.jsp"/>
--%>

運(yùn)行結(jié)果:


注意:
在實(shí)際開發(fā)中读第,使用pageContext的include方法引入頁面這種做法也很少用,一般都使用jsp:include標(biāo)簽引入資源拥刻,因此這種做法了解一下即可怜瞒。

2.request

request對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等般哼,封裝了由WEB瀏覽器或其它客戶端生成地HTTP請求的細(xì)節(jié)(參數(shù)吴汪,屬性,頭標(biāo)和數(shù)據(jù)等)蒸眠,是最常用的對象漾橙。作用域?yàn)閞equest(用戶請求期)。
常用的方法有:getParameter楞卡、getParameterNames 和getParameterValues等霜运,通過調(diào)用這幾個(gè)方法來獲取請求對象中所包含的參數(shù)的值,方法可查看API臀晃。
同時(shí)request也是一個(gè)域?qū)ο?/p>

3.response

response對象代表的是對客戶端的響應(yīng)觉渴,此對象封裝了返回到HTTP客戶端的輸出,向頁面作者提供設(shè)置響應(yīng)頭標(biāo)和狀 態(tài)碼的方式徽惋。經(jīng)常用來設(shè)置HTTP標(biāo)題案淋,添加cookie,設(shè)置響應(yīng)內(nèi)容的類型和狀態(tài)险绘,發(fā)送HTTP重定向和編碼URL等踢京。作用域?yàn)閜age(頁面執(zhí)行期)誉碴。
常用方法有:sendRedirect、setContentType瓣距、encodeRedirectURL黔帕、addHeader、addCookie蹈丸、getWriter等

4.Session:

session對象代表服務(wù)器與客戶端所建立的會(huì)話成黄,當(dāng)需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物逻杖、客戶軌跡跟蹤等奋岁。
“session” 對象建立在 cookie的基礎(chǔ)上,所以使用時(shí)應(yīng)注意判斷一下客戶端是否打開了cookie荸百。注意:不要把cookie也理解為九大內(nèi)置對象之一闻伶,cookie主要是實(shí)現(xiàn)了session的作用。
常用方法有:getAttribute够话、setAttribute蓝翰、removeAttribute、setMaxInactiveInterval女嘲、getId畜份、 getValue、 getValueNames和putValue等澡为。

5. application

可將信息保存在服務(wù)器中漂坏,直到服務(wù)器關(guān)閉,否則application對象中保存的信息會(huì)在整個(gè)應(yīng)用中都有效媒至。與session對象相比,application對象生命周期更長谷徙,類似于系統(tǒng)的“全局變量”拒啰。

6.out

out 對象代表了向客戶端發(fā)送數(shù)據(jù)的對象,與“response” 對象不同完慧,通過“out” 對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容谋旦,是文本一級的,可以通過“out” 對象直 接向客戶端寫一個(gè)由程序動(dòng)態(tài)生成HTML文件屈尼。常用的方法除了pirnt和println之外册着,還包括clear、clearBuffer脾歧、flush甲捏、getBufferSize和getRemaining,這是因 為“out”對象內(nèi)部包含了一個(gè)緩沖區(qū)鞭执,所以需要一些對緩沖區(qū)進(jìn)行操作的方法司顿。

7.config

取得服務(wù)器的配置信息芒粹。通過 pageConext對象的getServletConfig() 方法可以獲取一個(gè)config對象。
常用的方法有:getInitParameter和getInitParameterNames大溜,以獲得Servlet初始化時(shí)的參數(shù)化漆。

8.exception

代表了JSP文件運(yùn)行時(shí)所產(chǎn)生的例外對象,此對象不能在一般JSP文件中直接使用钦奋,而只能在使用了page指令“<%@ page isErrorPage="true "%>”的JSP文件中使用
在一般的JSP頁面中使用該對象將無法編譯JSP文件座云。

9. page

“page” 對象代表了正在運(yùn)行的由JSP文件產(chǎn)生的類對象,不建議一般讀者使用付材。

四大域?qū)ο?/h3>

9大內(nèi)置對象中有4個(gè)是域?qū)ο螅?/p>

  • pageContext
  • request
  • session
  • application

域?qū)ο蟮淖饔茫?/h6>

用于保存數(shù)據(jù)疙教,獲取數(shù)據(jù),在不同資源之間共享數(shù)據(jù)伞租。

域?qū)ο蟮姆椒ǎ?/h6>
setAttribute("name",Object) 保存數(shù)據(jù)
getAttribute("name")        獲取數(shù)據(jù)
removeAttribute("name")     清除數(shù)據(jù)
四個(gè)域?qū)ο蟮淖饔梅秶?/h6>
  • page域: 處于同一個(gè)jsp頁面中數(shù)據(jù)共享是有效的
  • request域:處于同一個(gè)請求中數(shù)據(jù)共享是有效的
  • session域:處于同一個(gè)會(huì)話中數(shù)據(jù)共享是有效的
  • application域:處于同一個(gè)web應(yīng)用中數(shù)據(jù)共享是有效的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末贞谓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葵诈,更是在濱河造成了極大的恐慌裸弦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作喘,死亡現(xiàn)場離奇詭異理疙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泞坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門窖贤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贰锁,你說我怎么就攤上這事赃梧。” “怎么了豌熄?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵授嘀,是天一觀的道長。 經(jīng)常有香客問我锣险,道長蹄皱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任芯肤,我火速辦了婚禮巷折,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崖咨。我一直安慰自己锻拘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布掩幢。 她就那樣靜靜地躺著逊拍,像睡著了一般上鞠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芯丧,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天芍阎,我揣著相機(jī)與錄音,去河邊找鬼缨恒。 笑死谴咸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骗露。 我是一名探鬼主播岭佳,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萧锉!你這毒婦竟也來了珊随?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柿隙,失蹤者是張志新(化名)和其女友劉穎叶洞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禀崖,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衩辟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了波附。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺晴。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掸屡,靈堂內(nèi)的尸體忽然破棺而出封寞,到底是詐尸還是另有隱情,我是刑警寧澤折晦,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布钥星,位于F島的核電站,受9級特大地震影響满着,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贯莺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一风喇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缕探,春花似錦魂莫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谜喊。三九已至,卻和暖如春倦始,著一層夾襖步出監(jiān)牢的瞬間斗遏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工鞋邑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诵次,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓枚碗,卻偏偏與公主長得像逾一,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子肮雨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容