1.JSP九大內(nèi)置對象
jsp的九大內(nèi)置對象如下所示:
- out:該內(nèi)置對象的類型是JspWriter,等同與response.getWriter(),用來向客戶端發(fā)送文本數(shù)據(jù);
- config:該內(nèi)置對象的類型是ServletConfig,對應jsp翻譯成的java文件中的ServletConfig對象;
- page:該內(nèi)置對象的類型是Object,在jsp對應的java文件中有這樣一句代碼:Object page=this,即表示該內(nèi)置對象代表當前對象;
- pageContext:該內(nèi)置對象的類型是PageContext,是頁面上下文對象,它是最后一個沒講的域對象,后面我們會詳細講解;
- exception:該內(nèi)置對象的類型是Throwable,只有在錯誤頁面中可以使用這個對象;
- request:該內(nèi)置對象的類型是HttpServletRequest,代表請求對象,并且是一個域對象;
- response:該內(nèi)置對象的類型是HttpServletResponse,代表響應對象;
- application:該內(nèi)置對象的類型是ServletContext,一個應用只有一個application,也是一個域對象,域范圍是整個應用;
- session:該內(nèi)置對象的類型是HttpSession,也是一個域對象,但是不是每個JSP頁面中都可以使用,如果在某個JSP頁面中設置<%@page session=”false”%>,說明這個頁面不能使用session。
這九個內(nèi)置對象中config、page以及exception很少使用,我們知道jsp本身也是一個Servlet,config對象中包含的是servlet的配置信息,而我們并沒有在web.xml中對jsp進行配置,所以config對象就沒有什么用處。其他的內(nèi)置對象在之前的課程中都已經(jīng)講過了,大家可以參考以前的文檔。
2.pageContext對象
pageContext對象是頁面上下文對象,一個頁面就對應一個pageContext對象。我們知道Servlet有三大域對象,而jsp有四個域對象,分別是:
- ServletContext:域范圍是整個應用;
- session:域范圍是整個會話,注意一個會話中只有一個用戶,如果要統(tǒng)計站點的訪問次數(shù),使用的域是ServletContext,因為這個時候統(tǒng)計的是多個用戶,而非一個用戶;
- request:域范圍是整個請求鏈;
- pageContext:域范圍是一個jsp頁面,在一個頁面中存數(shù)據(jù)再取數(shù)據(jù)沒有任何意義,所以這里所說的域指的是在當前jsp頁面和當前jsp頁面中使用的標簽之間共享數(shù)據(jù)。
2.1pageContext對象的功能
pageContext對象有如下四個功能:
- 域對象功能
- 代理其他域功能
- 全域查找功能
- 獲取其他8個內(nèi)置對象功能
(1)我們首先來了解pageContext對象的域功能:
- void setAttribute(String name,Object value)
- Object getAttribute(String name);
- Void removeAttribute(String name);
(2)代理其他域,所謂代理其他域是指,可以利用pageContext對象向request、session、application域中存取數(shù)據(jù)?,F(xiàn)在我們查看API文檔,看一看pageContext對象是如何代理其他域對象,如圖1-1所示:

圖1-1 pageContext
由圖1-1可知,PageContext類繼承了JspContext類,在其父類中定義了一些與域功能相關的方法,可以發(fā)現(xiàn),除了在域功能中介紹的那三個方法,還有另外三個方法,如下所示:
- Object getAttribute(String name, int scope):
該方法的第一個參數(shù)是域屬性的名稱,第二個參數(shù)指定是從那個域中取出域屬性;在PageContext中已經(jīng)定義了如下幾個靜態(tài)常量作為scope的可選值:
- int APPLICATION_SCOPE:當參數(shù)為這個常量時,表示從application域中獲取數(shù)據(jù);
- int PAGE_SCOPE:當參數(shù)是這個常量時,表示從page域中獲取數(shù)據(jù);
- int REQUEST_SCOPE:當參數(shù)是這個常量時,表示從request域中獲取數(shù)據(jù);
- int SESSION-SCOPE:當參數(shù)是這個常量時,表示從session域中獲取數(shù)據(jù)。
- void setAttribute(String name,Object value,int scope):
該方法的第一個參數(shù)指的是域屬性的名稱,第二參數(shù)指的是域屬性的值,第三個參數(shù)指定域屬性保存的域,scope的取值同上;
- void removeAttribute(String name,int scope):
該方法的第一個參數(shù)指的是域屬性的名稱,第二個參數(shù)指的是將指定域屬性從哪個域中移出,scope的取值同上;
有了以上三個方法,pageContext對象就可以代理其他三個域對象了,例如:
pageContext.setAttribute(“name”,”zhangsan”,PageContext.SESSION_SCOPE).
(3)獲取其他8個內(nèi)置對象,也就是說可以通過pageContext對象獲取jsp中其他的內(nèi)置對象。pageContext是如何獲取的呢?我們來看一下幫助文檔,如圖1-2所示:

圖1-2 幫助文檔
圖1-2中,PageContext類中定義了如下八個方法:
getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父類中定義的,有了這些方法,pageContext對象自然能夠獲取其他八個內(nèi)置對象了。
(4)全域查找功能,在PageContext類的父類中定義了如下方法:
- Object findAttribute(String name):該方法是從jsp的四個域page、request、session、application依次查找指定名稱的域屬性,如果找到就停止,這說明如果這四個域中存在同名的屬性,那么返回的數(shù)據(jù)是從page范圍中獲取的。即表示誰的域范圍越小,誰的優(yōu)先級越高。
注意:這里說的page范圍和九大內(nèi)置對象中的page對象不是一個意思,page范圍可以理解為是pageContext對象的域范圍,即一個jsp頁面。
本文版權歸傳智播客Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://xamj520.com/javaee