Jsp中內置的九大隱式對象

Jsp中內置的九大隱式對象

1、每個JSP頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet),然後按照servlet的調用方式進行調用。由於JSP第一次訪問時會翻譯成servlet,所以第一次訪問通常會比較慢,但第二次訪問,JSP引擎如果發現JSP沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會受到影響。

JSP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者爲便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變量,開發人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用。

在這裏插入圖片描述

注:

  1. Exception不是每個頁面都有,要設置isErrorPage=”true”後,才能在頁面中使用。
  2. 其中JspWriter和PageContext是抽象類,其他的對象類型都是接口。pageContext對象用於在Servlet中獲取其他對象。

3)JspWriter和pageContext都屬於javax.servlet.jsp包中,沒有需要自己加載,JspWriter extends java.io.。

2、JAVAWEB的四大域對象

四個域對象分別爲PageContext ,request,session,servletContext,範圍從小到大。

一、ServletContext
1、生命週期:當Web應用被加載進容器時創建代表整個web應用的ServletContext對象,當服務器關閉或Web應用被移除時,ServletContext對象跟着銷燬。
2、作用範圍:整個Web應用。
3、作用:
a) 在不同Servlet 之間轉發
this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request,response);
方法執行結束,service就會返回到服務器,再有服務器去調用目標servlet,其中request會重新創建,並將之前的request的數據拷貝進去。
b) 讀取資源文件。
1、由於相對路徑默認相對的是java虛擬機啓動的目錄,所以我們直接寫相對路徑將會是相對於tomcat/bin目錄,所以是拿不到資源的。
如果寫成絕對路徑,當項目發佈到其他環境時,絕對路徑就錯了。
2、爲了解決這個問題ServletContext提供了:
this.getServletContext().getRealPath(“/1.properties”),給進一個資源的虛擬路徑,將會返回該資源在當前環境下的真實路徑。
this.getServletContext().getResourceAsStream(“/1.properties”),給一個資源的虛擬路徑返回到該資源真實路徑的流。
3、當在非servlet下獲取資源文件時,就沒有ServletContext對象用了,此時只能用類加載器
classLoader.getResourceAsStream(“…/…/1.properties”),此方法利用類加載器直接將資源加載到內存中,有更新延遲的問題,
以及如果文件太大,佔用內存過大。
classLoader.getResource(“…/1.properties”).getPath(),直接返回資源的真實路徑,沒有更新延遲的問題。

二、Request 域
1、生命週期:在service 方法調用前由服務器創建,傳入service方法。整個請求結束,request生命結束。
2、作用範圍:整個請求鏈(請求轉發也存在)。
3、作用: 在整個請求鏈中共享數據。最常用到:在Servlet 中處理好的數據交給Jsp顯示,此時參數就可以放置在Request域中帶過去。

三、Session 域
HttpSession 在服務器中,爲瀏覽器創建獨一無二的內存空間,在其中保存會話相關的信息。
1、生命週期:在第一次調用 request.getSession() 方法時,服務器會檢查是否已經有對應的session,如果沒有就在內存中創建一個session並返回。
當一段時間內session沒有被使用(默認爲30分鐘),則服務器會銷燬該session。
如果服務器非正常關閉(強行關閉),沒有到期的session也會跟着銷燬。
如果調用session提供的invalidate(),可以立即銷燬session。
注意:服務器正常關閉,再啓動,Session對象會進行鈍化和活化操作。同時如果服務器鈍化的時間在session 默認銷燬時間之內,則活化後session還是存在的。否則Session不存在。如果JavaBean 數據在session鈍化時,沒有實現Serializable 則當Session活化時,會消失。
2、作用範圍:一次會話。

四、PageContext 域
1、生命週期:當對JSP的請求時開始,當響應結束時銷燬。
2、作用範圍:整個JSP頁面,是四大作用域中最小的一個,即超過這個頁面就不能夠使用了。(所以使用pageContext對象向其它頁面傳遞參數是不可能的.)
作用:
(1)獲取其它八大隱式對象,可以認爲是一個入口對象。
(2)獲取其所有域中的數據
pageContext 操作所有域中屬性的方法
public java.lang.Object getAttribute(java.lang.String name,intscope)
public void setAttribute(java.lang.String name, java.lang.Objectvalue,int scope)
public void removeAttribute(java.lang.String name,int scope)
pageContext 中代表域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法,在四大域中搜尋屬性,搜尋的順序是page域、request域、session域、application域,
從小域到大域開始搜索,如果搜索到就直接獲取該值,如果所有域中都找不到,返回一個null(與el表達式不同,此處返回null,對網頁是不友好的)
(3)跳轉到其他資源,其身上提供了forward和include方法,簡化重定向和轉發的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章