每一個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,而後按照servlet的調用方式進行調用web
因爲JSP第一次訪問時會翻譯成servlet,因此第一次訪問一般會比較慢,但第二次訪問,JSP引擎若是發現JSP沒有變化,就再也不翻譯,而是直接調用,因此程序的執行效率不會受到影響緩存
JSP引擎在調用JSP對應的_jspServlet時,會傳遞或建立9個與web開發相關的對象供_jspServlet使用。JSP技術的 設計者爲便於開發人員在編寫JSP頁面時得到這些web對象的引用,特地定義了9個相應的變量,開發人員在JSP頁面中經過這些變量就能夠快速得到這9大 對象的引用session
這9個對象分別是哪些,以及做用也是筆試常常考察的知識點app
requestjsp
response學習
configurl
applicationspa
exception.net
session翻譯
page
out
pageContext
JSP九大隱式對象,其中七個已經在Servlet中講解過了,主要學習out與pageContext
out隱式對象用於向客戶端發送文本數據
out對象是經過調用pageContext對象的getOut方法返回的,其做用和用法與ServletResponse.getWriter方法返回的PrintWriter對象很是類似
JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter至關於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性能夠調整它的緩存大小,甚相當閉它的緩存
只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
<body><%out.write("hehe");response.getWriter().write("gaga");%></body>
設置page指令的buffer屬性關閉了out對象的緩存功能
out對象的緩衝區已滿
整個JSP頁面結束
上面的代碼運行後,會首先輸出gaga,而後再輸出hehe。這是由於,隱式對象的緩衝區的內容不會直接回寫到客戶端,並且會跟Response的緩衝區合併在一塊兒(添加到後面),一次回寫到客戶端。
在實際開發中,若是在JSP中須要顯示數據,使用隱式對象,不要使用Response輸出(JSP模版也存在這個問題)。
同時使用out和response.getWriter()輸出數據
demo:使用JSP實現文件的下載
pageContext對象是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境
這個對象不只封裝了對其它8大隱式對象的引用,它自身仍是一個域對象,能夠用來保存數據,而且還能夠經過pageContext操做其它三個域
使用pageContext能夠訪問別的三個域以及8大隱式對象,這種用法主要在自定義標籤技術中使用
經過pageContext對象,能夠直接將數據添加到別的三個域中,也能夠直接從三個域中獲取
使用 findAttribute
方法,直接查找各個域中是否有該屬性(EL表達式)
這個對象還封裝了web開發中常常涉及到的一些經常使用操做,例如引入和跳轉其它資源
pageContext類中定義了forward方法和include方法來分別簡化和替代RequestDispatcher.forward方法和include方法
方法接收的資源若是以「/」開頭, 「/」表明當前web應用