JSP中隱式對象的名稱 範圍名稱 具體的類型
pageContext page javax.servlet.jsp.PageContext
request request javax.servlet.ServletRequest (顯示完數據就沒有用了)
session session javax.servlet.http.HttpSession (顯示完數據了,過一會自己 還要用)
application application javax.servlet.ServletContext (顯示完數據了,大家都要用。不建議使用,如果使用,必須同步處理)
JSP九大內置對象
JSP的內置對象引用名稱 對應的類型
request HttpServletRequest
response HttpServletResponse
session HttpSession(有開關的:page指令的session屬性的取值)
application ServletContext
config ServletConfig
page this(當前Servlet對象)
exception java.lang.Throwable(有開關的:page指令的isErrorPage屬性改爲true)
out JspWriter pageContext javax.servlet.jsp.PageContext非常重要
pageContext有三大作用:
1、本身是一個域對象。同時還能操作其他三個域對象(PageContext ServletRequest HttpSession ServletContext) 本身表示的域範圍 是本頁面。
void setAttribute(String name,Object value)
void removeAttribute(String name)
Object getAttribute(String name) 操作其他的三個域對象
void setAttribute(Stringname,Objectvalue,intscope)
void removeAttribute(String name,inscope)
Object getAttribute(String name,int scope) 參數int scope是由PageContext類提供的靜態變量規定的。
PageContext.PAGE_SCOPE:頁面範圍(是PageContext本身中的那個Map,代號page):僅在本頁 中可用
PageContext.REQUEST_SCOPE:請求範圍(是ServletRequest中的那個Map,代號request):當有 request請求時
PageContext.SESSION_SCOPE:請求範圍(是HttpSession中的那個Map,代號session):用的很多, 會話期間
PageContext.APPLICATION_SCOPE:請求範圍(是ServletContext中的那個Map,代號application): 用的不多,全局可用,也就是該應用都可用,注意:使用時,應該加上同步處理,而且同步應該包括少部分的代碼,效率低。 (非常有用)Object findAttribute(String name):
依次按照page request session application範圍搜索指定名稱的 對象,找到爲止 。
2、獲取其他8個隱式對象 getxxx 3、提供了轉發和包含的方便方法 RequestDispatcher rd = request.getRequestDispatcher("/url");
rd.forward(request,response); pageContext.forward("url"); pageContext.include("url");
內置對象(又叫隱含對象,有9個內置對象):不需要預先聲明就可以在腳本代碼和表達式中隨意使用
1-out:
javax.servlet.jsp.JspWriter類型,代表輸出流的對象。作用域爲page(頁面執行期)
request:javax.servlet.ServletRequest的子類型,此對象封裝了由WEB瀏覽器或其它客戶端生成地HTTP
請求的細節(參數,屬性,頭標和數據)。作用域爲request(用戶請求期)。
方法由可查看API
response:javax.servlet.ServletResponse的子類型,此對象封裝了返回到HTTP客戶端的輸出,向頁面
作者提供設置響應頭標和狀態碼的方式。經常用來設置HTTP標題,添加cookie,設置響應內容的類型和狀
態,發送HTTP重定向和編碼URL。作用域爲page(頁面執行期)。
pageContext:javax.servlet.jsp.PageContext(抽象類)類型,作用域爲page(頁面執行期)。此對象
提供所有四個作用域層次的屬性查詢和修改能力,它也提供了轉發請求到其它資源和包含其他資源的方法
:
該對象的方法都是抽象方法
session:javax.servlet.http.HttpSession類型,主要用於跟蹤對話。作用域session(會話期—)。
HttpSession是一個類似哈希表的與單一WEB瀏覽器會話相關的對象,它存在於HTTP請求之間,可以存儲任
何類型的命名對象。
如果不需要在請求之間跟蹤會話對象,可以通過在page指令中指定session="false"
需要記住的是pageContext對象也可以與session.getAttribute(),session.setAttribute()一樣的方式取
得並設置會話屬性。
application:javax.servlet.ServletContext類型,servlet的環境通過調用getServletConfig
().getContext()方法獲得。作用域是application(整個程序運行期)。它提供了關於服務器版本,應用
級初始化參數和應用內資源絕對路徑,註冊信息的方式
config:javax.servlet.ServletConfig,作用域爲page(頁面執行期)
exception:java.lang.Throwable,通過JSP錯誤頁面中一個catch塊已經益出但沒有捕獲的
java.lang.Throwable的任意實例,傳向了errorPage的URI。作用域爲page(頁面執行期)。注意
exception只有在page指令中具有屬性isErrorPage="true"時纔有效。
page:java.lang.Object類型,指向頁面自身的方式。作用域爲page(頁面執行期
概要
HTTP是無狀態(stateless)協議;
Web Server 對每一個客戶端請求都沒有歷史記憶;
Session用來保存客戶端狀態信息;
由Web Server 寫入;
存於服務器端,其本質遠離通過回送一個cookie對象(含用戶基本數據)給瀏覽器;
客戶端的每次訪問都把上次的session記錄就會調用相應的cookie對象傳遞給Web Server;
Web Server讀取客戶端提交的session來獲取客戶端的狀態信息
application 對象負責提供應用程序在服務器中運行時的一些全局信息,常用的方法有getMimeType和getRealPath等。
out 對象代表了向客戶端發送數據的對象,與“response” 對象不同,通過“out” 對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out” 對象直接向客戶端寫一個由程序動態生成HTML文件。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、flush、getBufferSize和getRemaining,這是因爲“out” 對象內部包含了一個緩衝區,所以需要一些對緩衝區進行操作的方法
“config” 對象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數。
“page” 對象代表了正在運行的由JSP文件產生的類對象,不建議一般讀者使用。
“exception” 對象則代表了JSP文件運行時所產生的例外對象,此對象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用
四個作用域:
何爲作用域
先讓我們看看效果:
大概流程是這樣的,我們訪問04-01/index.jsp的時候,分別對pageContext, request, session,
application四個作用域中的變量進行累加。(當然先判斷這個變量是不是存在,如果變量不存在,則要
把變量初始化成1。)計算完成後就從index.jsp執行forward跳轉到test.jsp。在test.jsp裏再進行一次
累加,然後顯示出這四個整數來。
從顯示的結果來看,我們可以直觀的得出結論:
page裏的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉了,它們就不見了。
request裏的變量可以跨越forward前後的兩頁。但是隻要刷新頁面,它們就重新計算了。
session和application裏的變量一直在累加,開始還看不出區別,只要關閉瀏覽器,再次重啓瀏覽器訪問
這頁,session裏的變量就重新計算了。
application裏的變量一直在累加,除非你重啓tomcat,否則它會一直變大。
而作用域規定的是變量的有效期限。
如果把變量放到pageContext裏,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裏。
從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。
如果把變量放到request裏,就說明它的作用域是request,它的有效範圍是當前請求週期。
所謂請求週期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使
用forward的方式跳轉了多個jsp頁面,在這些頁面裏你都可以使用這個變量。
如果把變量放到session裏,就說明它的作用域是session,它的有效範圍是當前會話。
所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個
請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被
稱爲一個會話(session),而放到會話中的變量,就可以在當前會話的所有請求裏使用。
如果把變量放到application裏,就說明它的作用域是application,它的有效範圍是整個應用。
整個應用是指從應用啓動,到應用結束。我們沒有說“從服務器啓動,到服務器關閉”,是因爲一個服務
器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。
application作用域裏的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。
與上述三個不同的是,application裏的變量可以被所有用戶共用。如果用戶甲的操作修改了application
中的變量,用戶乙訪問時得到的是修改後的值。這在其他scope中都是不會發生的,page, request,
session都是完全隔離的,無論如何修改都不會影響其他人的數據。
我們使用public Object getAttribute(String name)獲得變量值,使用public void setAttribute
(String name, Object value)將變量值保存到對應作用域中。舉個pageContext的例子就是:
// page
Integer countPage = (Integer) pageContext.getAttribute("countPage");
if (countPage == null) {
pageContext.setAttribute("countPage", 1);
} else {
pageContext.setAttribute("countPage", countPage + 1);
}
這裏先從pageContext中取出名爲countPage的整數,因爲返回的都是java.lang.Object類型,所以需要強
制轉換成我們需要的整形。這裏取得的變量如果不存在就會返回null,通過判斷countPage == null來辨
別變量是否存在,如果不存在就設置爲1,如果存在就進行累加,最後使用setAttribute()方法將修改後
的變量值放入pageContext。
將其中的pageContext換成request, session, application就可以操作其他三個作用域中的變量。