在這篇博文中,咱們將討論和學習JSP中的隱式對象及四個做用域。html
這些對象是JSP容器爲每一個頁面中的開發人員提供的Java對象,開發人員能夠直接調用它們而不用顯式地聲明它們再調用。 JSP隱式對象也稱爲預約義變量。java
下表列出了JSP支持的九個隱式對象 -程序員
request對象是javax.servlet.http.HttpServletRequest對象的一個實例。每當客戶端請求頁面時,JSP引擎將建立一個新對象來表示該請求。瀏覽器
request對象提供了獲取包括表單數據,Cookie,HTTP方法等HTTP頭信息的方法。緩存
response
對象是javax.servlet.http.HttpServletResponse
對象的一個實例。就像服務器建立request
對象同樣,它還建立一個對象來表示對客戶端的響應。服務器
response
對象還定義了處理建立新HTTP頭的接口。經過此對象,JSP程序員能夠添加新的Cookie或日期戳,HTTP狀態代碼等。session
out
隱式對象是javax.servlet.jsp.JspWriter
對象的一個實例,用於在響應中發送內容。app
初始化JspWriter
對象根據頁面是否緩存而不一樣地實例化。緩衝能夠經過使用page
指令的buffered ='false'
屬性來關閉。yii
JspWriter
對象包含與java.io.PrintWriter
類大部分相同的方法。可是,JspWriter
還有一些額外的方法用來處理緩衝。與PrintWriter
對象不一樣,JspWriter
會拋出IOExceptions
異常。jsp
session
對象是javax.servlet.http.HttpSession
的一個實例,其行爲與Java Servlet下的會話對象行爲徹底相同。session
對象用於跟蹤客戶端請求之間的客戶端會話。
application
對象是生成的Servlet
的ServletContext
對象的直接包裝,其實是javax.servlet.ServletContext
對象的一個實例。
application
對象是JSP頁面在其整個生命週期中的表示。 當JSP頁面被初始化時,將建立此對象,而且在JSP頁面被jspDestroy()
方法刪除時application
對象也將被刪除。
經過向application
對象添加屬性值,能夠確保組成Web應用程序的全部JSP文件均可以訪問它。
config
對象是javax.servlet.ServletConfig
的實例化,是生成的servlet的ServletConfig
對象周圍的直接包裝。
pageContext
對象是javax.servlet.jsp.PageContext
對象的一個實例。pageContext
對象用於表示整個JSP頁面。
page
對象是對該頁面實例的實際引用。能夠認爲它是表示整個JSP頁面的對象。
page
對象是this
對象的直接同義詞。
exception
對象是一個包含上一頁拋出的異常的包裝器。它一般用於生成對錯誤條件的適當響應。
所謂「做用域」就是「信息共享的範圍」,也就是說一個信息可以在多大的範圍內有效。JSP中九個內置對象及其相應所屬做用域以下表:
編號 | 對象 | 所屬做用域 | 做用域描述 |
1 | request | request | 在當前請求中有效 |
2 | response | page | 在當前頁面有效 |
3 | out | page | 在當前頁面有效 |
4 | session | session | 在當前會話中有效 |
5 | application | application | 在全部應用程序中有效 |
6 | config | page | 在當前頁面有效 |
7 | pageContext | page | 在當前頁面有效 |
8 | page | page | 在當前頁面有效 |
9 | Exception | page | 在當前頁面有效 |
由上圖可知,這九個內置對象都有相應的做用域,做用域在這裏的做用就是限定對象的生命週期。若是跳出了當前對象的做用域,該對象的信息就不能再被訪問。
讓咱們經過一個例子在理解上述過程
一、首先寫一個index.jsp頁面調用其中的request、session、application和pageContext這個四個內置對象,並分別給其設置num屬性值爲1。代碼以下:
1 <body> 2 <% 3 pageContext.setAttribute("num", 1); 4 session.setAttribute("num", 1); 5 request.setAttribute("num", 1); 6 application.setAttribute("num", 1); 7 //response.sendRedirect("http://localhost:8088/demo1012/first.jsp"); 8 %> 9 <table> 10 <tr> 11 <td>pageContext:</td> 12 <td><%=pageContext.getAttribute("num")%></td> 13 </tr> 14 <tr> 15 <td>session:</td> 16 <td><%=session.getAttribute("num")%></td> 17 </tr> 18 <tr> 19 <td>request:</td> 20 <td><%=request.getAttribute("num")%></td> 21 </tr> 22 <tr> 23 <td>application:</td> 24 <td><%=application.getAttribute("num")%></td> 25 </tr> 26 </table> 27 </body>
在瀏覽器請求index.jsp頁面顯示結果以下:
由結果可知,在index.jsp頁面中咱們能夠訪問四個對象的num屬性值。
二、咱們用<jsp:forward page="first.jsp"></jsp:forward>替換上面第7行代碼,從新請求index.jsp頁面。運行結果以下:
能夠看到沒法得到以前的那個pageContext對象的num屬性值,這主要是由於轉發請求到了first頁面,跳出了以前的pageContext對象的做用域,如今調用的pageContext對象是first.jsp頁面重建的一個。因此其num屬性值爲null。
三、咱們取消上述代碼中第7行的註釋,其中first.jsp頁面代碼就是上述代碼的table部分,咱們再從新請求index.jsp頁面。運行結果以下:
能夠看到沒法得到以前的那個pageContext和request的num屬性的值了,pageContext的緣由如上,而由於咱們對頁面重定向到了first.jsp,開始重瀏覽器到index.jsp的request鏈接結束了,因此如今得到的request是在index.jsp到first.jsp頁面創建的新request請求域下生成的request對象,因此其num屬性未初始化爲null。
四、咱們再從新使用其餘瀏覽器訪問first.jsp頁面,顯示的結果以下:
咱們知道當前會話,是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。由於此次咱們使用另外的瀏覽器對服務器發起請求,因此服務器爲此次用戶請求創建了新的會話,因此其num的屬性值爲null。另外由於只有index.jsp頁面對四個內置對象的num屬性進行了初始化,因此first.jsp頁面只有application對象還在其application做用域內。其值爲index.jsp頁面設置的1,其餘兩個屬性都爲null.
五、最後對於application做用域中的對象application,它的有效範圍是整個應用。整個應用是指從應用啓動,到應用結束。這裏並非說「從服務器啓動,到服務器關閉」,是由於一個服務器可能部署多個應用,固然你關閉了服務器,就會把上面全部的應用都關閉了。application做用域裏的變量,它們的存活時間是最長的,若是不進行手工刪除,它們就一直可使用。與上述三個不一樣的是,application裏的變量能夠被全部用戶共用。若是用戶甲的操做修改了application中的變量,用戶乙訪問時獲得的是修改後的值。這在其餘scope中都是不會發生的,page、 request和session都是徹底隔離的,不管如何修改都不會影響其餘人的數據。
一、最後你必定就能夠理解下面說法了
一、對於JSP九大內置對象和四個做用域的理解:http://www.blogjava.net/ourday/archive/2008/09/20/230107.html
二、JSP九大內置對象:http://www.yiibai.com/jsp/jsp_implicit_objects.html