JSP引擎在調用JSP對應的jspServlet時,會傳遞或建立9個與web開發相關的對象供jspServlet使用。JSP技術的設計者爲便於開發人員在編寫JSP頁面時得到這些web對象的引用,特地定義了9個相應的變量,開發人員在JSP頁面中經過這些變量就能夠快速得到這9大對象的引用html
細心的朋友會發現,咱們沒有在JSP頁面上定義過out對象,卻能夠直接使用!其實out對象就是JSP內置對象之一。java
九個內置對象:web
out對象的API瀏覽器
void clear()緩存
out對象用於向瀏覽器輸出數據,與之對應的是Servlet的PrintWriter對象。然而這個out對象的類型並非PrintWriter,是JspWriter服務器
咱們能夠簡單理解爲:JspWriter就是帶緩存的PrintWrieter。markdown
out對象的原理以下:session
只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:app
通常咱們在JSP頁面輸出都是用表達式(<%=%>),因此out對象用得並非不少!jsp
注意:在page指令配置以下信息,session將不可以使用
<%@page session="false" %>
**內置對象exception是java.lang.Exception類的對象,exception封裝了JSP頁面拋出的異常信息。**exception常常被用來處理錯誤頁面
前面咱們已經講過了怎麼設置錯誤頁面了,下面咱們就來簡單使用一下exception對象吧
1.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %> <html> <head> <title></title> </head> <body> <%--模擬空指針異常的錯誤--%> <% String sss = null; sss.length(); %> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> <html> <head> <title>錯誤頁面</title> </head> <body> <% out.println("程序拋出了異常:" + exception); %> </body> </html>
pageContext是內置對象中最重要的一個對象,它表明着JSP頁面編譯後的內容(也就是JSP頁面的運行環境)!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>獲取八大內置對象</title> </head> <body> <% System.out.println(pageContext.getSession()); System.out.println(pageContext.getRequest()); System.out.println(pageContext.getResponse()); System.out.println(pageContext.getException()); System.out.println(pageContext.getPage()); System.out.println(pageContext.getServletConfig()); System.out.println(pageContext.getServletContext()); System.out.println(pageContext.getOut()); %> </body> </html>
相似於request,session,ServletContext做爲域對象而言都有如下三個方法:
固然了,pageContext也不例外,pageContext也有這三個方法!
pageContext本質上表明的是當前JSP頁面編譯後的內容,做爲域對象而言,它就表明着當前JSP頁面(也就是page)!也就是說:pageContext域對象只在page範圍內有效,超出了page範圍就無效了!
首先來看看在page範圍內能不能使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>使用page域對象</title> </head> <body> <% pageContext.setAttribute("name", "zhongfucheng"); %> <% String value = (String) pageContext.getAttribute("name"); System.out.println(value); %> </body> </html>
咱們如今來試驗一下是否是超出了page範圍就無效了!
在2.jsp中request域對象設置屬性
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>request域對象設置屬性</title> </head> <body> <% //這是request域對象保存的內容 request.setAttribute("name","zhongfucheng"); %> <%--跳轉到1.jsp中--%> <jsp:forward page="1.jsp"/> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>在page域對象獲取屬性</title> </head> <body> <% //企圖獲取request域對象存進的屬性 String value = (String) pageContext.getAttribute("name"); System.out.println(value); %> </body> </html>
pageContext本質上表明着編譯後JSP的內容,pageContext還能夠封裝了訪問其餘域的方法!
上面的pageContext默認是page範圍的,但pageContext對象重載了set、get、removeAttribute這三個方法
多了一個設置域範圍的一個參數,若是不指定默認就是page。固然了,pageContext把request、session、application、page這幾個域對象封裝着了靜態變量供咱們使用。
剛纔咱們沒有使用重載方法的時候,使用pageContext是沒法獲取到request域對象設置的屬性的。如今咱們使用重載後的方法看一下能不能獲取獲得!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>在page域對象獲取request域對象的屬性</title> </head> <body> <% //使用重載的方法獲取request域對象的屬性 String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE); System.out.println(value); %> </body> </html>
pageContexst還有這麼一個方法:
該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。這個是EL表達式的原理!,EL表達式後面會講到!
咱們用此方法看能不能查找出request域對象的屬性吧!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>使用findAttribute</title> </head> <body> <% //使用findAttribute查找2.jsp中request域對象的屬性 String value = (String) pageContext.findAttribute("name"); System.out.println(value); %> </body> </html>
PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。
到目前爲止,咱們已經學了4種屬性範圍了。