1.JSP九大內(nèi)置對(duì)象
jsp的九大內(nèi)置對(duì)象如下所示:
- out:該內(nèi)置對(duì)象的類型是JspWriter,等同與response.getWriter(),用來向客戶端發(fā)送文本數(shù)據(jù);
- config:該內(nèi)置對(duì)象的類型是ServletConfig,對(duì)應(yīng)jsp翻譯成的java文件中的ServletConfig對(duì)象;
- page:該內(nèi)置對(duì)象的類型是Object,在jsp對(duì)應(yīng)的java文件中有這樣一句代碼:Object page=this,即表示該內(nèi)置對(duì)象代表當(dāng)前對(duì)象;
- pageContext:該內(nèi)置對(duì)象的類型是PageContext,是頁面上下文對(duì)象,它是最后一個(gè)沒講的域?qū)ο?后面我們會(huì)詳細(xì)講解;
- exception:該內(nèi)置對(duì)象的類型是Throwable,只有在錯(cuò)誤頁面中可以使用這個(gè)對(duì)象;
- request:該內(nèi)置對(duì)象的類型是HttpServletRequest,代表請(qǐng)求對(duì)象,并且是一個(gè)域?qū)ο螅?/li>
- response:該內(nèi)置對(duì)象的類型是HttpServletResponse,代表響應(yīng)對(duì)象;
- application:該內(nèi)置對(duì)象的類型是ServletContext,一個(gè)應(yīng)用只有一個(gè)application,也是一個(gè)域?qū)ο?,域范圍是整個(gè)應(yīng)用;
- session:該內(nèi)置對(duì)象的類型是HttpSession,也是一個(gè)域?qū)ο螅遣皇敲總€(gè)JSP頁面中都可以使用,如果在某個(gè)JSP頁面中設(shè)置<%@page session=”false”%>,說明這個(gè)頁面不能使用session。
這九個(gè)內(nèi)置對(duì)象中config、page以及exception很少使用,我們知道jsp本身也是一個(gè)Servlet,config對(duì)象中包含的是servlet的配置信息,而我們并沒有在web.xml中對(duì)jsp進(jìn)行配置,所以config對(duì)象就沒有什么用處。其他的內(nèi)置對(duì)象在之前的課程中都已經(jīng)講過了,大家可以參考以前的文檔。
2.pageContext對(duì)象
pageContext對(duì)象是頁面上下文對(duì)象,一個(gè)頁面就對(duì)應(yīng)一個(gè)pageContext對(duì)象。我們知道Servlet有三大域?qū)ο?,而jsp有四個(gè)域?qū)ο?,分別是:
- ServletContext:域范圍是整個(gè)應(yīng)用;
- session:域范圍是整個(gè)會(huì)話,注意一個(gè)會(huì)話中只有一個(gè)用戶,如果要統(tǒng)計(jì)站點(diǎn)的訪問次數(shù),使用的域是ServletContext,因?yàn)檫@個(gè)時(shí)候統(tǒng)計(jì)的是多個(gè)用戶,而非一個(gè)用戶;
- request:域范圍是整個(gè)請(qǐng)求鏈;
- pageContext:域范圍是一個(gè)jsp頁面,在一個(gè)頁面中存數(shù)據(jù)再取數(shù)據(jù)沒有任何意義,所以這里所說的域指的是在當(dāng)前jsp頁面和當(dāng)前jsp頁面中使用的標(biāo)簽之間共享數(shù)據(jù)。
2.1pageContext對(duì)象的功能
pageContext對(duì)象有如下四個(gè)功能:
- 域?qū)ο蠊δ?/li>
- 代理其他域功能
- 全域查找功能
- 獲取其他8個(gè)內(nèi)置對(duì)象功能
(1)我們首先來了解pageContext對(duì)象的域功能:
- void setAttribute(String name,Object value)
- Object getAttribute(String name);
- Void removeAttribute(String name);
(2)代理其他域,所謂代理其他域是指,可以利用pageContext對(duì)象向request、session、application域中存取數(shù)據(jù)。現(xiàn)在我們查看API文檔,看一看pageContext對(duì)象是如何代理其他域?qū)ο?,如圖1-1所示:
圖1-1 pageContext
由圖1-1可知,PageContext類繼承了JspContext類,在其父類中定義了一些與域功能相關(guān)的方法,可以發(fā)現(xiàn),除了在域功能中介紹的那三個(gè)方法,還有另外三個(gè)方法,如下所示:
- Object getAttribute(String name, int scope):
該方法的第一個(gè)參數(shù)是域?qū)傩缘拿Q,第二個(gè)參數(shù)指定是從那個(gè)域中取出域?qū)傩?;在PageContext中已經(jīng)定義了如下幾個(gè)靜態(tài)常量作為scope的可選值:
- int APPLICATION_SCOPE:當(dāng)參數(shù)為這個(gè)常量時(shí),表示從application域中獲取數(shù)據(jù);
- int PAGE_SCOPE:當(dāng)參數(shù)是這個(gè)常量時(shí),表示從page域中獲取數(shù)據(jù);
- int REQUEST_SCOPE:當(dāng)參數(shù)是這個(gè)常量時(shí),表示從request域中獲取數(shù)據(jù);
- int SESSION-SCOPE:當(dāng)參數(shù)是這個(gè)常量時(shí),表示從session域中獲取數(shù)據(jù)。
- void setAttribute(String name,Object value,int scope):
該方法的第一個(gè)參數(shù)指的是域?qū)傩缘拿Q,第二參數(shù)指的是域?qū)傩缘闹担谌齻€(gè)參數(shù)指定域?qū)傩员4娴挠?,scope的取值同上;
- void removeAttribute(String name,int scope):
該方法的第一個(gè)參數(shù)指的是域?qū)傩缘拿Q,第二個(gè)參數(shù)指的是將指定域?qū)傩詮哪膫€(gè)域中移出,scope的取值同上;
有了以上三個(gè)方法,pageContext對(duì)象就可以代理其他三個(gè)域?qū)ο罅?,例如?br />
pageContext.setAttribute(“name”,”zhangsan”,PageContext.SESSION_SCOPE).
(3)獲取其他8個(gè)內(nèi)置對(duì)象,也就是說可以通過pageContext對(duì)象獲取jsp中其他的內(nèi)置對(duì)象。pageContext是如何獲取的呢?我們來看一下幫助文檔,如圖1-2所示:
圖1-2 幫助文檔
圖1-2中,PageContext類中定義了如下八個(gè)方法:
getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中g(shù)etOut()放是在其父類中定義的,有了這些方法,pageContext對(duì)象自然能夠獲取其他八個(gè)內(nèi)置對(duì)象了。
(4)全域查找功能,在PageContext類的父類中定義了如下方法:
- Object findAttribute(String name):該方法是從jsp的四個(gè)域page、request、session、application依次查找指定名稱的域?qū)傩?,如果找到就停止,這說明如果這四個(gè)域中存在同名的屬性,那么返回的數(shù)據(jù)是從page范圍中獲取的。即表示誰的域范圍越小,誰的優(yōu)先級(jí)越高。
注意:這里說的page范圍和九大內(nèi)置對(duì)象中的page對(duì)象不是一個(gè)意思,page范圍可以理解為是pageContext對(duì)象的域范圍,即一個(gè)jsp頁面。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee