JSP頁面中九個內建物件和四個作用域
JSP中內建物件也叫隱含物件,就是不需要預先宣告就可以在指令碼程式碼和表示式中隨意使用。
而這樣的內建物件在JSP中一共有九個以及四個作用域。
所謂“作用域”就是“資訊共享的範圍”,也就是說一個資訊能夠在多大的範圍內有效。4個JSP內建物件的作用域分別為:application、session、request、page 。JSP內建物件作用域表如下:
名稱 |
作用域 |
application |
在所有應用程式中有效 |
session |
在當前會話中有效 |
request |
在當前請求中有效 |
page |
在當前頁面有效 |
Web互動的最基本單位為HTTP請求。每個使用者從進入網站到離開網站這段過程稱為
application 作用域
如果把變數放到application裡,就說明它的作用域是application,它的有效範圍是整個應用。 整個應用是指從應用啟動,到應用結束。我們沒有說“從伺服器啟動,到伺服器關閉”,是因為一個伺服器可能部署多個應用,當然你關閉了伺服器,就會把上面所有的應用都關閉了。 application作用域裡的變數,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。
application作用域上的資訊傳遞是通過ServletContext實現的,它提供的主要方法如下所示:
Object getAttribute(String name) //從application中獲取資訊;
void setAttribute(String name, Object value) //向application作用域中設定資訊。
session作用域
session作用域比較容易理解,同一瀏覽器對伺服器進行多次訪問,在這多次訪問之間傳遞資訊,就是session作用域的體現。如果把變數放到session裡,就說明它的作用域是session,它的有效範圍是當前會話。所謂當前會話,就是指從使用者開啟瀏覽器開始,到使用者關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要使用者不關瀏覽器,伺服器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變數,就可以在當前會話的所有請求裡使用。
session是通過HttpSession介面實現的,它提供的主要方法如下所示:
Object HttpSession.getAttribute(String name) //從session中獲取資訊。
void HttpSession.setAttribute(String name, Object value)//向session中儲存資訊。
HttpSession HttpServletRequest.getSessio() //獲取當前請求所在的session的物件。
session的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能通過如下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。Tomcat的預設值為120分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設定:
void setMaxInactiveInterval(int interval)
如果想主動讓會話結束,例如使用者單擊“登出”按鈕的時候,可以使用 HttpSession 的 invalidate()方法,用於強制結束當前session:void invalidate()request作用域
一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞資訊,但這個資訊在請求結束後就無效了。request裡的變數可以跨越forward前後的兩頁。但是隻要重新整理頁面,它們就重新計算了。如果把變數放到request裡,就說明它的作用域是request,它的有效範圍是當前請求週期。 所謂請求週期,就是指從http請求發起,到伺服器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裡你都可以使用這個變數。
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()方法即可實現資訊傳遞。
需要注意兩點:
1、轉發不是重定向,轉發是在Web應用內部進行的。
2、轉發對瀏覽器是透明的,也就是說,無論在伺服器上如何轉發,瀏覽器位址列中顯示的仍然是最初那個Servlet的地址。
page作用域
page物件的作用範圍僅限於使用者請求的當前頁面,對於page物件的引用將在響應返回給客戶端之後被釋放,或者在請求被轉發到其他地方後被釋放。page裡的變數只要頁面跳轉了,它們就不見了。如果把變數放到pageContext裡,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裡。從把變數放到pageContext開始,到jsp頁面結束,你都可以使用這個變數。
以上介紹的作用範圍越來越小,request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)。
為了讓大家更容易理解application、session、request、page 4個物件的作用範圍,我們給出兩個程式來進行詳細說明。application 作用域
如果把變數放到application裡,就說明它的作用域是application,它的有效範圍是整個應用。 整個應用是指從應用啟動,到應用結束。我們沒有說“從伺服器啟動,到伺服器關閉”,是因為一個伺服器可能部署多個應用,當然你關閉了伺服器,就會把上面所有的應用都關閉了。 application作用域裡的變數,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。
application作用域上的資訊傳遞是通過ServletContext實現的,它提供的主要方法如下所示:
Object getAttribute(String name) //從application中獲取資訊;
void setAttribute(String name, Object value) //向application作用域中設定資訊。
session作用域
session作用域比較容易理解,同一瀏覽器對伺服器進行多次訪問,在這多次訪問之間傳遞資訊,就是session作用域的體現。如果把變數放到session裡,就說明它的作用域是session,它的有效範圍是當前會話。所謂當前會話,就是指從使用者開啟瀏覽器開始,到使用者關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要使用者不關瀏覽器,伺服器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變數,就可以在當前會話的所有請求裡使用。
session是通過HttpSession介面實現的,它提供的主要方法如下所示:
Object HttpSession.getAttribute(String name) //從session中獲取資訊。
void HttpSession.setAttribute(String name, Object value)//向session中儲存資訊。
HttpSession HttpServletRequest.getSessio() //獲取當前請求所在的session的物件。
session的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能通過如下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。Tomcat的預設值為120分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設定:
void setMaxInactiveInterval(int interval)
如果想主動讓會話結束,例如使用者單擊“登出”按鈕的時候,可以使用 HttpSession 的 invalidate()方法,用於強制結束當前session:void invalidate()
request作用域
一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞資訊,但這個資訊在請求結束後就無效了。request裡的變數可以跨越forward前後的兩頁。但是隻要重新整理頁面,它們就重新計算了。如果把變數放到request裡,就說明它的作用域是request,它的有效範圍是當前請求週期。 所謂請求週期,就是指從http請求發起,到伺服器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裡你都可以使用這個變數。
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()方法即可實現資訊傳遞。
需要注意兩點:
1、轉發不是重定向,轉發是在Web應用內部進行的。
2、轉發對瀏覽器是透明的,也就是說,無論在伺服器上如何轉發,瀏覽器位址列中顯示的仍然是最初那個Servlet的地址。
page作用域
page物件的作用範圍僅限於使用者請求的當前頁面,對於page物件的引用將在響應返回給客戶端之後被釋放,或者在請求被轉發到其他地方後被釋放。page裡的變數只要頁面跳轉了,它們就不見了。如果把變數放到pageContext裡,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裡。從把變數放到pageContext開始,到jsp頁面結束,你都可以使用這個變數。
以上介紹的作用範圍越來越小,request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)。
為了讓大家更容易理解application、session、request、page 4個物件的作用範圍,我們給出兩個程式來進行詳細說明。
application 作用域
如果把變數放到application裡,就說明它的作用域是application,它的有效範圍是整個應用。 整個應用是指從應用啟動,到應用結束。我們沒有說“從伺服器啟動,到伺服器關閉”,是因為一個伺服器可能部署多個應用,當然你關閉了伺服器,就會把上面所有的應用都關閉了。 application作用域裡的變數,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。
application作用域上的資訊傳遞是通過ServletContext實現的,它提供的主要方法如下所示:
Object getAttribute(String name) //從application中獲取資訊;
void setAttribute(String name, Object value) //向application作用域中設定資訊。
session作用域
session作用域比較容易理解,同一瀏覽器對伺服器進行多次訪問,在這多次訪問之間傳遞資訊,就是session作用域的體現。如果把變數放到session裡,就說明它的作用域是session,它的有效範圍是當前會話。所謂當前會話,就是指從使用者開啟瀏覽器開始,到使用者關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要使用者不關瀏覽器,伺服器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變數,就可以在當前會話的所有請求裡使用。
session是通過HttpSession介面實現的,它提供的主要方法如下所示:
Object HttpSession.getAttribute(String name) //從session中獲取資訊。
void HttpSession.setAttribute(String name, Object value)//向session中儲存資訊。
HttpSession HttpServletRequest.getSessio() //獲取當前請求所在的session的物件。
session的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能通過如下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。Tomcat的預設值為120分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設定:
void setMaxInactiveInterval(int interval)
如果想主動讓會話結束,例如使用者單擊“登出”按鈕的時候,可以使用 HttpSession 的 invalidate()方法,用於強制結束當前session:void invalidate()
request作用域
一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞資訊,但這個資訊在請求結束後就無效了。request裡的變數可以跨越forward前後的兩頁。但是隻要重新整理頁面,它們就重新計算了。如果把變數放到request裡,就說明它的作用域是request,它的有效範圍是當前請求週期。 所謂請求週期,就是指從http請求發起,到伺服器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裡你都可以使用這個變數。
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()方法即可實現資訊傳遞。
需要注意兩點:
1、轉發不是重定向,轉發是在Web應用內部進行的。
2、轉發對瀏覽器是透明的,也就是說,無論在伺服器上如何轉發,瀏覽器位址列中顯示的仍然是最初那個Servlet的地址。
page作用域
page物件的作用範圍僅限於使用者請求的當前頁面,對於page物件的引用將在響應返回給客戶端之後被釋放,或者在請求被轉發到其他地方後被釋放。page裡的變數只要頁面跳轉了,它們就不見了。如果把變數放到pageContext裡,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裡。從把變數放到pageContext開始,到jsp頁面結束,你都可以使用這個變數。
以上介紹的作用範圍越來越小,request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)。
為了讓大家更容易理解application、session、request、page 4個物件的作用範圍,我們給出兩個程式來進行詳細說明。
測試步驟以及結果分析:
1、直接執行程式1的結果為:(圖1)
我們看到,page的作用域的值為page02,說明確實只在當前的頁面起作用,即跳轉到的page2頁面;request的作用域在當前請求中有效,所以其值為程式1和跳轉到程式2之和;session的作用域為當前會話,所以其值也是程式1和跳轉到程式2之和;而application對所有應用有效,也就是隻要在應用,都要疊加,即程式1中的值與程式2中的值的疊加;
2、不要關閉程式1執行的瀏覽器,直接執行程式2,其結果為:(圖2)
對比圖1的結果,我們發現page作用域沒有變化,它的值只是程式2裡的值;request作用域僅在當前請求作用,故也以程式2的值為準,變成page02;session的作用域為當前會話,因為執行程式1的瀏覽器保持著,說明還處於同一會話中,所以要在之前的基礎上疊加上一個page02;而application對所有應用有效,也就是隻要在應用,都要疊加,即在之前的基礎上疊加上一個程式2的page02;
3、將上兩步執行程式1和程式2的瀏覽器關閉,但不關閉伺服器,重新執行程式2,其結果如下:
對比之前的結果,我們發現page作用域依舊沒有變化,它的值只是程式2即所在頁面裡的值;request作用域僅在當前請求作用,故也以程式2的值為準,變成page02;session的作用域為當前會話,因為前兩步執行程式的瀏覽器關閉了,說明之前的會話都結束了,所以其值恢復成當前的程式2裡的值page02;而application對所有應用有效,也就是隻要在應用即伺服器還沒重啟清空,都要疊加,即在之前的基礎上再疊加上一個程式2的page02;
九個內建物件
好了,相信現在大家已經對四個作用域有了一定的瞭解,下面我們來說一下九大內建物件。
內建物件一(out):
out 物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出資料時,可以對資料緩衝區進行操作,及時清除緩衝區中的殘餘資料,為其他的輸出讓出緩衝空間。待資料輸出完畢後,要及時關閉輸出流。其最常用的方法為print,可在頁面中顯示字串資訊。out的作用域為page:
<%out.print("Hello"); %>
內建物件二(request):
request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了客戶端的請求資訊,主要用於接受通過HTTP協議傳送到伺服器的資料。(包括頭資訊、系統資訊、請求方式以及請求引數等)。request物件的作用域為一次請求(也就是request作用域)。request的常用方法有getParameter(String name)根據表單元件名稱獲取頁面提交資料,getParameterValues(String name)獲取一組以相同名稱命名的表單元件提交的資料,setCharacterEncoding(String charset)在呼叫getParameter()方法前進行設定,用於解決中文亂碼,getRequestDispatcher(String path)返回一個javax.servlet.RequestDispatcher物件,該物件的forward()方法用於轉發請求:
<% Object obj = new Object(); request.getParameter("uname"); request.getParameterValues("rid"); request.setCharacterEncoding("UTF-8"); request.getRequestDispatcher("目標頁面").forward(request,response); %>
內建物件三(response):
response 代表的是對客戶端的響應,主要是將JSP容器處理過的物件傳回到客戶端。response物件也具有作用域,它只在JSP頁面內有效。response的常用方法有addCookie(Cookie cookie)向客戶端新增cookie,serContentType(String type)設定HTTP響應的contentType型別,setCharacterEncoding(String charset)設定響應所採用的字元編碼型別,sendRedirect(String location)將請求重新定位到一個新的地址上,這是位址列上的地址會改變:
<% response.addCookie(cokkie); response.setContentType("type"); response.setCharacterEncoding("utf-8"); response.sendRedirect("重新定位的頁面"); %>
內建物件四(session):
session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器為每個使用者都生成一個session物件,用於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存資料,因此儲存資料的格式為 “Key/value”。 session物件的value可以使用物件型別。session的常用方法有setAttribute(String key,Object value)以key/value的形式將物件儲存到session中,getAttribute(String key)通過key值獲取session中儲存的value,invalidate()強制session物件失效,getId()獲取sessionid,setMaxInactiveInterval(int interval)設定session的非活動時間,getMaxInactiveInterval()獲取session的有效非活動時間,removeAttribute(String key)刪除session中對應key的value值:
<% Object obj = new Object(); session.setAttribute("key",obj); session.getAttribute("key"); session.setMaxInactiveInterval(100); session.getMaxInactiveInterval(); session.getId(); session.removeAttribute("key"); session.invalidate(); %>
內建物件五(application):
application 物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用中都有效。與session物件相比,application物件生命週期更長,類似於系統的“全域性變數”。application常用方法有setAttribute(String key,Object value)以key/value的形式將物件儲存到application中,getAttribute(String key)通過key獲取application中儲存的物件,getRealPath(String path)返回相對路徑的真實路徑:
<% Object obj = new Object(); application.setAttribute("key",obj); application.getAttribute("key"); application.getRealPath("路徑名"); %>
內建物件六(pageContext):
pageContext 物件的作用是取得任何範圍的引數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext物件。pageContext的常用方法有getRequest()獲取request物件,getResponse()獲取response物件,getSession()獲得session物件,getOut()獲取out物件,setAttribute(String key,Object value)儲存屬性,getAttribute(String key)獲取屬性,include("url")請求指定的資源,並且將目標資源的響應結果包含在呼叫頁面的響應中:
<% Object obj = new Object(); pageContext.getRequest(); pageContext.getResponse(); pageContext.getSession(); pageContext.getOut(); pageContext.setAttribute("key",obj); pageContext.getAttribute("key"); pageContext.include("資源地址"); %>
內建物件七(page):
page 物件代表JSP本身,只有在JSP頁面內才是合法的。 page隱含物件本質上包含當前 Servlet介面引用的變數,類似於Java程式設計中的 this 指標。
內建物件八(config):
config 物件的主要作用是取得伺服器的配置資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過 config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中為應用程式環境中的Servlet程式和JSP頁面提供初始化引數。
內建物件九(exception):
exception 物件的作用是顯示異常資訊,只有在包含 isErrorPage="true" 的頁面中才可以被使用,在一般的JSP頁面中使用該物件將無法編譯JSP檔案。excepation物件和Java的所有物件一樣,都具有系統提供的繼承結構。exception 物件幾乎定義了所有異常情況。在Java程式中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 物件,並把 exception 物件傳送到在page指令中設定的錯誤頁面中,然後在錯誤頁面中處理相應的 exception 物件。
因為後三個物件很少在JSP頁面中使用,所以在這裡不過多介紹。