JSP內建物件作用域
application:在所有應用程式中有效,即只要這個網站運作著,這個作用域就有效,這個指的程式的運行過程。
session:在目前會話中有效,也就是從瀏覽器存取伺服器開始,這個指的是使用者的一個存取過程,也就是這次會話的開始到結束
request:在目前請求中有效,負責多個servlet之間的資訊共享,即將資訊放入到request中,在整個請求階段都是有效的,即用戶訪問的這個階段都可以獲取到這個資料
#page :在目前頁面有效,即在一個jsp頁面上是有效的。
首先要聲明一點,所謂"作用域"就是"資訊共享的範圍",也就是說一個資訊能夠在多大的範圍內有效。
Web互動的最基本單位為HTTP請求。每個使用者從進入網站到離開網站這段過程稱為一個HTTP會話,一個伺服器的運行過程中會有多個使用者訪問,就是多個HTTP會話。作用域解釋如下。
application:伺服器啟動到停止這段時間。
session:HTTP會話開始到結束這段時間。
request:HTTP請求開始到結束這段時間。
page:目前頁面從開啟到關閉這段時間。
1. application 作用域
application作用域就是伺服器啟動到關閉的整段時間,在這個作用域內設定的資訊可以被所有應用程式使用。 application作用域上的資訊傳遞是透過ServletContext實作的,它提供的主要方法如下所示:
Object getAttribute(String name):從application中取得資訊。
void setAttribute(String name, Object value):在application作用域中設定資訊。
2. session作用域
session作用域比較容易理解,同一瀏覽器對伺服器進行多次訪問,在這多次訪問之間傳遞訊息,就是session作用域的體現。 session是透過HttpSession介面實現的,它提供的主要方法如下所示。
Object HttpSession.getAttribute(String name):從session中取得資訊。
void HttpSession.setAttribute(String name, Object value):向session中儲存資訊。
HttpSession HttpServletRequest.getSession():取得目前請求所在的session的物件。
session的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能透過以下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。 Tomcat的預設值為120分鐘,但這個值也可以透過HttpSession的setMaxInactiveInterval(int interval)方法來設置,如果想主動讓會話結束,例如使用者點擊"登出"按鈕的時候,可以使用HttpSession 的invalidate()方法,用於強制結束目前session。
3. request作用域
一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以透過某種方式傳遞訊息,但這訊息在請求結束後就無效了。
Servlet之間的資訊共享是透過HttpServletRequest介面的兩個方法來實現的。
void setAttribute(String name, Object value):將物件value以name為名稱儲存到request作用域中。
Object getAttribute(String name):從request作用域取得指定名字的資訊。
JSP中的doGet()、doPost()方法的第一個參數就是HttpServletRequest對象,使用這個物件的 setAttribute()方法即可傳遞訊息。
那麼在設定好訊息之後,要透過何種方式將訊息傳遞給其他的Servlet呢?這就要用到RequestDispatcher介面的forward()方法,透過它將請求轉送給其他Servlet。
RequestDispatcher ServletContext.getRequestDispatcher(String path):取得Dispatcher以便轉送。 path為轉送的目的Servlet。
void RequestDispatcher.forward(ServletRequest request, ServletResponse response):將request和response轉送。
因此,只需要在當前Servlet中先透過setAttribute()方法設定對應的屬性,然後使用forward()方法進行跳轉,最後在跳到的Servlet中透過使用getAttribute()方法即可實現訊息傳遞。
PHP的程式設計師可能不太懂這一段,因為PHP沒有轉送的概念,一個請求只能由一個PHP檔來處理,所以PHP根本沒有request作用域的概念。而Servlet則不同,請求可以在應用程式中任意轉發,所以用request作用域在不同Servlet之間傳遞訊息。
注意兩點:
轉送不是重定向,轉送是在Web應用程式內部進行的。 PHP支援重定向但沒有轉送。
轉發對瀏覽器是透明的,也就是說,無論在伺服器上如何轉發,瀏覽器網址列中顯示的仍然是最初那個Servlet的位址。重定向的瀏覽器位址是變化的。
4. page作用域
page物件的作用範圍僅限於使用者要求的目前頁面,對於page物件的參考將在回應傳回給客戶端之後被釋放,或在請求被轉發到其他地方後被釋放。對page物件的參考通常儲存在pageContext物件中。
以上介紹的作用範圍越來越小,request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)。
以上是jsp四大作用域有什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!