jsp內建對象:pageContext範圍對象的使用

來源:互聯網
上載者:User
JSP有哪些內建對象?它們的功能是什麼,本文提到了JSP的九大內建對象,其中對pageContext對象做了詳細的介紹,pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象(容器),可以用來儲存資料。通過pageContext還可以獲得其他對象,具體的使用看下文講解。

一、JSP運行原理

  每個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大對象的引用。

二、認識九個內建對象

NO. 內建對象 類型
1 pageContext javax.servlet.jsp.PageContext
2 request javax.servlet.http.HttpServletRequest
3 response javax.servlet.http.HttpServletResponse
4 session javax.servlet.http.HttpSession
5 application javax.servlet.ServletContext
6 config javax.servlet.ServletConfig
7 out javax.servlet.jsp.JspWriter
8 page java.lang.Object
9 exception java.lang.Throwable

  

  request,response,session,application,config這些對象在前面都已經作了詳細的介紹,這裡重點介紹一下剩下的pageContext對象,out對象,page對象。

三、內建對象使用說明

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屬性可以調整它的緩衝大小,甚至關閉它的緩衝。
  只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用ServletResponse.getWriter方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:

  • 設定page指令的buffer屬性關閉了out對象的緩衝功能

  • out對象的緩衝區已滿

  • 整個JSP頁面結束

out對象的工作原理圖

  

3.3、pageContext對象

  pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象(容器),可以用來儲存資料。並且,這個對象還封裝了web開發中經常涉及到的一些常用操作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。

3.4、通過pageContext獲得其他對象

  • getException方法返回exception隱式對象

  • getPage方法返回page隱式對象

  • getRequest方法返回request隱式對象

  • getResponse方法返回response隱式對象

  • getServletConfig方法返回config隱式對象

  • getServletContext方法返回application隱式對象

  • getSession方法返回session隱式對象

  • getOut方法返回out隱式對象

3.5、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大隱式對象(request,response,config,application,exception,Session,page,out)了,pageContext對象在jsp自訂標籤開發中特別重要。

3.6、pageContext作為域對象

  pageContext對象可以作為容器來使用,因此可以將一些資料存放區在pageContext對象中。

  pageContext對象的常用方法

       java.lang.Object findAttribute(java.lang.String name)

  重點介紹一下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。

範例:使用pageContext的findAttribute方法尋找屬性值

         pageContext的findAttribute方法尋找屬性值                                             pageContext.findAttribute方法尋找到的屬性值: pageContext對象的name1屬性: request對象的name2屬性: session對象的name3屬性: application對象的name4屬性: 尋找不存在的name5屬性:  使用EL運算式進行輸出: pageContext對象的name1屬性:${name1} request對象的name2屬性:${name2} session對象的name3屬性:${name3} application對象的name4屬性:${name4} 不存在的name5屬性:${name5}

運行結果:

  EL運算式語句在執行時,會調用pageContext.findAttribute方法,用標識符為關鍵字,分別從page、request、 session、application四個域中尋找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是Null 字元串)。

pageContext對象中封裝了訪問其它域的方法

  java.lang.Object getAttribute(java.lang.String name,   setAttribute(java.lang.String name, java.lang.Object value,   removeAttribute(java.lang.String name, scope)

代表各個域的常量

    PageContext.PAGE_SCOPE

範例:pageContext訪問其它域

         pageContext訪問其它域                                 取出存放在session對象中的屬性值: 第一種做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session對象中值 姓名: 第二種做法:使用session.getAttribute("attributeName");去取出session對象中值 姓名:  

3.7、PageContext引入和跳轉到其他資源

  PageContext類中定義了一個forward方法(用來跳轉頁面)和兩個include方法(用來引入頁面)來分別簡化和替代RequestDispatcher.forward方法和include方法。
  方法接收的資源如果以“/”開頭, “/”代表當前web應用。

範例:使用pageContext的forward方法跳轉到其他頁面

         使用pageContext的forward方法跳轉頁面

運行結果如下:

1 pageContext.forward("/pageContextDemo05.jsp");

  這種寫法是用來簡化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);這種寫法的。在實際開發中,使用pageContext.forward(relativeUrlPath)方法跳轉頁面用得不多,主要是因為要在Jsp頁面中嵌套java代碼,所以這種做法簡單瞭解一下即可,在開發中,要想從一個Jsp頁面採用伺服器端跳轉的方式跳轉到另一個Jsp頁面,那麼一般會使用<jsp:forward>標籤,<jsp:forward>標籤用於把請求轉寄給另外一個資源。

範例:使用pageContext的include方法引入資源

        使用pageContext的include方法引入資源

運行結果:

   在實際開發中,使用pageContext的include方法引入頁面這種做法也很少用,一般都使用jsp:include標籤引入資源,因此這種做法瞭解一下即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.