1. 程式人生 > >jsp九大 內建物件和四大作用域

jsp九大 內建物件和四大作用域

一、ServletContext 

 

    1、生命週期:當Web應用被載入進容器時建立代表整個web應用的ServletContext物件,當伺服器關閉或Web應用被移除時,ServletContext物件跟著銷燬。  

    2、作用範圍:整個Web應用。

    3、作用:   

      a)在不同Servlet 之間轉發    

        this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request, response);   

        方法執行結束,service就會返回到伺服器,再有伺服器去呼叫目標servlet,其中request會重新建立,並將之前的request的資料拷貝進去。      

      b)讀取資原始檔。

          1、由於相對路徑預設相對的是java虛擬機器啟動的目錄,所以我們直接寫相對路徑將會是相對於tomcat/bin目錄,所以是拿不到資源的。如果寫成絕對路徑,當專案釋出到其他環境時,絕對路徑就錯了。    

        2、為了解決這個問題ServletContext提供了:

            this.getServletContext().getRealPath("/1.properties"),給進一個資源的虛擬路徑,將會返回該資源在當前環境下的真實路徑。        

            this.getServletContext().getResourceAsStream("/1.properties"),給一個資源的虛擬路徑返回到該資源真實路徑的流。    

        3、當在非servlet下獲取資原始檔時,就沒有ServletContext物件用了,此時只能用類載入器     

            classLoader.getResourceAsStream("../../1.properties"),此方法利用類載入器直接將資源載入到記憶體中,有更新延遲的問題,以及如果檔案太大,佔用記憶體過大。     

            classLoader.getResource("../1.properties").getPath(),直接返回資源的真實路徑,沒有更新延遲的問題。

 

二、Request 域  

    1、生命週期:在service 方法呼叫前由伺服器建立,傳入service方法。整個請求結束,request生命結束。  

    2、作用範圍:整個請求鏈(請求轉發也存在)。  

    3、作用:  在整個請求鏈中共享資料。最常用到:在Servlet 中處理好的資料交給Jsp顯示,此時引數就可以放置在Request域中帶過去。

 

三、Session 域  

    HttpSession 在伺服器中,為瀏覽器建立獨一無二的記憶體空間,在其中儲存會話相關的資訊。  
    1、生命週期:在第一次呼叫 request.getSession() 方法時,伺服器會檢查是否已經有對應的session,如果沒有就在記憶體  中建立一個session並返回。   

            當一段時間內session沒有被使用(預設為30分鐘),則伺服器會銷燬該session。   

            如果伺服器非正常關閉(強行關閉),沒有到期的session也會跟著銷燬。   

            如果呼叫session提供的invalidate() ,可以立即銷燬session。   

      注意:伺服器正常關閉,再啟動,Session物件會進行鈍化和活化操作。同時如果伺服器鈍化的時間在session 預設銷燬時間之內,則活化後session還是存在的。否則Session不存在。  如果JavaBean 資料在session鈍化時,沒有實現Serializable 則當Session活化時,會消失。

    2、作用範圍:一次會話。  

 

 

四、PageContext 域

    1、生命週期:當對JSP的請求時開始,當響應結束時銷燬。  

    2、作用範圍:整個JSP頁面,是四大作用域中最小的一個。  

    作用:   

        (1)獲取其它八大隱式物件,可以認為是一個入口物件。   

        (2)獲取其所有域中的資料      

            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 中代表域的常量      

                PageContext.APPLICATION_SCOPE      

                PageContext.SESSION_SCOPE      

                PageContext.REQUEST_SCOPE      

                PageContext.PAGE_SCOPE            

              findAttribute方法,在四大域中搜尋屬性,搜尋的順序是page域、request域、session域、application域,從小域到大域開始搜尋,如果搜尋到就直接獲取該值,如果所有域中都找不到,返回一個null(與el表示式不同,此處返回null,對網頁是不友好的)         

        (3)跳轉到其他資源      其身上提供了forward和include方法,簡化重定向和轉發的操作

第一個作用域是page,他只在當前頁面有效,也就是使用者請求的頁面有效,噹噹前頁面關閉或轉到其他頁面時,page物件將在響應回饋給客戶端後釋放。

    第二個作用域是request,他在當前請求中有效,request可以通過setAttribute()方法實現頁面中的資訊傳遞,也可以通過forward()方法進行頁面間的跳轉,需要注意的是request是轉發不是重定向,轉發相對於瀏覽器來說是透明的,也就是無論頁面如何跳轉,位址列上顯示的依舊是最初的地址。

    第三個作用域是session,他在當前回話中有效。當一個臺電腦上的同一瀏覽器對伺服器進行多次訪問時,在這多次訪問之間傳遞的資訊就是session作用域的範圍。它從瀏覽器發出第一個HTTP請求即可認為會話開始,但是會話結束的時間是不確定的,因為在瀏覽器關閉時並不會通知伺服器,一般Tomcat設定的預設時間為120分鐘,也可以通過setMaxInactiveInterval(int)方法進行設定,或是通過invalidate()方法強制結束當前會話。

    第四個作用域是application,他在所有的應用程式中都有效,也就是當伺服器開始到伺服器結束這段時間,application作用域中儲存的資料都是有效的,同樣可以通過setAttribute賦值和getAttribute取值。

    好了,相信現在大家已經對四個作用域有了一定的瞭解,下面我們來說一下九大內建物件。

內建物件一(out):

    out 物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出資料時,可以對資料緩衝區進行操作,及時清除緩衝區中的殘餘資料,為其他的輸出讓出緩衝空間。待資料輸出完畢後,要及時關閉輸出流。其最常用的方法為print,可在頁面中顯示字串資訊。out的作用域為page:

<%out.print("Hello"); %>

 

內建物件二(request):

    request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了客戶端的請求資訊,主要用於接受通過HTTP協議傳送到伺服器的資料。(包括頭資訊、系統資訊、請求方式以及請求引數等)。request物件的作用域為一次請求(也就是request作用域)。request的常用方法有getParameter(String name)根據表單元件名稱獲取頁面提交資料,getParameterValues(String name)獲取一組以相同名稱命名的表單元件提交的資料,setCharacterEncoding(String charset)在呼叫getParameter()方法前進行設定,用於解決中文亂碼,getRequestDispatcher(String path)返回一個javax.servlet.RequestDispatcher物件,該物件的forward()方法用於轉發請求:

 <%
   Object obj = new Object();
       request.getParameter("uname");
       request.getParameterValues("rid");
       request.setCharacterEncoding("UTF-8");
       request.getRequestDispatcher("目標頁面").forward(request,response);
   %>


 

內建物件三(response):

    response 代表的是對客戶端的響應,主要是將JSP容器處理過的物件傳回到客戶端。response物件也具有作用域,它只在JSP頁面內有效。response的常用方法有addCookie(Cookie cookie)向客戶端新增cookie,serContentType(String type)設定HTTP響應的contentType型別,setCharacterEncoding(String charset)設定響應所採用的字元編碼型別,sendRedirect(String location)將請求重新定位到一個新的地址上,這是位址列上的地址會改變:

 <%
   response.addCookie(cokkie);
   response.setContentType("type");
   response.setCharacterEncoding("utf-8");
   response.sendRedirect("重新定位的頁面");
   %>


內建物件四(session):

    session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器為每個使用者都生成一個session物件,用於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存資料,因此儲存資料的格式為 “Key/value”。 session物件的value可以使用物件型別。session的常用方法有setAttribute(String key,Object value)以key/value的形式將物件儲存到session中,getAttribute(String key)通過key值獲取session中儲存的value,invalidate()強制session物件失效,getId()獲取sessionid,setMaxInactiveInterval(int interval)設定session的非活動時間,getMaxInactiveInterval()獲取session的有效非活動時間,removeAttribute(String key)刪除session中對應key的value值:

<%
   Object obj = new Object();
   session.setAttribute("key",obj);
   session.getAttribute("key");
   session.setMaxInactiveInterval(100);
   session.getMaxInactiveInterval();
   session.getId();
   session.removeAttribute("key");
   session.invalidate();
   %>


內建物件五(application):

    application 物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用中都有效。與session物件相比,application物件生命週期更長,類似於系統的“全域性變數”。application常用方法有setAttribute(String key,Object value)以key/value的形式將物件儲存到application中,getAttribute(String key)通過key獲取application中儲存的物件,getRealPath(String path)返回相對路徑的真實路徑:

  <%
   Object obj = new Object();
   application.setAttribute("key",obj);
   application.getAttribute("key");
   application.getRealPath("路徑名");
   %>


內建物件六(pageContext):

    pageContext 物件的作用是取得任何範圍的引數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext物件。pageContext的常用方法有getRequest()獲取request物件,getResponse()獲取response物件,getSession()獲得session物件,getOut()獲取out物件,setAttribute(String key,Object value)儲存屬性,getAttribute(String key)獲取屬性,include("url")請求指定的資源,並且將目標資源的響應結果包含在呼叫頁面的響應中:

 

<%
   Object obj = new Object();
   pageContext.getRequest();
   pageContext.getResponse();
   pageContext.getSession();
   pageContext.getOut();
   pageContext.setAttribute("key",obj);
   pageContext.getAttribute("key");
   pageContext.include("資源地址");
   %>

內建物件七(page):

    page 物件代表JSP本身,只有在JSP頁面內才是合法的。 page隱含物件本質上包含當前 Servlet介面引用的變數,類似於Java程式設計中的 this 指標。

內建物件八(config): 

    config 物件的主要作用是取得伺服器的配置資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過 config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中為應用程式環境中的Servlet程式和JSP頁面提供初始化引數。

內建物件九(exception):

    exception 物件的作用是顯示異常資訊,只有在包含 isErrorPage="true" 的頁面中才可以被使用,在一般的JSP頁面中使用該物件將無法編譯JSP檔案。excepation物件和Java的所有物件一樣,都具有系統提供的繼承結構。exception 物件幾乎定義了所有異常情況。在Java程式中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 物件,並把 exception 物件傳送到在page指令中設定的錯誤頁面中,然後在錯誤頁面中處理相應的 exception 物件。

    因為後三個物件很少在JSP頁面中使用,所以在這裡不過多介紹。