Jsp 9大內置對象

1、JSP運行原理

  每一個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,而後按照servlet的調用方式進行調用。 java

  因爲JSP第一次訪問時會翻譯成servlet,因此第一次訪問一般會比較慢,但第二次訪問,JSP引擎若是發現JSP沒有變化,就再也不翻譯,而是直接調用,因此程序的執行效率不會受到影響。 web

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

2、9大內置對象

這裏寫圖片描述

三 、內置對象說明

3.1 page

    page對象表示當前一個JSP頁面,能夠理解爲一個對象自己,即:把一個JSP看成一個對象來看待。page對象在開發中幾乎不用,瞭解一下便可。瀏覽器

3.2 out

    out對象用於向客戶端發送文本數據。 緩存

    out對象是經過調用pageContext對象的getOut方法返回的,其做用和用法與ServletResponse.getWriter方法返回的PrintWriter對象很是類似。 服務器

    JSP頁面中的out對象的類型爲JspWriter,JspWriter至關於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性能夠調整它的緩存大小,甚相當閉它的緩存。session


    只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:app

  • 設置page指令的buffer屬性關閉了out對象的緩存功能jsp

  • out對象的緩衝區已滿spa

  • 整個JSP頁面結束

out對象的工做原理圖:

這裏寫圖片描述

3.3 pageContext

    pageContext對象是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境,這個對象不只封裝了對其它8大隱式對象的引用,它自身仍是一個域對象(容器),能夠用來保存數據。而且,這個對象還封裝了web開發中常常涉及到的一些經常使用操做,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。

3.3.1 經過pageContext獲取其餘隱式對象
  • getException方法返回exception隱式對象

  • getPage方法返回page隱式對象

  • getRequest方法返回request隱式對象

  • getResponse方法返回response隱式對象

  • getServletConfig方法返回config隱式對象

  • getServletContext方法返回application隱式對象

  • getSession方法返回session隱式對象

  • getOut方法返回out隱式對象

3.3.2 pageContext封裝其它8大內置對象的意義

    若是在編程過程當中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將能夠獲取8大隱式對象,此時這個java對象就能夠和瀏覽器交互了,此時這個java對象就成爲了一個動態web資源了,這就是pageContext封裝其它8大內置對象的意義,把pageContext傳遞給誰,誰就能成爲一個動態web資源,那麼什麼狀況下須要把pageContext傳遞給另一個java類呢,什麼狀況下須要使用這種技術呢?


    在比較正規的開發中,jsp頁面是不容許出現java代碼的,若是jsp頁面出現了java代碼,那麼就應該想辦法把java代碼移除掉,咱們能夠開發一個自定義標籤來移除jsp頁面上的java代碼,首先圍繞自定義標籤寫一個java類,jsp引擎在執行自定義標籤的時候就會調用圍繞自定義標籤寫的那個java類,在調用java類的時候就會把pageContext對象傳遞給這個java類,因爲pageContext對象封裝了對其它8大隱式對象的引用,所以在這個java類中就可使用jsp頁面中的8大隱式對象

注:pageContext對象在jsp自定義標籤開發中特別重要。

3.3.3 pageContext的findAttribute()方法

    findAttribute()方法,這個方法是用來查找各個域中的屬性的,查看這個方法的API能夠看到關於這個方法的描述: 

  Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

    當要查找某個屬性時,findAttribute方法按照查找順序」page→request→session→application「在這四個對象中去查找,只要找到了就返回屬性值,若是四個對象都沒有找到要查找的屬性,則返回一個null。

注:EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、 session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回」」 (注意,不是null,而是空字符串)。

3.3.4 pageContext封裝了訪問其餘域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)

表明各個域的常量:

  • PageContext.APPLICATION_SCOPE

  • PageContext.SESSION_SCOPE

  • PageContext.REQUEST_SCOPE

  • PageContext.PAGE_SCOPE

3.3.5 pageContext引入(include)和跳轉(forward)其餘資源

    PageContext類中定義了一個forward方法(用來跳轉頁面)和兩個include方法(用來引入頁面)來分別簡化和替代RequestDispatcher.forward方法和include方法。 

    方法接收的資源若是以「/」開頭, 「/」表明當前web應用。

    

    這種寫法是用來簡化和替代pageContext.getRequest().getRequestDispatcher("/*.jsp").forward(request, response);這種寫法的。

    在實際開發中,使用pageContext.forward(relativeUrlPath)方法跳轉頁面用得很少,主要是由於要在Jsp頁面中嵌套java代碼,因此這種作法簡單瞭解一下便可,在開發中,要想從一個Jsp頁面採用服務器端跳轉的方式跳轉到另外一個Jsp頁面,那麼通常會使用<jsp:forward>標籤,<jsp:forward>標籤用於把請求轉發給另一個資源。

相關文章
相關標籤/搜索