1. 程式人生 > >JavaWeb學習總結(十三)JSP中的九個內建物件

JavaWeb學習總結(十三)JSP中的九個內建物件

一、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頁面結束

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物件的常用方法

1 public void setAttribute(java.lang.String name,java.lang.Object value) 
2 public java.lang.Object getAttribute(java.lang.String name) 
3 public void removeAttribute(java.lang.String name) 
4 public 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方法查詢屬性值

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
    <title>pageContext的findAttribute方法查詢屬性值</title>
</head>
<%
    pageContext.setAttribute("name1", "1111");
    request.setAttribute("name2", "2222");
    session.setAttribute("name3", "3333");
    application.setAttribute("name4", "4444");
%>
<%
    //使用pageContext的findAttribute方法查詢屬性,由於取得的值為Object型別,因此必須使用String強制向下轉型,轉換成String型別
    //查詢name1屬性,按照順序"page→request→session→application"在這四個物件中去查詢
    String refName1 = (String)pageContext.findAttribute("name1");
    String refName2 = (String)pageContext.findAttribute("name2");
    String refName3 = (String)pageContext.findAttribute("name3");
    String refName4 = (String)pageContext.findAttribute("name4");
    String refName5 = (String)pageContext.findAttribute("name5");//查詢一個不存在的屬性
%>
<h1>pageContext.findAttribute方法查詢到的屬性值:</h1>
<h3>pageContext物件的name1屬性:<%=refName1%></h3>
<h3>request物件的name2屬性:<%=refName2%></h3>
<h3>session物件的name3屬性:<%=refName3%></h3>
<h3>application物件的name4屬性:<%=refName4%></h3>
<h3>查詢不存在的name5屬性:<%=refName5%></h3>
<hr/>
<h1>使用EL表示式進行輸出:</h1>
<h3>pageContext物件的name1屬性:${name1}</h3>
<h3>request物件的name2屬性:${name2}</h3>
<h3>session物件的name3屬性:${name3}</h3>
<h3>application物件的name4屬性:${name4}</h3>
<h3>不存在的name5屬性:${name5}</h3>

EL表示式語句在執行時,會呼叫pageContext.findAttribute方法,用識別符號為關鍵字,分別從page、request、 session、application四個域中查詢相應的物件,找到則返回相應物件,找不到則返回”” (注意,不是null,而是空字串)。

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 

範例:pageContext訪問其它域

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
    <title>pageContext訪問其它域</title>
</head>
<%
    //此時相當於往session物件中存放了一個name屬性,等價於 session.setAttribute("name","1111");
    pageContext.setAttribute("name","1111",PageContext.SESSION_SCOPE);
%>
<%
    //取得session物件的屬性,使用pageContext物件獲取
    String refName1 = (String)pageContext.getAttribute("name",PageContext.SESSION_SCOPE);  
    //由於取得的值為Object型別,因此必須使用String強制向下轉型,轉換成String型別
     String refName2 = (String)session.getAttribute("name");  
%>
<h1>取出存放在session物件中的屬性值:</h1>
<p>第一種做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session物件中值</p>
<h3>姓名:<%=refName1%></h3>
<p>第二種做法:使用session.getAttribute("attributeName");去取出session物件中值</p>
<h3>姓名:<%=refName2%></h3>

執行結果:

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

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

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

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
    <title>使用pageContext的forward方法跳轉頁面</title>
</head>
<%
    //使用pageContext的forward方法跳轉到pageContextDemo05.jsp頁面,/代表了當前的web應用
    pageContext.forward("/myjsp.jsp");
    //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
    //使用RequestDispatcher的forward方法實現的跳轉方式
    //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
%>

執行結果:

轉自:https://www.cnblogs.com/xdp-gacl/p/3779872.html